diff --git a/pdfminer/__init__.py b/pdfminer/__init__.py index 4244f11..a2f2971 100644 --- a/pdfminer/__init__.py +++ b/pdfminer/__init__.py @@ -1,4 +1,5 @@ #!/usr/bin/env python __version__ = '20131022' -if __name__ == '__main__': print __version__ +if __name__ == '__main__': + print __version__ diff --git a/pdfminer/arcfour.py b/pdfminer/arcfour.py index 0675ee9..7adcf60 100644 --- a/pdfminer/arcfour.py +++ b/pdfminer/arcfour.py @@ -6,6 +6,7 @@ This code is in the public domain. """ + ## Arcfour ## class Arcfour(object): diff --git a/pdfminer/ascii85.py b/pdfminer/ascii85.py index a78d2bf..80df0ba 100644 --- a/pdfminer/ascii85.py +++ b/pdfminer/ascii85.py @@ -9,6 +9,7 @@ This code is in the public domain. import re import struct + # ascii85decode(data) def ascii85decode(data): """ @@ -16,13 +17,13 @@ def ascii85decode(data): letters, using 85 different types of characters (as 256**4 < 85**5). When the length of the original bytes is not a multiple of 4, a special rule is used for round up. - + The Adobe's ASCII85 implementation is slightly different from its original in handling the last characters. - + The sample string is taken from: http://en.wikipedia.org/w/index.php?title=Ascii85 - + >>> ascii85decode('9jqo^BlbD-BleB1DJ+*+F(f,q') 'Man is distinguished' >>> ascii85decode('E,9)oF*2M7/c~>') @@ -35,7 +36,7 @@ def ascii85decode(data): n += 1 b = b*85+(ord(c)-33) if n == 5: - out += struct.pack('>L',b) + out += struct.pack('>L', b) n = b = 0 elif c == 'z': assert n == 0 @@ -44,13 +45,15 @@ def ascii85decode(data): if n: for _ in range(5-n): b = b*85+84 - out += struct.pack('>L',b)[:n-1] + out += struct.pack('>L', b)[:n-1] break return out # asciihexdecode(data) hex_re = re.compile(r'([a-f\d]{2})', re.IGNORECASE) trail_re = re.compile(r'^(?:[a-f\d]{2}|\s)*([a-f\d])[\s>]*$', re.IGNORECASE) + + def asciihexdecode(data): """ ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1 @@ -60,7 +63,7 @@ def asciihexdecode(data): EOD. Any other characters will cause an error. If the filter encounters the EOD marker after reading an odd number of hexadecimal digits, it will behave as if a 0 followed the last digit. - + >>> asciihexdecode('61 62 2e6364 65') 'ab.cde' >>> asciihexdecode('61 62 2e6364 657>') diff --git a/pdfminer/ccitt.py b/pdfminer/ccitt.py index 9ce08b2..5c7f695 100644 --- a/pdfminer/ccitt.py +++ b/pdfminer/ccitt.py @@ -29,7 +29,7 @@ class BitParser(object): for i in xrange(len(bits)): if 0 < i: if p[b] is None: - p[b] = [None,None] + p[b] = [None, None] p = p[b] if bits[i] == '1': b = 1 @@ -41,7 +41,7 @@ class BitParser(object): def feedbytes(self, data): for c in data: b = ord(c) - for m in (128,64,32,16,8,4,2,1): + for m in (128, 64, 32, 16, 8, 4, 2, 1): self._parse_bit(b & m) return @@ -62,7 +62,7 @@ class BitParser(object): ## class CCITTG4Parser(BitParser): - MODE = [None,None] + MODE = [None, None] BitParser.add(MODE, 0, '1') BitParser.add(MODE, +1, '011') BitParser.add(MODE, -1, '010') @@ -82,7 +82,7 @@ class CCITTG4Parser(BitParser): BitParser.add(MODE, 'x7', '0000001110') BitParser.add(MODE, 'e', '000000000001000000000001') - WHITE = [None,None] + WHITE = [None, None] BitParser.add(WHITE, 0 , '00110101') BitParser.add(WHITE, 1 , '000111') BitParser.add(WHITE, 2 , '0111') @@ -188,7 +188,7 @@ class CCITTG4Parser(BitParser): BitParser.add(WHITE, 2496, '000000011110') BitParser.add(WHITE, 2560, '000000011111') - BLACK = [None,None] + BLACK = [None, None] BitParser.add(BLACK, 0 , '0000110111') BitParser.add(BLACK, 1 , '010') BitParser.add(BLACK, 2 , '11') @@ -294,25 +294,30 @@ class CCITTG4Parser(BitParser): BitParser.add(BLACK, 2496, '000000011110') BitParser.add(BLACK, 2560, '000000011111') - UNCOMPRESSED = [None,None] - BitParser.add(UNCOMPRESSED, '1' , '1') - BitParser.add(UNCOMPRESSED, '01' , '01') - BitParser.add(UNCOMPRESSED, '001' , '001') - BitParser.add(UNCOMPRESSED, '0001' , '0001') - BitParser.add(UNCOMPRESSED, '00001' , '00001') - BitParser.add(UNCOMPRESSED, '00000' , '000001') - BitParser.add(UNCOMPRESSED, 'T00' , '00000011') - BitParser.add(UNCOMPRESSED, 'T10' , '00000010') - BitParser.add(UNCOMPRESSED, 'T000' , '000000011') - BitParser.add(UNCOMPRESSED, 'T100' , '000000010') - BitParser.add(UNCOMPRESSED, 'T0000' , '0000000011') - BitParser.add(UNCOMPRESSED, 'T1000' , '0000000010') - BitParser.add(UNCOMPRESSED, 'T00000' , '00000000011') - BitParser.add(UNCOMPRESSED, 'T10000' , '00000000010') - - class EOFB(Exception): pass - class InvalidData(Exception): pass - class ByteSkip(Exception): pass + UNCOMPRESSED = [None, None] + BitParser.add(UNCOMPRESSED, '1', '1') + BitParser.add(UNCOMPRESSED, '01', '01') + BitParser.add(UNCOMPRESSED, '001', '001') + BitParser.add(UNCOMPRESSED, '0001', '0001') + BitParser.add(UNCOMPRESSED, '00001', '00001') + BitParser.add(UNCOMPRESSED, '00000', '000001') + BitParser.add(UNCOMPRESSED, 'T00', '00000011') + BitParser.add(UNCOMPRESSED, 'T10', '00000010') + BitParser.add(UNCOMPRESSED, 'T000', '000000011') + BitParser.add(UNCOMPRESSED, 'T100', '000000010') + BitParser.add(UNCOMPRESSED, 'T0000', '0000000011') + BitParser.add(UNCOMPRESSED, 'T1000', '0000000010') + BitParser.add(UNCOMPRESSED, 'T00000', '00000000011') + BitParser.add(UNCOMPRESSED, 'T10000', '00000000010') + + class EOFB(Exception): + pass + + class InvalidData(Exception): + pass + + class ByteSkip(Exception): + pass def __init__(self, width, bytealign=False): BitParser.__init__(self) @@ -325,7 +330,7 @@ class CCITTG4Parser(BitParser): for c in data: b = ord(c) try: - for m in (128,64,32,16,8,4,2,1): + for m in (128, 64, 32, 16, 8, 4, 2, 1): self._parse_bit(b & m) except self.ByteSkip: self._accept = self._parse_mode @@ -359,7 +364,8 @@ class CCITTG4Parser(BitParser): raise self.InvalidData(mode) def _parse_horiz1(self, n): - if n is None: raise self.InvalidData + if n is None: + raise self.InvalidData self._n1 += n if n < 64: self._n2 = 0 @@ -371,7 +377,8 @@ class CCITTG4Parser(BitParser): return self.BLACK def _parse_horiz2(self, n): - if n is None: raise self.InvalidData + if n is None: + raise self.InvalidData self._n2 += n if n < 64: self._color = 1-self._color @@ -385,9 +392,10 @@ class CCITTG4Parser(BitParser): return self.BLACK def _parse_uncompressed(self, bits): - if not bits: raise self.InvalidData + if not bits: + raise self.InvalidData if bits.startswith('T'): - self._accept = self._parse_mode + self._accept = self._parse_mode self._color = int(bits[1]) self._do_uncompressed(bits[2:]) return self.MODE @@ -396,17 +404,17 @@ class CCITTG4Parser(BitParser): return self.UNCOMPRESSED def _get_bits(self): - return ''.join( str(b) for b in self._curline[:self._curpos] ) + return ''.join(str(b) for b in self._curline[:self._curpos]) def _get_refline(self, i): if i < 0: - return '[]'+''.join( str(b) for b in self._refline ) + return '[]'+''.join(str(b) for b in self._refline) elif len(self._refline) <= i: - return ''.join( str(b) for b in self._refline )+'[]' + return ''.join(str(b) for b in self._refline)+'[]' else: - return (''.join( str(b) for b in self._refline[:i] )+ - '['+str(self._refline[i])+']'+ - ''.join( str(b) for b in self._refline[i+1:] )) + return (''.join(str(b) for b in self._refline[:i]) + + '['+str(self._refline[i])+']' + + ''.join(str(b) for b in self._refline[i+1:])) def reset(self): self._y = 0 @@ -417,16 +425,16 @@ class CCITTG4Parser(BitParser): return def output_line(self, y, bits): - print y, ''.join( str(b) for b in bits ) + print y, ''.join(str(b) for b in bits) return - + def _reset_line(self): self._refline = self._curline self._curline = array.array('b', [1]*self.width) self._curpos = -1 self._color = 1 return - + def _flush_line(self): if self.width <= self._curpos: self.output_line(self._y, self._curline) @@ -442,12 +450,13 @@ class CCITTG4Parser(BitParser): x1 = self._curpos+1 while 1: if x1 == 0: - if (self._color == 1 and - self._refline[x1] != self._color): break + if (self._color == 1 and self._refline[x1] != self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] == self._color and - self._refline[x1] != self._color): break + self._refline[x1] != self._color): + break x1 += 1 x1 += dx x0 = max(0, self._curpos) @@ -461,50 +470,54 @@ class CCITTG4Parser(BitParser): self._curpos = x1 self._color = 1-self._color return - + def _do_pass(self): #print '* pass: curpos=%r, color=%r' % (self._curpos, self._color) #print ' refline:', self._get_refline(self._curpos+1) x1 = self._curpos+1 while 1: if x1 == 0: - if (self._color == 1 and - self._refline[x1] != self._color): break + if (self._color == 1 and self._refline[x1] != self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] == self._color and - self._refline[x1] != self._color): break + self._refline[x1] != self._color): + break x1 += 1 while 1: if x1 == 0: - if (self._color == 0 and - self._refline[x1] == self._color): break + if (self._color == 0 and self._refline[x1] == self._color): + break elif x1 == len(self._refline): break elif (self._refline[x1-1] != self._color and - self._refline[x1] == self._color): break + self._refline[x1] == self._color): + break x1 += 1 for x in xrange(self._curpos, x1): self._curline[x] = self._color self._curpos = x1 return - + def _do_horizontal(self, n1, n2): #print '* horizontal(%d,%d): curpos=%r, color=%r' % (n1, n2, self._curpos, self._color) if self._curpos < 0: self._curpos = 0 x = self._curpos for _ in xrange(n1): - if len(self._curline) <= x: break + if len(self._curline) <= x: + break self._curline[x] = self._color x += 1 for _ in xrange(n2): - if len(self._curline) <= x: break + if len(self._curline) <= x: + break self._curline[x] = 1-self._color x += 1 self._curpos = x return - + def _do_uncompressed(self, bits): #print '* uncompressed(%r): curpos=%r' % (bits, self._curpos) for c in bits: @@ -513,15 +526,16 @@ class CCITTG4Parser(BitParser): self._flush_line() return +import unittest + ## Test cases ## -import unittest class TestCCITTG4Parser(unittest.TestCase): def get_parser(self, bits): parser = CCITTG4Parser(len(bits)) - parser._curline = [ int(c) for c in bits ] + parser._curline = [int(c) for c in bits] parser._reset_line() return parser @@ -656,7 +670,7 @@ class TestCCITTG4Parser(unittest.TestCase): parser._do_vertical(-1) parser._do_vertical(-1) parser._do_vertical(1) - parser._do_horizontal(1,1) + parser._do_horizontal(1, 1) self.assertEqual(parser._get_bits(), '011101') return @@ -673,23 +687,23 @@ class TestCCITTG4Parser(unittest.TestCase): ## CCITTFaxDecoder ## class CCITTFaxDecoder(CCITTG4Parser): - + def __init__(self, width, bytealign=False, reversed=False): CCITTG4Parser.__init__(self, width, bytealign=bytealign) self.reversed = reversed self._buf = '' return - + def close(self): return self._buf - + def output_line(self, y, bits): bytes = array.array('B', [0]*((len(bits)+7)/8)) if self.reversed: - bits = [ 1-b for b in bits ] - for (i,b) in enumerate(bits): + bits = [1-b for b in bits] + for (i, b) in enumerate(bits): if b: - bytes[i/8] += (128,64,32,16,8,4,2,1)[i%8] + bytes[i/8] += (128, 64, 32, 16, 8, 4, 2, 1)[i % 8] self._buf += bytes.tostring() return @@ -705,35 +719,39 @@ def ccittfaxdecode(data, params): raise ValueError(K) parser.feedbytes(data) return parser.close() - - + + # test def main(argv): import pygame if not argv[1:]: return unittest.main() + class Parser(CCITTG4Parser): def __init__(self, width, bytealign=False): CCITTG4Parser.__init__(self, width, bytealign=bytealign) - self.img = pygame.Surface((self.width,1000)) + self.img = pygame.Surface((self.width, 1000)) return + def output_line(self, y, bits): - for (x,b) in enumerate(bits): + for (x, b) in enumerate(bits): if b: - self.img.set_at((x,y), (255,255,255)) + self.img.set_at((x, y), (255, 255, 255)) else: - self.img.set_at((x,y), (0,0,0)) + self.img.set_at((x, y), (0, 0, 0)) return + def close(self): pygame.image.save(self.img, 'out.bmp') return for path in argv[1:]: - fp = file(path,'rb') - (_,_,k,w,h,_) = path.split('.') + fp = file(path, 'rb') + (_, _, k, w, h, _) = path.split('.') parser = Parser(int(w)) parser.feedbytes(fp.read()) parser.close() fp.close() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/cmapdb.py b/pdfminer/cmapdb.py index 5945cf5..b18df98 100644 --- a/pdfminer/cmapdb.py +++ b/pdfminer/cmapdb.py @@ -25,7 +25,8 @@ from encodingdb import name2unicode from utils import choplist, nunpack -class CMapError(Exception): pass +class CMapError(Exception): + pass ## CMap @@ -43,8 +44,9 @@ class CMap(object): def use_cmap(self, cmap): assert isinstance(cmap, CMap) + def copy(dst, src): - for (k,v) in src.iteritems(): + for (k, v) in src.iteritems(): if isinstance(v, dict): d = {} dst[k] = d @@ -73,14 +75,14 @@ class CMap(object): if code2cid is None: code2cid = self.code2cid code = () - for (k,v) in sorted(code2cid.iteritems()): + for (k, v) in sorted(code2cid.iteritems()): c = code+(k,) if isinstance(v, int): - out.write('code %r = cid %d\n' % (c,v)) + out.write('code %r = cid %d\n' % (c, v)) else: self.dump(out=out, code2cid=v, code=c) return - + ## IdentityCMap ## @@ -99,8 +101,7 @@ class IdentityCMap(object): return struct.unpack('>%dH' % n, code) else: return () - - + ## UnicodeMap ## @@ -118,8 +119,8 @@ class UnicodeMap(object): return self.cid2unichr[cid] def dump(self, out=sys.stdout): - for (k,v) in sorted(self.cid2unichr.iteritems()): - out.write('cid %d = unicode %r\n' % (k,v)) + for (k, v) in sorted(self.cid2unichr.iteritems()): + out.write('cid %d = unicode %r\n' % (k, v)) return @@ -152,7 +153,7 @@ class FileCMap(CMap): else: t = {} d[c] = t - d =t + d = t c = ord(code[-1]) d[c] = cid return @@ -161,7 +162,7 @@ class FileCMap(CMap): ## FileUnicodeMap ## class FileUnicodeMap(UnicodeMap): - + def __init__(self): UnicodeMap.__init__(self) self.attrs = {} @@ -204,12 +205,12 @@ class PyCMap(CMap): def is_vertical(self): return self._is_vertical - + ## PyUnicodeMap ## class PyUnicodeMap(UnicodeMap): - + def __init__(self, name, module, vertical): if vertical: cid2unichr = module.CID2UNICHR_V @@ -230,18 +231,17 @@ class CMapDB(object): debug = 0 _cmap_cache = {} _umap_cache = {} - - class CMapNotFound(CMapError): pass + + class CMapNotFound(CMapError): + pass @classmethod def _load_data(klass, name): filename = '%s.pickle.gz' % name if klass.debug: print >>sys.stderr, 'loading:', name - cmap_paths = ( - os.environ.get('CMAP_PATH', '/usr/share/pdfminer/'), - os.path.join(os.path.dirname(__file__), 'cmap'), - ) + cmap_paths = (os.environ.get('CMAP_PATH', '/usr/share/pdfminer/'), + os.path.join(os.path.dirname(__file__), 'cmap'),) for directory in cmap_paths: path = os.path.join(directory, filename) if os.path.exists(path): @@ -305,11 +305,12 @@ class CMapParser(PSStackParser): elif name == 'endcmap': self._in_cmap = False return - if not self._in_cmap: return + if not self._in_cmap: + return # if name == 'def': try: - ((_,k),(_,v)) = self.pop(2) + ((_, k), (_, v)) = self.pop(2) self.cmap.set_attr(literal_name(k), v) except PSSyntaxError: pass @@ -317,7 +318,7 @@ class CMapParser(PSStackParser): if name == 'usecmap': try: - ((_,cmapname),) = self.pop(1) + ((_, cmapname),) = self.pop(1) self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname))) except PSSyntaxError: pass @@ -336,13 +337,15 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endcidrange': - objs = [ obj for (_,obj) in self.popall() ] - for (s,e,cid) in choplist(3, objs): + objs = [obj for (__, obj) in self.popall()] + for (s, e, cid) in choplist(3, objs): if (not isinstance(s, str) or not isinstance(e, str) or - not isinstance(cid, int) or len(s) != len(e)): continue + not isinstance(cid, int) or len(s) != len(e)): + continue sprefix = s[:-4] eprefix = e[:-4] - if sprefix != eprefix: continue + if sprefix != eprefix: + continue svar = s[-4:] evar = e[-4:] s1 = nunpack(svar) @@ -350,7 +353,7 @@ class CMapParser(PSStackParser): vlen = len(svar) #assert s1 <= e1 for i in xrange(e1-s1+1): - x = sprefix+struct.pack('>L',s1+i)[-vlen:] + x = sprefix+struct.pack('>L', s1+i)[-vlen:] self.cmap.add_code2cid(x, cid+i) return @@ -358,8 +361,8 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endcidchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): if isinstance(code, str) and isinstance(cid, str): self.cmap.add_code2cid(code, nunpack(cid)) return @@ -368,10 +371,11 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endbfrange': - objs = [ obj for (_,obj) in self.popall() ] - for (s,e,code) in choplist(3, objs): + objs = [obj for (__, obj) in self.popall()] + for (s, e, code) in choplist(3, objs): if (not isinstance(s, str) or not isinstance(e, str) or - len(s) != len(e)): continue + len(s) != len(e)): + continue s1 = nunpack(s) e1 = nunpack(e) #assert s1 <= e1 @@ -384,7 +388,7 @@ class CMapParser(PSStackParser): prefix = code[:-4] vlen = len(var) for i in xrange(e1-s1+1): - x = prefix+struct.pack('>L',base+i)[-vlen:] + x = prefix+struct.pack('>L', base+i)[-vlen:] self.cmap.add_cid2unichr(s1+i, x) return @@ -392,8 +396,8 @@ class CMapParser(PSStackParser): self.popall() return if name == 'endbfchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): if isinstance(cid, str) and isinstance(code, str): self.cmap.add_cid2unichr(nunpack(cid), code) return @@ -408,6 +412,7 @@ class CMapParser(PSStackParser): self.push((pos, token)) return + # test def main(argv): args = argv[1:] @@ -420,4 +425,5 @@ def main(argv): cmap.dump() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/converter.py b/pdfminer/converter.py index 3788d5a..e0d487c 100644 --- a/pdfminer/converter.py +++ b/pdfminer/converter.py @@ -21,9 +21,9 @@ class PDFLayoutAnalyzer(PDFTextDevice): return def begin_page(self, page, ctm): - (x0,y0,x1,y1) = page.mediabox - (x0,y0) = apply_matrix_pt(ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(ctm, (x1,y1)) + (x0, y0, x1, y1) = page.mediabox + (x0, y0) = apply_matrix_pt(ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(ctm, (x1, y1)) mediabox = (0, 0, abs(x0-x1), abs(y0-y1)) self.cur_item = LTPage(self.pageno, mediabox) return @@ -61,26 +61,26 @@ class PDFLayoutAnalyzer(PDFTextDevice): shape = ''.join(x[0] for x in path) if shape == 'ml': # horizontal/vertical line - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) if x0 == x1 or y0 == y1: - self.cur_item.add(LTLine(gstate.linewidth, (x0,y0), (x1,y1))) + self.cur_item.add(LTLine(gstate.linewidth, (x0, y0), (x1, y1))) return if shape == 'mlllh': # rectangle - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (_,x2,y2) = path[2] - (_,x3,y3) = path[3] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) - (x2,y2) = apply_matrix_pt(self.ctm, (x2,y2)) - (x3,y3) = apply_matrix_pt(self.ctm, (x3,y3)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (_, x2, y2) = path[2] + (_, x3, y3) = path[3] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) + (x2, y2) = apply_matrix_pt(self.ctm, (x2, y2)) + (x3, y3) = apply_matrix_pt(self.ctm, (x3, y3)) if ((x0 == x1 and y1 == y2 and x2 == x3 and y3 == y0) or (y0 == y1 and x1 == x2 and y2 == y3 and x3 == x0)): - self.cur_item.add(LTRect(gstate.linewidth, (x0,y0,x2,y2))) + self.cur_item.add(LTRect(gstate.linewidth, (x0, y0, x2, y2))) return # other shapes pts = [] @@ -119,7 +119,7 @@ class PDFPageAggregator(PDFLayoutAnalyzer): PDFLayoutAnalyzer.__init__(self, rsrcmgr, pageno=pageno, laparams=laparams) self.result = None return - + def receive_layout(self, ltpage): self.result = ltpage return @@ -137,7 +137,7 @@ class PDFConverter(PDFLayoutAnalyzer): self.outfp = outfp self.codec = codec return - + ## TextConverter ## @@ -176,10 +176,11 @@ class TextConverter(PDFConverter): # is text. This stops all the image and drawing ouput from being # recorded and taking up RAM. def render_image(self, name, stream): - if self.imagewriter is None: return + if self.imagewriter is None: + return PDFConverter.render_image(self, name, stream) return - + def paint_path(self, gstate, stroke, fill, evenodd, path): return @@ -196,18 +197,18 @@ class HTMLConverter(PDFConverter): 'textgroup': 'red', 'curve': 'black', 'page': 'gray', - } - + } + TEXT_COLORS = { 'textbox': 'blue', 'char': 'black', - } + } - def __init__(self, rsrcmgr, outfp, codec='utf-8', pageno=1, laparams=None, + def __init__(self, rsrcmgr, outfp, codec='utf-8', pageno=1, laparams=None, scale=1, fontscale=1.0, layoutmode='normal', showpageno=True, pagemargin=50, imagewriter=None, - rect_colors={'curve':'black', 'page':'gray'}, - text_colors={'char':'black'}): + rect_colors={'curve': 'black', 'page': 'gray'}, + text_colors={'char': 'black'}): PDFConverter.__init__(self, rsrcmgr, outfp, codec=codec, pageno=pageno, laparams=laparams) self.scale = scale self.fontscale = fontscale @@ -238,7 +239,7 @@ class HTMLConverter(PDFConverter): def write_footer(self): self.write('
Page: %s
\n' % - ', '.join('%s' % (i,i) for i in xrange(1,self.pageno))) + ', '.join('%s' % (i, i) for i in xrange(1, self.pageno))) self.write('\n') return @@ -295,7 +296,7 @@ class HTMLConverter(PDFConverter): self._font = self._fontstack.pop() self.write('') return - + def put_text(self, text, fontname, fontsize): font = (fontname, fontsize) if font != self._font: @@ -318,6 +319,7 @@ class HTMLConverter(PDFConverter): for child in item: show_group(child) return + def render(item): if isinstance(item, LTPage): self._yoffset += item.y1 @@ -399,7 +401,7 @@ class XMLConverter(PDFConverter): def write_footer(self): self.outfp.write('\n') return - + def write_text(self, text): self.outfp.write(enc(text, self.codec)) return @@ -415,6 +417,7 @@ class XMLConverter(PDFConverter): show_group(child) self.outfp.write('\n') return + def render(item): if isinstance(item, LTPage): self.outfp.write('\n' % diff --git a/pdfminer/encodingdb.py b/pdfminer/encodingdb.py index 9ee3bc8..61a161e 100644 --- a/pdfminer/encodingdb.py +++ b/pdfminer/encodingdb.py @@ -6,15 +6,18 @@ from glyphlist import glyphname2unicode from latin_enc import ENCODING +STRIP_NAME = re.compile(r'[0-9]+') + + ## name2unicode ## -STRIP_NAME = re.compile(r'[0-9]+') def name2unicode(name): """Converts Adobe glyph names to Unicode numbers.""" if name in glyphname2unicode: return glyphname2unicode[name] m = STRIP_NAME.search(name) - if not m: raise KeyError(name) + if not m: + raise KeyError(name) return unichr(int(m.group(0))) @@ -26,19 +29,23 @@ class EncodingDB(object): mac2unicode = {} win2unicode = {} pdf2unicode = {} - for (name,std,mac,win,pdf) in ENCODING: + for (name, std, mac, win, pdf) in ENCODING: c = name2unicode(name) - if std: std2unicode[std] = c - if mac: mac2unicode[mac] = c - if win: win2unicode[win] = c - if pdf: pdf2unicode[pdf] = c + if std: + std2unicode[std] = c + if mac: + mac2unicode[mac] = c + if win: + win2unicode[win] = c + if pdf: + pdf2unicode[pdf] = c encodings = { - 'StandardEncoding': std2unicode, - 'MacRomanEncoding': mac2unicode, - 'WinAnsiEncoding': win2unicode, - 'PDFDocEncoding': pdf2unicode, - } + 'StandardEncoding': std2unicode, + 'MacRomanEncoding': mac2unicode, + 'WinAnsiEncoding': win2unicode, + 'PDFDocEncoding': pdf2unicode, + } @classmethod def get_encoding(klass, name, diff=None): diff --git a/pdfminer/fontmetrics.py b/pdfminer/fontmetrics.py index def2178..bf0be75 100644 --- a/pdfminer/fontmetrics.py +++ b/pdfminer/fontmetrics.py @@ -8,7 +8,7 @@ written with a proportional font. The following data were extracted from the AFM files: http://www.ctan.org/tex-archive/fonts/adobe/afm/ - + """ ### BEGIN Verbatim copy of the license part diff --git a/pdfminer/image.py b/pdfminer/image.py index c656729..8ffed29 100644 --- a/pdfminer/image.py +++ b/pdfminer/image.py @@ -5,9 +5,11 @@ import os, os.path from pdftypes import LITERALS_DCT_DECODE from pdfcolor import LITERAL_DEVICE_GRAY, LITERAL_DEVICE_RGB, LITERAL_DEVICE_CMYK + def align32(x): return ((x+3)/4)*4 + ## BMPWriter ## class BMPWriter(object): @@ -36,12 +38,12 @@ class BMPWriter(object): self.fp.write(info) if ncols == 2: # B&W color table - for i in (0,255): - self.fp.write(struct.pack('BBBx', i,i,i)) + for i in (0, 255): + self.fp.write(struct.pack('BBBx', i, i, i)) elif ncols == 256: # grayscale color table for i in xrange(256): - self.fp.write(struct.pack('BBBx', i,i,i)) + self.fp.write(struct.pack('BBBx', i, i, i)) self.pos0 = self.fp.tell() self.pos1 = self.pos0 + self.datasize return @@ -68,7 +70,7 @@ class ImageWriter(object): (width, height) = image.srcsize if len(filters) == 1 and filters[0] in LITERALS_DCT_DECODE: ext = '.jpg' - elif (image.bits == 1 or + elif (image.bits == 1 or image.bits == 8 and image.colorspace in (LITERAL_DEVICE_RGB, LITERAL_DEVICE_GRAY)): ext = '.%dx%d.bmp' % (width, height) else: @@ -82,7 +84,7 @@ class ImageWriter(object): from PIL import Image from PIL import ImageChops ifp = cStringIO.StringIO(raw_data) - i = Image.open(ifp) + i = Image.open(ifp) i = ImageChops.invert(i) i = i.convert('RGB') i.save(fp, 'JPEG') diff --git a/pdfminer/layout.py b/pdfminer/layout.py index 5cb4262..d9a108c 100644 --- a/pdfminer/layout.py +++ b/pdfminer/layout.py @@ -81,7 +81,7 @@ class LTComponent(LTItem): return ('<%s %s>' % (self.__class__.__name__, bbox2str(self.bbox))) - def set_bbox(self, (x0,y0,x1,y1)): + def set_bbox(self, (x0, y0, x1, y1)): self.x0 = x0 self.y0 = y0 self.x1 = x1 @@ -93,7 +93,7 @@ class LTComponent(LTItem): def is_empty(self): return self.width <= 0 or self.height <= 0 - + def is_hoverlap(self, obj): assert isinstance(obj, LTComponent) return obj.x0 <= self.x1 and self.x0 <= obj.x1 @@ -142,7 +142,7 @@ class LTCurve(LTComponent): return def get_pts(self): - return ','.join( '%.3f,%.3f' % p for p in self.pts ) + return ','.join('%.3f,%.3f' % p for p in self.pts) ## LTLine @@ -158,8 +158,8 @@ class LTLine(LTCurve): ## class LTRect(LTCurve): - def __init__(self, linewidth, (x0,y0,x1,y1)): - LTCurve.__init__(self, linewidth, [(x0,y0), (x1,y0), (x1,y1), (x0,y1)]) + def __init__(self, linewidth, (x0, y0, x1, y1)): + LTCurve.__init__(self, linewidth, [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]) return @@ -212,7 +212,7 @@ class LTChar(LTComponent, LTText): if font.is_vertical(): # vertical width = font.get_width() * fontsize - (vx,vy) = textdisp + (vx, vy) = textdisp if vx is None: vx = width/2 else: @@ -229,15 +229,15 @@ class LTChar(LTComponent, LTText): ty = descent + rise bll = (0, ty) bur = (self.adv, ty+height) - (a,b,c,d,e,f) = self.matrix + (a, b, c, d, e, f) = self.matrix self.upright = (0 < a*d*scaling and b*c <= 0) - (x0,y0) = apply_matrix_pt(self.matrix, bll) - (x1,y1) = apply_matrix_pt(self.matrix, bur) + (x0, y0) = apply_matrix_pt(self.matrix, bll) + (x1, y1) = apply_matrix_pt(self.matrix, bur) if x1 < x0: - (x0,x1) = (x1,x0) + (x0, x1) = (x1, x0) if y1 < y0: - (y0,y1) = (y1,y0) - LTComponent.__init__(self, (x0,y0,x1,y1)) + (y0, y1) = (y1, y0) + LTComponent.__init__(self, (x0, y0, x1, y1)) if font.is_vertical(): self.size = self.width else: @@ -246,7 +246,7 @@ class LTChar(LTComponent, LTText): def __repr__(self): return ('<%s %s matrix=%s font=%r adv=%s text=%r>' % - (self.__class__.__name__, bbox2str(self.bbox), + (self.__class__.__name__, bbox2str(self.bbox), matrix2str(self.matrix), self.fontname, self.adv, self.get_text())) @@ -257,7 +257,7 @@ class LTChar(LTComponent, LTText): """Returns True if two characters can coexist in the same line.""" return True - + ## LTContainer ## class LTContainer(LTComponent): @@ -286,14 +286,14 @@ class LTContainer(LTComponent): for obj in self._objs: obj.analyze(laparams) return - + ## LTExpandableContainer ## class LTExpandableContainer(LTContainer): def __init__(self): - LTContainer.__init__(self, (+INF,+INF,-INF,-INF)) + LTContainer.__init__(self, (+INF, +INF, -INF, -INF)) return def add(self, obj): @@ -313,8 +313,8 @@ class LTTextContainer(LTExpandableContainer, LTText): return def get_text(self): - return ''.join( obj.get_text() for obj in self if isinstance(obj, LTText) ) - + return ''.join(obj.get_text() for obj in self if isinstance(obj, LTText)) + ## LTTextLine ## @@ -338,6 +338,7 @@ class LTTextLine(LTTextContainer): def find_neighbors(self, plane, ratio): raise NotImplementedError + class LTTextLineHorizontal(LTTextLine): def __init__(self, word_margin): @@ -357,12 +358,13 @@ class LTTextLineHorizontal(LTTextLine): def find_neighbors(self, plane, ratio): d = ratio*self.height objs = plane.find((self.x0, self.y0-d, self.x1, self.y1+d)) - return [ obj for obj in objs - if (isinstance(obj, LTTextLineHorizontal) and - abs(obj.height-self.height) < d and - (abs(obj.x0-self.x0) < d or - abs(obj.x1-self.x1) < d)) ] - + return [obj for obj in objs + if (isinstance(obj, LTTextLineHorizontal) and + abs(obj.height-self.height) < d and + (abs(obj.x0-self.x0) < d or + abs(obj.x1-self.x1) < d))] + + class LTTextLineVertical(LTTextLine): def __init__(self, word_margin): @@ -378,16 +380,16 @@ class LTTextLineVertical(LTTextLine): self._y0 = obj.y0 LTTextLine.add(self, obj) return - + def find_neighbors(self, plane, ratio): d = ratio*self.width objs = plane.find((self.x0-d, self.y0, self.x1+d, self.y1)) - return [ obj for obj in objs - if (isinstance(obj, LTTextLineVertical) and - abs(obj.width-self.width) < d and - (abs(obj.y0-self.y0) < d or - abs(obj.y1-self.y1) < d)) ] - + return [obj for obj in objs + if (isinstance(obj, LTTextLineVertical) and + abs(obj.width-self.width) < d and + (abs(obj.y0-self.y0) < d or + abs(obj.y1-self.y1) < d))] + ## LTTextBox ## @@ -406,8 +408,9 @@ class LTTextBox(LTTextContainer): (self.__class__.__name__, self.index, bbox2str(self.bbox), self.get_text())) + class LTTextBoxHorizontal(LTTextBox): - + def analyze(self, laparams): LTTextBox.analyze(self, laparams) self._objs = csort(self._objs, key=lambda obj: -obj.y1) @@ -416,6 +419,7 @@ class LTTextBoxHorizontal(LTTextBox): def get_writing_mode(self): return 'lr-tb' + class LTTextBoxVertical(LTTextBox): def analyze(self, laparams): @@ -436,8 +440,9 @@ class LTTextGroup(LTTextContainer): self.extend(objs) return + class LTTextGroupLRTB(LTTextGroup): - + def analyze(self, laparams): LTTextGroup.analyze(self, laparams) # reorder the objects from top-left to bottom-right. @@ -446,14 +451,15 @@ class LTTextGroupLRTB(LTTextGroup): (1+laparams.boxes_flow)*(obj.y0+obj.y1)) return + class LTTextGroupTBRL(LTTextGroup): - + def analyze(self, laparams): LTTextGroup.analyze(self, laparams) # reorder the objects from top-right to bottom-left. self._objs = csort(self._objs, key=lambda obj: -(1+laparams.boxes_flow)*(obj.x0+obj.x1) - -(1-laparams.boxes_flow)*(obj.y1)) + - (1-laparams.boxes_flow)*(obj.y1)) return @@ -465,14 +471,14 @@ class LTLayoutContainer(LTContainer): LTContainer.__init__(self, bbox) self.groups = None return - + def get_textlines(self, laparams, objs): obj0 = None line = None for obj1 in objs: if obj0 is not None: k = 0 - if (obj0.is_compatible(obj1) and obj0.is_voverlap(obj1) and + if (obj0.is_compatible(obj1) and obj0.is_voverlap(obj1) and min(obj0.height, obj1.height) * laparams.line_overlap < obj0.voverlap(obj1) and obj0.hdistance(obj1) < max(obj0.width, obj1.width) * laparams.char_margin): # obj0 and obj1 is horizontally aligned: @@ -487,7 +493,7 @@ class LTLayoutContainer(LTContainer): # (char_margin) k |= 1 if (laparams.detect_vertical and - obj0.is_compatible(obj1) and obj0.is_hoverlap(obj1) and + obj0.is_compatible(obj1) and obj0.is_hoverlap(obj1) and min(obj0.width, obj1.width) * laparams.line_overlap < obj0.hoverlap(obj1) and obj0.vdistance(obj1) < max(obj0.height, obj1.height) * laparams.char_margin): # obj0 and obj1 is vertically aligned: @@ -505,8 +511,8 @@ class LTLayoutContainer(LTContainer): # |<-->| # (line_overlap) k |= 2 - if ( (k & 1 and isinstance(line, LTTextLineHorizontal)) or - (k & 2 and isinstance(line, LTTextLineVertical)) ): + if ((k & 1 and isinstance(line, LTTextLineHorizontal)) or + (k & 2 and isinstance(line, LTTextLineVertical))): line.add(obj1) elif line is not None: yield line @@ -554,7 +560,8 @@ class LTLayoutContainer(LTContainer): done = set() for line in lines: box = boxes[line] - if box in done: continue + if box in done: + continue done.add(box) if not box.is_empty(): yield box @@ -562,32 +569,34 @@ class LTLayoutContainer(LTContainer): def group_textboxes(self, laparams, boxes): assert boxes + def dist(obj1, obj2): """A distance function between two TextBoxes. - + Consider the bounding rectangle for obj1 and obj2. - Return its area less the areas of obj1 and obj2, + Return its area less the areas of obj1 and obj2, shown as 'www' below. This value may be negative. - +------+..........+ (x1,y1) + +------+..........+ (x1, y1) | obj1 |wwwwwwwwww: +------+www+------+ :wwwwwwwwww| obj2 | - (x0,y0) +..........+------+ + (x0, y0) +..........+------+ """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) return ((x1-x0)*(y1-y0) - obj1.width*obj1.height - obj2.width*obj2.height) + def isany(obj1, obj2): """Check if there's any other object between obj1 and obj2. """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) - objs = set(plane.find((x0,y0,x1,y1))) - return objs.difference((obj1,obj2)) + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) + objs = set(plane.find((x0, y0, x1, y1))) + return objs.difference((obj1, obj2)) # XXX this still takes O(n^2) :( dists = [] for i in xrange(len(boxes)): @@ -599,49 +608,50 @@ class LTLayoutContainer(LTContainer): plane = Plane(self.bbox) plane.extend(boxes) while dists: - (c,d,obj1,obj2) = dists.pop(0) + (c, d, obj1, obj2) = dists.pop(0) if c == 0 and isany(obj1, obj2): - dists.append((1,d,obj1,obj2)) + dists.append((1, d, obj1, obj2)) continue if (isinstance(obj1, LTTextBoxVertical) or isinstance(obj1, LTTextGroupTBRL) or isinstance(obj2, LTTextBoxVertical) or isinstance(obj2, LTTextGroupTBRL)): - group = LTTextGroupTBRL([obj1,obj2]) + group = LTTextGroupTBRL([obj1, obj2]) else: - group = LTTextGroupLRTB([obj1,obj2]) + group = LTTextGroupLRTB([obj1, obj2]) plane.remove(obj1) plane.remove(obj2) # this line is optimized -- don't change without profiling - dists = [ n for n in dists if n[2] in plane._objs and n[3] in plane._objs ] + dists = [n for n in dists if n[2] in plane._objs and n[3] in plane._objs] for other in plane: - dists.append((0, dist(group,other), group, other)) + dists.append((0, dist(group, other), group, other)) dists.sort() plane.add(group) assert len(plane) == 1 return list(plane) - + def analyze(self, laparams): # textobjs is a list of LTChar objects, i.e. # it has all the individual characters in the page. (textobjs, otherobjs) = fsplit(lambda obj: isinstance(obj, LTChar), self._objs) for obj in otherobjs: obj.analyze(laparams) - if not textobjs: return + if not textobjs: + return textlines = list(self.get_textlines(laparams, textobjs)) - assert len(textobjs) <= sum( len(line._objs) for line in textlines ) + assert len(textobjs) <= sum(len(line._objs) for line in textlines) (empties, textlines) = fsplit(lambda obj: obj.is_empty(), textlines) for obj in empties: obj.analyze(laparams) textboxes = list(self.get_textboxes(laparams, textlines)) - assert len(textlines) == sum( len(box._objs) for box in textboxes ) + assert len(textlines) == sum(len(box._objs) for box in textboxes) if textboxes: self.groups = self.group_textboxes(laparams, textboxes) assigner = IndexAssigner() for group in self.groups: group.analyze(laparams) assigner.run(group) - textboxes.sort(key=lambda box:box.index) + textboxes.sort(key=lambda box: box.index) self._objs = textboxes + otherobjs + empties return @@ -653,9 +663,9 @@ class LTFigure(LTLayoutContainer): def __init__(self, name, bbox, matrix): self.name = name self.matrix = matrix - (x,y,w,h) = bbox - bbox = get_bound( apply_matrix_pt(matrix, (p,q)) - for (p,q) in ((x,y), (x+w,y), (x,y+h), (x+w,y+h)) ) + (x, y, w, h) = bbox + bbox = get_bound(apply_matrix_pt(matrix, (p, q)) + for (p, q) in ((x, y), (x+w, y), (x, y+h), (x+w, y+h))) LTLayoutContainer.__init__(self, bbox) return @@ -665,9 +675,10 @@ class LTFigure(LTLayoutContainer): bbox2str(self.bbox), matrix2str(self.matrix))) def analyze(self, laparams): - if not laparams.all_texts: return + if not laparams.all_texts: + return LTLayoutContainer.analyze(self, laparams) - return + return ## LTPage diff --git a/pdfminer/lzw.py b/pdfminer/lzw.py index 56c86e3..29e1795 100644 --- a/pdfminer/lzw.py +++ b/pdfminer/lzw.py @@ -34,17 +34,18 @@ class LZWDecoder(object): # |-----8-bits-----| # |-bpos-|-bits-| | # | |----r----| - v = (v<>(r-bits)) & ((1<> (r-bits)) & ((1 << bits)-1)) self.bpos += bits break else: # |-----8-bits-----| # |-bpos-|---bits----... # | |----r----| - v = (v<' % (enc(tag.name), s)) self._stack.append(tag) return diff --git a/pdfminer/pdfdocument.py b/pdfminer/pdfdocument.py index fc41a55..9192262 100644 --- a/pdfminer/pdfdocument.py +++ b/pdfminer/pdfdocument.py @@ -23,11 +23,24 @@ from utils import decode_text ## Exceptions ## -class PDFNoValidXRef(PDFSyntaxError): pass -class PDFNoOutlines(PDFException): pass -class PDFDestinationNotFound(PDFException): pass -class PDFEncryptionError(PDFException): pass -class PDFPasswordIncorrect(PDFEncryptionError): pass +class PDFNoValidXRef(PDFSyntaxError): + pass + + +class PDFNoOutlines(PDFException): + pass + + +class PDFDestinationNotFound(PDFException): + pass + + +class PDFEncryptionError(PDFException): + pass + + +class PDFPasswordIncorrect(PDFEncryptionError): + pass # some predefined literals and keywords. LITERAL_OBJSTM = LIT('ObjStm') @@ -68,7 +81,8 @@ class PDFXRef(PDFBaseXRef): while 1: try: (pos, line) = parser.nextline() - if not line.strip(): continue + if not line.strip(): + continue except PSEOF: raise PDFNoValidXRef('Unexpected EOF - file corrupted?') if not line: @@ -92,7 +106,8 @@ class PDFXRef(PDFBaseXRef): if len(f) != 3: raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) (pos, genno, use) = f - if use != 'n': continue + if use != 'n': + continue self.offsets[objid] = (None, long(pos), int(genno)) if 1 <= debug: print >>sys.stderr, 'xref objects:', self.offsets @@ -100,16 +115,17 @@ class PDFXRef(PDFBaseXRef): return KEYWORD_TRAILER = KWD('trailer') + def load_trailer(self, parser): try: - (_,kwd) = parser.nexttoken() + (_, kwd) = parser.nexttoken() assert kwd is self.KEYWORD_TRAILER - (_,dic) = parser.nextobject() + (_, dic) = parser.nextobject() except PSEOF: x = parser.pop(1) if not x: raise PDFNoValidXRef('Unexpected EOF - file corrupted') - (_,dic) = x[0] + (_, dic) = x[0] self.trailer.update(dict_value(dic)) return @@ -134,6 +150,7 @@ class PDFXRefFallback(PDFXRef): return '' % (self.offsets.keys()) PDFOBJ_CUE = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') + def load(self, parser, debug=0): parser.seek(0) while 1: @@ -148,14 +165,15 @@ class PDFXRefFallback(PDFXRef): print >>sys.stderr, 'trailer: %r' % self.get_trailer() break m = self.PDFOBJ_CUE.match(line) - if not m: continue + if not m: + continue (objid, genno) = m.groups() objid = int(objid) genno = int(genno) self.offsets[objid] = (None, pos, genno) # expand ObjStm. parser.seek(pos) - (_,obj) = parser.nextobject() + (_, obj) = parser.nextobject() if isinstance(obj, PDFStream) and obj.get('Type') is LITERAL_OBJSTM: stream = stream_value(obj) try: @@ -168,7 +186,7 @@ class PDFXRefFallback(PDFXRef): objs = [] try: while 1: - (_,obj) = parser1.nextobject() + (_, obj) = parser1.nextobject() objs.append(obj) except PSEOF: pass @@ -193,14 +211,14 @@ class PDFXRefStream(PDFBaseXRef): return '' % (self.ranges) def load(self, parser, debug=0): - (_,objid) = parser.nexttoken() # ignored - (_,genno) = parser.nexttoken() # ignored - (_,kwd) = parser.nexttoken() - (_,stream) = parser.nextobject() + (_, objid) = parser.nexttoken() # ignored + (_, genno) = parser.nexttoken() # ignored + (_, kwd) = parser.nexttoken() + (_, stream) = parser.nextobject() if not isinstance(stream, PDFStream) or stream['Type'] is not LITERAL_XREF: raise PDFNoValidXRef('Invalid PDF stream spec.') size = stream['Size'] - index_array = stream.get('Index', (1,size)) + index_array = stream.get('Index', (1, size)) if len(index_array) % 2 != 0: raise PDFSyntaxError('Invalid index number') self.ranges.extend(choplist(2, index_array)) @@ -210,22 +228,22 @@ class PDFXRefStream(PDFBaseXRef): self.trailer = stream.attrs if 1 <= debug: print >>sys.stderr, ('xref stream: objid=%s, fields=%d,%d,%d' % - (', '.join(map(repr, self.ranges)), - self.fl1, self.fl2, self.fl3)) + (', '.join(map(repr, self.ranges)), + self.fl1, self.fl2, self.fl3)) return def get_trailer(self): return self.trailer def get_objids(self): - for (start,nobjs) in self.ranges: + for (start, nobjs) in self.ranges: for i in xrange(nobjs): yield start+i return def get_pos(self, objid): index = 0 - for (start,nobjs) in self.ranges: + for (start, nobjs) in self.ranges: if start <= objid and objid < start+nobjs: index += objid - start else: @@ -260,7 +278,7 @@ class PDFDocument(object): doc = PDFDocument(parser) doc.initialize(password) obj = doc.getobj(objid) - + """ debug = 0 @@ -292,7 +310,8 @@ class PDFDocument(object): self.xrefs.append(xref) for xref in self.xrefs: trailer = xref.get_trailer() - if not trailer: continue + if not trailer: + continue # If there's an encryption info, remember it. if 'Encrypt' in trailer: #assert not self.encryption @@ -316,6 +335,7 @@ class PDFDocument(object): # This step is mandatory even if there's no password associated # with the document. PASSWORD_PADDING = '(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' + def initialize(self, password=''): if not self.encryption: self.is_printable = self.is_modifiable = self.is_extractable = True @@ -326,9 +346,9 @@ class PDFDocument(object): V = int_value(param.get('V', 0)) if not (V == 1 or V == 2): raise PDFEncryptionError('Unknown algorithm: param=%r' % param) - length = int_value(param.get('Length', 40)) # Key length (bits) + length = int_value(param.get('Length', 40)) # Key length (bits) O = str_value(param['O']) - R = int_value(param['R']) # Revision + R = int_value(param['R']) # Revision if 5 <= R: raise PDFEncryptionError('Unknown revision: %r' % R) U = str_value(param['U']) @@ -337,11 +357,11 @@ class PDFDocument(object): self.is_modifiable = bool(P & 8) self.is_extractable = bool(P & 16) # Algorithm 3.2 - password = (password+self.PASSWORD_PADDING)[:32] # 1 - hash = md5.md5(password) # 2 - hash.update(O) # 3 - hash.update(struct.pack('>sys.stderr, 'find_xref: %r' % line - if line == 'startxref': break + if line == 'startxref': + break if line: prev = line else: diff --git a/pdfminer/pdffont.py b/pdfminer/pdffont.py index b6e20b9..e4d2dd7 100644 --- a/pdfminer/pdffont.py +++ b/pdfminer/pdffont.py @@ -25,13 +25,13 @@ def get_widths(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,w) in enumerate(v): + for (i, w) in enumerate(v): widths[char1+i] = w r = [] elif isinstance(v, int): r.append(v) if len(r) == 3: - (char1,char2,w) = r + (char1, char2, w) = r for i in xrange(char1, char2+1): widths[i] = w r = [] @@ -40,6 +40,7 @@ def get_widths(seq): #assert get_widths([1,2,3]) == {1:3, 2:3} #assert get_widths([1,[2,3],6,[7,8]]) == {1:2,2:3, 6:7,7:8} + def get_widths2(seq): widths = {} r = [] @@ -47,20 +48,20 @@ def get_widths2(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,(w,vx,vy)) in enumerate(choplist(3,v)): - widths[char1+i] = (w,(vx,vy)) + for (i, (w, vx, vy)) in enumerate(choplist(3, v)): + widths[char1+i] = (w, (vx, vy)) r = [] elif isinstance(v, int): r.append(v) if len(r) == 5: - (char1,char2,w,vx,vy) = r + (char1, char2, w, vx, vy) = r for i in xrange(char1, char2+1): - widths[i] = (w,(vx,vy)) + widths[i] = (w, (vx, vy)) r = [] return widths #assert get_widths2([1]) == {} -#assert get_widths2([1,2,3,4,5]) == {1:(3,(4,5)), 2:(3,(4,5))} -#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2,(3,4)), 6:(7,(8,9))} +#assert get_widths2([1,2,3,4,5]) == {1:(3, (4,5)), 2:(3, (4,5))} +#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2, (3,4)), 6:(7, (8,9))} ## FontMetricsDB @@ -94,7 +95,7 @@ class Type1FontHeaderParser(PSStackParser): def get_encoding(self): while 1: try: - (cid,name) = self.nextobject() + (cid, name) = self.nextobject() except PSEOF: break try: @@ -102,28 +103,31 @@ class Type1FontHeaderParser(PSStackParser): except KeyError: pass return self._cid2unicode - + def do_keyword(self, pos, token): if token is self.KEYWORD_PUT: - ((_,key),(_,value)) = self.pop(2) + ((_, key), (_, value)) = self.pop(2) if (isinstance(key, int) and isinstance(value, PSLiteral)): self.add_results((key, literal_name(value))) return - + +NIBBLES = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'e-', None, '-') + + ## CFFFont ## (Format specified in Adobe Technical Note: #5176 ## "The Compact Font Format Specification") ## -NIBBLES = ('0','1','2','3','4','5','6','7','8','9','.','e','e-',None,'-') def getdict(data): d = {} fp = StringIO(data) stack = [] while 1: c = fp.read(1) - if not c: break + if not c: + break b0 = ord(c) if b0 <= 21: d[b0] = stack @@ -145,19 +149,21 @@ def getdict(data): else: b1 = ord(fp.read(1)) if 247 <= b0 and b0 <= 250: - value = ((b0-247)<<8)+b1+108 + value = ((b0-247) << 8)+b1+108 elif 251 <= b0 and b0 <= 254: - value = -((b0-251)<<8)-b1-108 + value = -((b0-251) << 8)-b1-108 else: b2 = ord(fp.read(1)) - if 128 <= b1: b1 -= 256 + if 128 <= b1: + b1 -= 256 if b0 == 28: - value = b1<<8 | b2 + value = b1 << 8 | b2 else: - value = b1<<24 | b2<<16 | struct.unpack('>H', fp.read(2))[0] + value = b1 << 24 | b2 << 16 | struct.unpack('>H', fp.read(2))[0] stack.append(value) return d + class CFFFont(object): STANDARD_STRINGS = ( @@ -239,7 +245,7 @@ class CFFFont(object): 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold', - ) + ) class INDEX(object): @@ -264,13 +270,13 @@ class CFFFont(object): return self.fp.read(self.offsets[i+1]-self.offsets[i]) def __iter__(self): - return iter( self[i] for i in xrange(len(self)) ) + return iter(self[i] for i in xrange(len(self))) def __init__(self, name, fp): self.name = name self.fp = fp # Header - (_major,_minor,hdrsize,offsize) = struct.unpack('BBBB', self.fp.read(4)) + (_major, _minor, hdrsize, offsize) = struct.unpack('BBBB', self.fp.read(4)) self.fp.read(hdrsize-4) # Name INDEX self.name_index = self.INDEX(self.fp) @@ -297,7 +303,7 @@ class CFFFont(object): if format == '\x00': # Format 0 (n,) = struct.unpack('B', self.fp.read(1)) - for (code,gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): + for (code, gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): self.code2gid[code] = gid self.gid2code[gid] = code elif format == '\x01': @@ -305,8 +311,8 @@ class CFFFont(object): (n,) = struct.unpack('B', self.fp.read(1)) code = 0 for i in xrange(n): - (first,nleft) = struct.unpack('BB', self.fp.read(2)) - for gid in xrange(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in xrange(first, first+nleft+1): self.code2gid[code] = gid self.gid2code[gid] = code code += 1 @@ -320,7 +326,7 @@ class CFFFont(object): if format == '\x00': # Format 0 n = self.nglyphs-1 - for (gid,sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): + for (gid, sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): gid += 1 name = self.getstr(sid) self.name2gid[name] = gid @@ -330,8 +336,8 @@ class CFFFont(object): (n,) = struct.unpack('B', self.fp.read(1)) sid = 0 for i in xrange(n): - (first,nleft) = struct.unpack('BB', self.fp.read(2)) - for gid in xrange(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in xrange(first, first+nleft+1): name = self.getstr(sid) self.name2gid[name] = gid self.gid2name[gid] = name @@ -356,7 +362,8 @@ class CFFFont(object): ## class TrueTypeFont(object): - class CMapNotFound(Exception): pass + class CMapNotFound(Exception): + pass def __init__(self, name, fp): self.name = name @@ -389,15 +396,16 @@ class TrueTypeFont(object): elif fmttype == 2: subheaderkeys = struct.unpack('>256H', fp.read(512)) firstbytes = [0]*8192 - for (i,k) in enumerate(subheaderkeys): + for (i, k) in enumerate(subheaderkeys): firstbytes[k/8] = i nhdrs = max(subheaderkeys)/8 + 1 hdrs = [] for i in xrange(nhdrs): - (firstcode,entcount,delta,offset) = struct.unpack('>HHhH', fp.read(8)) - hdrs.append((i,firstcode,entcount,delta,fp.tell()-2+offset)) - for (i,firstcode,entcount,delta,pos) in hdrs: - if not entcount: continue + (firstcode, entcount, delta, offset) = struct.unpack('>HHhH', fp.read(8)) + hdrs.append((i, firstcode, entcount, delta, fp.tell()-2+offset)) + for (i, firstcode, entcount, delta, pos) in hdrs: + if not entcount: + continue first = firstcode + (firstbytes[i] << 8) fp.seek(pos) for c in xrange(entcount): @@ -414,7 +422,7 @@ class TrueTypeFont(object): idds = struct.unpack('>%dh' % segcount, fp.read(2*segcount)) pos = fp.tell() idrs = struct.unpack('>%dH' % segcount, fp.read(2*segcount)) - for (ec,sc,idd,idr) in zip(ecs, scs, idds, idrs): + for (ec, sc, idd, idr) in zip(ecs, scs, idds, idrs): if idr: fp.seek(pos+idr) for c in xrange(sc, ec+1): @@ -426,16 +434,19 @@ class TrueTypeFont(object): assert 0 # create unicode map unicode_map = FileUnicodeMap() - for (char,gid) in char2gid.iteritems(): + for (char, gid) in char2gid.iteritems(): unicode_map.add_cid2unichr(gid, char) return unicode_map ## Fonts ## +class PDFFontError(PDFException): + pass -class PDFFontError(PDFException): pass -class PDFUnicodeNotDefined(PDFFontError): pass + +class PDFUnicodeNotDefined(PDFFontError): + pass LITERAL_STANDARD_ENCODING = LIT('StandardEncoding') LITERAL_TYPE1C = LIT('Type1C') @@ -456,7 +467,7 @@ class PDFFont(object): self.italic_angle = num_value(descriptor.get('ItalicAngle', 0)) self.default_width = default_width or num_value(descriptor.get('MissingWidth', 0)) self.leading = num_value(descriptor.get('Leading', 0)) - self.bbox = list_value(descriptor.get('FontBBox', (0,0,0,0))) + self.bbox = list_value(descriptor.get('FontBBox', (0, 0, 0, 0))) self.hscale = self.vscale = .001 return @@ -474,6 +485,7 @@ class PDFFont(object): def get_ascent(self): return self.ascent * self.vscale + def get_descent(self): return self.descent * self.vscale @@ -482,6 +494,7 @@ class PDFFont(object): if w == 0: w = -self.default_width return w * self.hscale + def get_height(self): h = self.bbox[3]-self.bbox[1] if h == 0: @@ -501,7 +514,7 @@ class PDFFont(object): return 0 def string_width(self, s): - return sum( self.char_width(cid) for cid in self.decode(s) ) + return sum(self.char_width(cid) for cid in self.decode(s)) # PDFSimpleFont @@ -540,6 +553,7 @@ class PDFSimpleFont(PDFFont): except KeyError: raise PDFUnicodeNotDefined(None, cid) + # PDFType1Font class PDFType1Font(PDFSimpleFont): @@ -557,7 +571,7 @@ class PDFType1Font(PDFSimpleFont): firstchar = int_value(spec.get('FirstChar', 0)) lastchar = int_value(spec.get('LastChar', 255)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths) ) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) PDFSimpleFont.__init__(self, descriptor, widths, spec) if 'Encoding' not in spec and 'FontFile' in descriptor: # try to recover the missing encoding info from the font file. @@ -571,12 +585,14 @@ class PDFType1Font(PDFSimpleFont): def __repr__(self): return '' % self.basefont + # PDFTrueTypeFont class PDFTrueTypeFont(PDFType1Font): def __repr__(self): return '' % self.basefont + # PDFType3Font class PDFType3Font(PDFSimpleFont): @@ -584,16 +600,16 @@ class PDFType3Font(PDFSimpleFont): firstchar = int_value(spec.get('FirstChar', 0)) lastchar = int_value(spec.get('LastChar', 0)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths)) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) if 'FontDescriptor' in spec: descriptor = dict_value(spec['FontDescriptor']) else: - descriptor = {'Ascent':0, 'Descent':0, - 'FontBBox':spec['FontBBox']} + descriptor = {'Ascent': 0, 'Descent': 0, + 'FontBBox': spec['FontBBox']} PDFSimpleFont.__init__(self, descriptor, widths, spec) self.matrix = tuple(list_value(spec.get('FontMatrix'))) - (_,self.descent,_,self.ascent) = self.bbox - (self.hscale,self.vscale) = apply_matrix_norm(self.matrix, (1,1)) + (_, self.descent, _, self.ascent) = self.bbox + (self.hscale, self.vscale) = apply_matrix_norm(self.matrix, (1, 1)) return def __repr__(self): @@ -657,10 +673,10 @@ class PDFCIDFont(PDFFont): if self.vertical: # writing mode: vertical widths = get_widths2(list_value(spec.get('W2', []))) - self.disps = dict( (cid,(vx,vy)) for (cid,(_,(vx,vy))) in widths.iteritems() ) - (vy,w) = spec.get('DW2', [880, -1000]) - self.default_disp = (None,vy) - widths = dict( (cid,w) for (cid,(w,_)) in widths.iteritems() ) + self.disps = dict((cid, (vx, vy)) for (cid, (_, (vx, vy))) in widths.iteritems()) + (vy, w) = spec.get('DW2', [880, -1000]) + self.default_disp = (None, vy) + widths = dict((cid, w) for (cid, (w, _)) in widths.iteritems()) default_width = w else: # writing mode: horizontal @@ -689,7 +705,8 @@ class PDFCIDFont(PDFFont): def to_unichr(self, cid): try: - if not self.unicode_map: raise KeyError(cid) + if not self.unicode_map: + raise KeyError(cid) return self.unicode_map.get_unichr(cid) except KeyError: raise PDFUnicodeNotDefined(self.cidcoding, cid) @@ -705,4 +722,5 @@ def main(argv): fp.close() return -if __name__ == '__main__': sys.exit(main(sys.argv)) +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/pdfminer/pdfinterp.py b/pdfminer/pdfinterp.py index b25e107..27745fb 100644 --- a/pdfminer/pdfinterp.py +++ b/pdfminer/pdfinterp.py @@ -26,8 +26,12 @@ from utils import mult_matrix, MATRIX_IDENTITY ## Exceptions ## -class PDFResourceError(PDFException): pass -class PDFInterpreterError(PDFException): pass +class PDFResourceError(PDFException): + pass + + +class PDFInterpreterError(PDFException): + pass ## Constants @@ -116,12 +120,13 @@ class PDFGraphicState(object): (self.linewidth, self.linecap, self.linejoin, self.miterlimit, self.dash, self.intent, self.flatness)) + ## Resource Manager ## class PDFResourceManager(object): """Repository of shared resources. - + ResourceManager facilitates reuse of shared resources such as fonts and images so that large objects are not allocated multiple times. @@ -148,7 +153,8 @@ class PDFResourceManager(object): try: return CMapDB.get_cmap(cmapname) except CMapDB.CMapNotFound: - if strict: raise + if strict: + raise return CMap() def get_font(self, objid, spec): @@ -191,7 +197,7 @@ class PDFResourceManager(object): else: if STRICT: raise PDFFontError('Invalid Font spec: %r' % spec) - font = PDFType1Font(self, spec) # this is so wrong! + font = PDFType1Font(self, spec) # this is so wrong! if objid and self.caching: self._cached_fonts[objid] = font return font @@ -223,12 +229,14 @@ class PDFContentParser(PSStackParser): return def fillbuf(self): - if self.charpos < len(self.buf): return + if self.charpos < len(self.buf): + return while 1: self.fillfp() self.bufpos = self.fp.tell() self.buf = self.fp.read(self.BUFSIZ) - if self.buf: break + if self.buf: + break self.fp = None self.charpos = 0 return @@ -259,7 +267,7 @@ class PDFContentParser(PSStackParser): except ValueError: data += self.buf[self.charpos:] self.charpos = len(self.buf) - data = data[:-(len(target)+1)] # strip the last part + data = data[:-(len(target)+1)] # strip the last part data = re.sub(r'(\x0d\x0a|[\x0d\x0a])$', '', data) return (pos, data) @@ -270,6 +278,7 @@ class PDFContentParser(PSStackParser): KEYWORD_BI = KWD('BI') KEYWORD_ID = KWD('ID') KEYWORD_EI = KWD('EI') + def do_keyword(self, pos, token): if token is self.KEYWORD_BI: # inline image within a content stream @@ -279,13 +288,14 @@ class PDFContentParser(PSStackParser): (_, objs) = self.end_type('inline') if len(objs) % 2 != 0: raise PSTypeError('Invalid dictionary construct: %r' % objs) - d = dict( (literal_name(k), v) for (k,v) in choplist(2, objs) ) + d = dict((literal_name(k), v) for (k, v) in choplist(2, objs)) (pos, data) = self.get_inline_data(pos+len('ID ')) obj = PDFStream(d, data) self.push((pos, obj)) self.push((pos, self.KEYWORD_EI)) except PSTypeError: - if STRICT: raise + if STRICT: + raise else: self.push((pos, token)) return @@ -312,7 +322,9 @@ class PDFPageInterpreter(object): self.fontmap = {} self.xobjmap = {} self.csmap = PREDEFINED_COLORSPACE.copy() - if not resources: return + if not resources: + return + def get_colorspace(spec): if isinstance(spec, list): name = literal_name(spec[0]) @@ -324,23 +336,23 @@ class PDFPageInterpreter(object): return PDFColorSpace(name, len(list_value(spec[1]))) else: return PREDEFINED_COLORSPACE.get(name) - for (k,v) in dict_value(resources).iteritems(): + for (k, v) in dict_value(resources).iteritems(): if 2 <= self.debug: - print >>sys.stderr, 'Resource: %r: %r' % (k,v) + print >>sys.stderr, 'Resource: %r: %r' % (k, v) if k == 'Font': - for (fontid,spec) in dict_value(v).iteritems(): + for (fontid, spec) in dict_value(v).iteritems(): objid = None if isinstance(spec, PDFObjRef): objid = spec.objid spec = dict_value(spec) self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec) elif k == 'ColorSpace': - for (csid,spec) in dict_value(v).iteritems(): + for (csid, spec) in dict_value(v).iteritems(): self.csmap[csid] = get_colorspace(resolve1(spec)) elif k == 'ProcSet': self.rsrcmgr.get_procset(list_value(v)) elif k == 'XObject': - for (xobjid,xobjstrm) in dict_value(v).iteritems(): + for (xobjid, xobjstrm) in dict_value(v).iteritems(): self.xobjmap[xobjid] = xobjstrm return @@ -367,7 +379,8 @@ class PDFPageInterpreter(object): return def pop(self, n): - if n == 0: return [] + if n == 0: + return [] x = self.argstack[-n:] self.argstack = self.argstack[:-n] return x @@ -384,6 +397,7 @@ class PDFPageInterpreter(object): def do_q(self): self.gstack.append(self.get_current_state()) return + # grestore def do_Q(self): if self.gstack: @@ -392,7 +406,7 @@ class PDFPageInterpreter(object): # concat-matrix def do_cm(self, a1, b1, c1, d1, e1, f1): - self.ctm = mult_matrix((a1,b1,c1,d1,e1,f1), self.ctm) + self.ctm = mult_matrix((a1, b1, c1, d1, e1, f1), self.ctm) self.device.set_ctm(self.ctm) return @@ -400,30 +414,37 @@ class PDFPageInterpreter(object): def do_w(self, linewidth): self.graphicstate.linewidth = linewidth return + # setlinecap def do_J(self, linecap): self.graphicstate.linecap = linecap return + # setlinejoin def do_j(self, linejoin): self.graphicstate.linejoin = linejoin return + # setmiterlimit def do_M(self, miterlimit): self.graphicstate.miterlimit = miterlimit return + # setdash def do_d(self, dash, phase): self.graphicstate.dash = (dash, phase) return + # setintent def do_ri(self, intent): self.graphicstate.intent = intent return + # setflatness def do_i(self, flatness): self.graphicstate.flatness = flatness return + # load-gstate def do_gs(self, name): #XXX @@ -431,34 +452,40 @@ class PDFPageInterpreter(object): # moveto def do_m(self, x, y): - self.curpath.append(('m',x,y)) + self.curpath.append(('m', x, y)) return + # lineto def do_l(self, x, y): - self.curpath.append(('l',x,y)) + self.curpath.append(('l', x, y)) return + # curveto def do_c(self, x1, y1, x2, y2, x3, y3): - self.curpath.append(('c',x1,y1,x2,y2,x3,y3)) + self.curpath.append(('c', x1, y1, x2, y2, x3, y3)) return + # urveto def do_v(self, x2, y2, x3, y3): - self.curpath.append(('v',x2,y2,x3,y3)) + self.curpath.append(('v', x2, y2, x3, y3)) return + # rveto def do_y(self, x1, y1, x3, y3): - self.curpath.append(('y',x1,y1,x3,y3)) + self.curpath.append(('y', x1, y1, x3, y3)) return + # closepath def do_h(self): self.curpath.append(('h',)) return + # rectangle def do_re(self, x, y, w, h): - self.curpath.append(('m',x,y)) - self.curpath.append(('l',x+w,y)) - self.curpath.append(('l',x+w,y+h)) - self.curpath.append(('l',x,y+h)) + self.curpath.append(('m', x, y)) + self.curpath.append(('l', x+w, y)) + self.curpath.append(('l', x+w, y+h)) + self.curpath.append(('l', x, y+h)) self.curpath.append(('h',)) return @@ -467,11 +494,13 @@ class PDFPageInterpreter(object): self.device.paint_path(self.graphicstate, True, False, False, self.curpath) self.curpath = [] return + # close-and-stroke def do_s(self): self.do_h() self.do_S() return + # fill def do_f(self): self.device.paint_path(self.graphicstate, False, True, False, self.curpath) @@ -479,68 +508,85 @@ class PDFPageInterpreter(object): return # fill (obsolete) do_F = do_f + # fill-even-odd def do_f_a(self): self.device.paint_path(self.graphicstate, False, True, True, self.curpath) self.curpath = [] return + # fill-and-stroke def do_B(self): self.device.paint_path(self.graphicstate, True, True, False, self.curpath) self.curpath = [] return + # fill-and-stroke-even-odd def do_B_a(self): self.device.paint_path(self.graphicstate, True, True, True, self.curpath) self.curpath = [] return + # close-fill-and-stroke def do_b(self): self.do_h() self.do_B() return + # close-fill-and-stroke-even-odd def do_b_a(self): self.do_h() self.do_B_a() return + # close-only def do_n(self): self.curpath = [] return + # clip - def do_W(self): return + def do_W(self): + return + # clip-even-odd - def do_W_a(self): return + def do_W_a(self): + return # setcolorspace-stroking def do_CS(self, name): self.scs = self.csmap[literal_name(name)] return + # setcolorspace-non-strokine def do_cs(self, name): self.ncs = self.csmap[literal_name(name)] return + # setgray-stroking def do_G(self, gray): #self.do_CS(LITERAL_DEVICE_GRAY) return + # setgray-non-stroking def do_g(self, gray): #self.do_cs(LITERAL_DEVICE_GRAY) return + # setrgb-stroking def do_RG(self, r, g, b): #self.do_CS(LITERAL_DEVICE_RGB) return + # setrgb-non-stroking def do_rg(self, r, g, b): #self.do_cs(LITERAL_DEVICE_RGB) return + # setcmyk-stroking def do_K(self, c, m, y, k): #self.do_CS(LITERAL_DEVICE_CMYK) return + # setcmyk-non-stroking def do_k(self, c, m, y, k): #self.do_cs(LITERAL_DEVICE_CMYK) @@ -556,6 +602,7 @@ class PDFPageInterpreter(object): n = 1 self.pop(n) return + def do_scn(self): if self.ncs: n = self.ncs.ncomponents @@ -565,42 +612,53 @@ class PDFPageInterpreter(object): n = 1 self.pop(n) return + def do_SC(self): self.do_SCN() return + def do_sc(self): self.do_scn() return # sharing-name - def do_sh(self, name): return + def do_sh(self, name): + return # begin-text def do_BT(self): self.textstate.reset() return + # end-text def do_ET(self): return # begin-compat - def do_BX(self): return + def do_BX(self): + return + # end-compat - def do_EX(self): return + def do_EX(self): + return # marked content operators def do_MP(self, tag): self.device.do_tag(tag) return + def do_DP(self, tag, props): self.device.do_tag(tag, props) return + def do_BMC(self, tag): self.device.begin_tag(tag) return + def do_BDC(self, tag, props): self.device.begin_tag(tag, props) return + def do_EMC(self): self.device.end_tag() return @@ -609,18 +667,22 @@ class PDFPageInterpreter(object): def do_Tc(self, space): self.textstate.charspace = space return + # setwordspace def do_Tw(self, space): self.textstate.wordspace = space return + # textscale def do_Tz(self, scale): self.textstate.scaling = scale return + # setleading def do_TL(self, leading): self.textstate.leading = -leading return + # selectfont def do_Tf(self, fontid, fontsize): try: @@ -631,10 +693,12 @@ class PDFPageInterpreter(object): self.textstate.font = self.rsrcmgr.get_font(None, {}) self.textstate.fontsize = fontsize return + # setrendering def do_Tr(self, render): self.textstate.render = render return + # settextrise def do_Ts(self, rise): self.textstate.rise = rise @@ -642,49 +706,55 @@ class PDFPageInterpreter(object): # text-move def do_Td(self, tx, ty): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,tx*a+ty*c+e,tx*b+ty*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, tx*a+ty*c+e, tx*b+ty*d+f) self.textstate.linematrix = (0, 0) - #print >>sys.stderr, 'Td(%r,%r): %r' % (tx,ty,self.textstate) + #print >>sys.stderr, 'Td(%r,%r): %r' % (tx, ty, self.textstate) return + # text-move def do_TD(self, tx, ty): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,tx*a+ty*c+e,tx*b+ty*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, tx*a+ty*c+e, tx*b+ty*d+f) self.textstate.leading = ty self.textstate.linematrix = (0, 0) - #print >>sys.stderr, 'TD(%r,%r): %r' % (tx,ty,self.textstate) + #print >>sys.stderr, 'TD(%r,%r): %r' % (tx, ty, self.textstate) return + # textmatrix - def do_Tm(self, a,b,c,d,e,f): - self.textstate.matrix = (a,b,c,d,e,f) + def do_Tm(self, a, b, c, d, e, f): + self.textstate.matrix = (a, b, c, d, e, f) self.textstate.linematrix = (0, 0) return + # nextline def do_T_a(self): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,self.textstate.leading*c+e,self.textstate.leading*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, self.textstate.leading*c+e, self.textstate.leading*d+f) self.textstate.linematrix = (0, 0) return # show-pos def do_TJ(self, seq): - #print >>sys.stderr, 'TJ(%r): %r' % (seq,self.textstate) + #print >>sys.stderr, 'TJ(%r): %r' % (seq, self.textstate) if self.textstate.font is None: if STRICT: raise PDFInterpreterError('No font specified!') return self.device.render_string(self.textstate, seq) return + # show def do_Tj(self, s): self.do_TJ([s]) return + # quote def do__q(self, s): self.do_T_a() self.do_TJ([s]) return + # doublequote def do__w(self, aw, ac, s): self.do_Tw(aw) @@ -693,14 +763,16 @@ class PDFPageInterpreter(object): return # inline image - def do_BI(self): # never called + def do_BI(self): # never called return - def do_ID(self): # never called + + def do_ID(self): # never called return + def do_EI(self, obj): if 'W' in obj and 'H' in obj: iobjid = str(id(obj)) - self.device.begin_figure(iobjid, (0,0,1,1), MATRIX_IDENTITY) + self.device.begin_figure(iobjid, (0, 0, 1, 1), MATRIX_IDENTITY) self.device.render_image(iobjid, obj) self.device.end_figure(iobjid) return @@ -721,7 +793,7 @@ class PDFPageInterpreter(object): interpreter = self.dup() bbox = list_value(xobj['BBox']) matrix = list_value(xobj.get('Matrix', MATRIX_IDENTITY)) - # According to PDF reference 1.7 section 4.9.1, XObjects in + # According to PDF reference 1.7 section 4.9.1, XObjects in # earlier PDFs (prior to v1.2) use the page's Resources entry # instead of having their own Resources entry. resources = dict_value(xobj.get('Resources')) or self.resources.copy() @@ -729,7 +801,7 @@ class PDFPageInterpreter(object): interpreter.render_contents(resources, [xobj], ctm=mult_matrix(matrix, self.ctm)) self.device.end_figure(xobjid) elif subtype is LITERAL_IMAGE and 'Width' in xobj and 'Height' in xobj: - self.device.begin_figure(xobjid, (0,0,1,1), MATRIX_IDENTITY) + self.device.begin_figure(xobjid, (0, 0, 1, 1), MATRIX_IDENTITY) self.device.render_image(xobjid, xobj) self.device.end_figure(xobjid) else: @@ -740,15 +812,15 @@ class PDFPageInterpreter(object): def process_page(self, page): if 1 <= self.debug: print >>sys.stderr, 'Processing page: %r' % page - (x0,y0,x1,y1) = page.mediabox + (x0, y0, x1, y1) = page.mediabox if page.rotate == 90: - ctm = (0,-1,1,0, -y0,x1) + ctm = (0, -1, 1, 0, -y0, x1) elif page.rotate == 180: - ctm = (-1,0,0,-1, x1,y1) + ctm = (-1, 0, 0, -1, x1, y1) elif page.rotate == 270: - ctm = (0,1,-1,0, y1,-x0) + ctm = (0, 1, -1, 0, y1, -x0) else: - ctm = (1,0,0,1, -x0,-y0) + ctm = (1, 0, 0, 1, -x0, -y0) self.device.begin_page(page, ctm) self.render_contents(page.resources, page.contents, ctm=ctm) self.device.end_page(page) @@ -760,7 +832,7 @@ class PDFPageInterpreter(object): def render_contents(self, resources, streams, ctm=MATRIX_IDENTITY): if 1 <= self.debug: print >>sys.stderr, ('render_contents: resources=%r, streams=%r, ctm=%r' % - (resources, streams, ctm)) + (resources, streams, ctm)) self.init_resources(resources) self.init_state(ctm) self.execute(list_value(streams)) @@ -774,12 +846,12 @@ class PDFPageInterpreter(object): return while 1: try: - (_,obj) = parser.nextobject() + (_, obj) = parser.nextobject() except PSEOF: break if isinstance(obj, PSKeyword): name = keyword_name(obj) - method = 'do_%s' % name.replace('*','_a').replace('"','_w').replace("'",'_q') + method = 'do_%s' % name.replace('*', '_a').replace('"', '_w').replace("'", '_q') if hasattr(self, method): func = getattr(self, method) nargs = func.func_code.co_argcount-1 diff --git a/pdfminer/pdfpage.py b/pdfminer/pdfpage.py index 9d1255c..a2906a2 100644 --- a/pdfminer/pdfpage.py +++ b/pdfminer/pdfpage.py @@ -39,7 +39,7 @@ class PDFPage(object): def __init__(self, doc, pageid, attrs): """Initialize a page object. - + doc: a PDFDocument object. pageid: any Python object that can uniquely identify the page. attrs: a dictionary of page attributes. @@ -62,7 +62,7 @@ class PDFPage(object): else: contents = [] if not isinstance(contents, list): - contents = [ contents ] + contents = [contents] self.contents = contents return @@ -70,6 +70,7 @@ class PDFPage(object): return '' % (self.resources, self.mediabox) INHERITABLE_ATTRS = set(['Resources', 'MediaBox', 'CropBox', 'Rotate']) + @classmethod def create_pages(klass, document, debug=0): def search(obj, parent): @@ -79,7 +80,7 @@ class PDFPage(object): else: objid = obj.objid tree = dict_value(obj).copy() - for (k,v) in parent.iteritems(): + for (k, v) in parent.iteritems(): if k in klass.INHERITABLE_ATTRS and k not in tree: tree[k] = v if tree.get('Type') is LITERAL_PAGES and 'Kids' in tree: @@ -94,7 +95,7 @@ class PDFPage(object): yield (objid, tree) pages = False if 'Pages' in document.catalog: - for (objid,tree) in search(document.catalog['Pages'], document.catalog): + for (objid, tree) in search(document.catalog['Pages'], document.catalog): yield klass(document, objid, tree) pages = True if not pages: @@ -109,7 +110,8 @@ class PDFPage(object): pass return - class PDFTextExtractionNotAllowed(PDFEncryptionError): pass + class PDFTextExtractionNotAllowed(PDFEncryptionError): + pass @classmethod def get_pages(klass, fp, @@ -126,8 +128,10 @@ class PDFPage(object): if check_extractable and not doc.is_extractable: raise klass.PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) # Process each page contained in the document. - for (pageno,page) in enumerate(klass.create_pages(doc)): - if pagenos and (pageno not in pagenos): continue + for (pageno, page) in enumerate(klass.create_pages(doc)): + if pagenos and (pageno not in pagenos): + continue yield page - if maxpages and maxpages <= pageno+1: break + if maxpages and maxpages <= pageno+1: + break return diff --git a/pdfminer/pdfparser.py b/pdfminer/pdfparser.py index 7a0882b..e2ac6cf 100644 --- a/pdfminer/pdfparser.py +++ b/pdfminer/pdfparser.py @@ -15,7 +15,8 @@ from pdftypes import dict_value ## Exceptions ## -class PDFSyntaxError(PDFException): pass +class PDFSyntaxError(PDFException): + pass ## PDFParser @@ -35,7 +36,7 @@ class PDFParser(PSStackParser): parser.set_document(doc) parser.seek(offset) parser.nextobject() - + """ def __init__(self, fp): @@ -55,12 +56,13 @@ class PDFParser(PSStackParser): KEYWORD_STREAM = KWD('stream') KEYWORD_XREF = KWD('xref') KEYWORD_STARTXREF = KWD('startxref') + def do_keyword(self, pos, token): """Handles PDF-related keywords.""" - + if token in (self.KEYWORD_XREF, self.KEYWORD_STARTXREF): self.add_results(*self.pop(1)) - + elif token is self.KEYWORD_ENDOBJ: self.add_results(*self.pop(4)) @@ -71,7 +73,7 @@ class PDFParser(PSStackParser): elif token is self.KEYWORD_R: # reference to indirect object try: - ((_,objid), (_,genno)) = self.pop(2) + ((_, objid), (_, genno)) = self.pop(2) (objid, genno) = (int(objid), int(genno)) obj = PDFObjRef(self.doc, objid, genno) self.push((pos, obj)) @@ -80,7 +82,7 @@ class PDFParser(PSStackParser): elif token is self.KEYWORD_STREAM: # stream object - ((_,dic),) = self.pop(1) + ((_, dic),) = self.pop(1) dic = dict_value(dic) objlen = 0 if not self.fallback: @@ -118,14 +120,14 @@ class PDFParser(PSStackParser): # XXX limit objlen not to exceed object boundary if 2 <= self.debug: print >>sys.stderr, 'Stream: pos=%d, objlen=%d, dic=%r, data=%r...' % \ - (pos, objlen, dic, data[:10]) + (pos, objlen, dic, data[:10]) obj = PDFStream(dic, data, self.doc.decipher) self.push((pos, obj)) else: # others self.push((pos, token)) - + return @@ -153,7 +155,7 @@ class PDFStreamParser(PDFParser): if token is self.KEYWORD_R: # reference to indirect object try: - ((_,objid), (_,genno)) = self.pop(2) + ((_, objid), (_, genno)) = self.pop(2) (objid, genno) = (int(objid), int(genno)) obj = PDFObjRef(self.doc, objid, genno) self.push((pos, obj)) diff --git a/pdfminer/pdftypes.py b/pdfminer/pdftypes.py index 6a36c5f..0c70bc9 100644 --- a/pdfminer/pdftypes.py +++ b/pdfminer/pdftypes.py @@ -22,13 +22,28 @@ LITERALS_DCT_DECODE = (LIT('DCTDecode'), LIT('DCT')) ## PDF Objects ## -class PDFObject(PSObject): pass +class PDFObject(PSObject): + pass -class PDFException(PSException): pass -class PDFTypeError(PDFException): pass -class PDFValueError(PDFException): pass -class PDFObjectNotFound(PDFException): pass -class PDFNotImplementedError(PDFException): pass + +class PDFException(PSException): + pass + + +class PDFTypeError(PDFException): + pass + + +class PDFValueError(PDFException): + pass + + +class PDFObjectNotFound(PDFException): + pass + + +class PDFNotImplementedError(PDFException): + pass ## PDFObjRef @@ -65,33 +80,36 @@ def resolve1(x, default=None): x = x.resolve(default=default) return x + def resolve_all(x, default=None): """Recursively resolves the given object and all the internals. - + Make sure there is no indirect reference within the nested object. This procedure might be slow. """ while isinstance(x, PDFObjRef): x = x.resolve(default=default) if isinstance(x, list): - x = [ resolve_all(v, default=default) for v in x ] + x = [resolve_all(v, default=default) for v in x] elif isinstance(x, dict): - for (k,v) in x.iteritems(): + for (k, v) in x.iteritems(): x[k] = resolve_all(v, default=default) return x + def decipher_all(decipher, objid, genno, x): """Recursively deciphers the given object. """ if isinstance(x, str): return decipher(objid, genno, x) if isinstance(x, list): - x = [ decipher_all(decipher, objid, genno, v) for v in x ] + x = [decipher_all(decipher, objid, genno, v) for v in x] elif isinstance(x, dict): - for (k,v) in x.iteritems(): + for (k, v) in x.iteritems(): x[k] = decipher_all(decipher, objid, genno, v) return x + # Type cheking def int_value(x): x = resolve1(x) @@ -101,6 +119,7 @@ def int_value(x): return 0 return x + def float_value(x): x = resolve1(x) if not isinstance(x, float): @@ -109,6 +128,7 @@ def float_value(x): return 0.0 return x + def num_value(x): x = resolve1(x) if not (isinstance(x, int) or isinstance(x, float)): @@ -117,6 +137,7 @@ def num_value(x): return 0 return x + def str_value(x): x = resolve1(x) if not isinstance(x, str): @@ -125,6 +146,7 @@ def str_value(x): return '' return x + def list_value(x): x = resolve1(x) if not (isinstance(x, list) or isinstance(x, tuple)): @@ -133,6 +155,7 @@ def list_value(x): return [] return x + def dict_value(x): x = resolve1(x) if not isinstance(x, dict): @@ -141,6 +164,7 @@ def dict_value(x): return {} return x + def stream_value(x): x = resolve1(x) if not isinstance(x, PDFStream): @@ -179,13 +203,13 @@ class PDFStream(PDFObject): def __contains__(self, name): return name in self.attrs - + def __getitem__(self, name): return self.attrs[name] - + def get(self, name, default=None): return self.attrs.get(name, default) - + def get_any(self, names, default=None): for name in names: if name in self.attrs: @@ -194,12 +218,14 @@ class PDFStream(PDFObject): def get_filters(self): filters = self.get_any(('F', 'Filter')) - if not filters: return [] - if isinstance(filters, list): return filters - return [ filters ] + if not filters: + return [] + if isinstance(filters, list): + return filters + return [filters] def decode(self): - assert self.data is None and self.rawdata != None + assert self.data is None and self.rawdata is not None data = self.rawdata if self.decipher: # Handle encryption diff --git a/pdfminer/psparser.py b/pdfminer/psparser.py index 85765e7..f71fc22 100644 --- a/pdfminer/psparser.py +++ b/pdfminer/psparser.py @@ -8,11 +8,24 @@ STRICT = 0 ## PS Exceptions ## -class PSException(Exception): pass -class PSEOF(PSException): pass -class PSSyntaxError(PSException): pass -class PSTypeError(PSException): pass -class PSValueError(PSException): pass +class PSException(Exception): + pass + + +class PSEOF(PSException): + pass + + +class PSSyntaxError(PSException): + pass + + +class PSTypeError(PSException): + pass + + +class PSValueError(PSException): + pass ## Basic PostScript Types @@ -32,7 +45,7 @@ class PSObject(object): class PSLiteral(PSObject): """A class that represents a PostScript literal. - + Postscript literals are used as identifiers, such as variable names, property names and dictionary keys. Literals are case sensitive and denoted by a preceding @@ -55,11 +68,11 @@ class PSLiteral(PSObject): class PSKeyword(PSObject): """A class that represents a PostScript keyword. - + PostScript keywords are a dozen of predefined words. Commands and directives in PostScript are expressed by keywords. They are also used to denote the content boundaries. - + Note: Do not create an instance of PSKeyword directly. Always use PSKeywordTable.intern(). """ @@ -80,7 +93,7 @@ class PSSymbolTable(object): Interned objects can be checked its identity with "is" operator. """ - + def __init__(self, klass): self.dict = {} self.klass = klass @@ -114,6 +127,7 @@ def literal_name(x): return str(x) return x.name + def keyword_name(x): if not isinstance(x, PSKeyword): if STRICT: @@ -136,7 +150,9 @@ END_NUMBER = re.compile(r'[^0-9]') END_KEYWORD = re.compile(r'[#/%\[\]()<>{}\s]') END_STRING = re.compile(r'[()\134]') OCT_STRING = re.compile(r'[0-7]') -ESC_STRING = { 'b':8, 't':9, 'n':10, 'f':12, 'r':13, '(':40, ')':41, '\\':92 } +ESC_STRING = {'b': 8, 't': 9, 'n': 10, 'f': 12, 'r': 13, '(': 40, ')': 41, '\\': 92} + + class PSBaseParser(object): """Most basic PostScript parser that performs only tokenization. @@ -190,7 +206,8 @@ class PSBaseParser(object): return def fillbuf(self): - if self.charpos < len(self.buf): return + if self.charpos < len(self.buf): + return # fetch next chunk. self.bufpos = self.fp.tell() self.buf = self.fp.read(self.BUFSIZ) @@ -242,7 +259,8 @@ class PSBaseParser(object): pos = max(0, pos-self.BUFSIZ) self.fp.seek(pos) s = self.fp.read(prevpos-pos) - if not s: break + if not s: + break while 1: n = max(s.rfind('\r'), s.rfind('\n')) if n == -1: @@ -357,7 +375,7 @@ class PSBaseParser(object): pass self._parse1 = self._parse_main return j - + def _parse_float(self, s, i): m = END_NUMBER.search(s, i) if not m: @@ -407,7 +425,7 @@ class PSBaseParser(object): return j+1 if c == ')': self.paren -= 1 - if self.paren: # WTF, they said balanced parens need no special treatment. + if self.paren: # WTF, they said balanced parens need no special treatment. self._curtoken += c return j+1 self._add_token(self._curtoken) @@ -493,17 +511,17 @@ class PSStackParser(PSBaseParser): def push(self, *objs): self.curstack.extend(objs) return - + def pop(self, n): objs = self.curstack[-n:] self.curstack[-n:] = [] return objs - + def popall(self): objs = self.curstack self.curstack = [] return objs - + def add_results(self, *objs): if 2 <= self.debug: print >>sys.stderr, 'add_results: %r' % (objs,) @@ -516,11 +534,11 @@ class PSStackParser(PSBaseParser): if 2 <= self.debug: print >>sys.stderr, 'start_type: pos=%r, type=%r' % (pos, type) return - + def end_type(self, type): if self.curtype != type: raise PSTypeError('Type mismatch: %r != %r' % (self.curtype, type)) - objs = [ obj for (_,obj) in self.curstack ] + objs = [obj for (_, obj) in self.curstack] (pos, self.curtype, self.curstack) = self.context.pop() if 2 <= self.debug: print >>sys.stderr, 'end_type: pos=%r, type=%r, objs=%r' % (pos, type, objs) @@ -553,7 +571,8 @@ class PSStackParser(PSBaseParser): try: self.push(self.end_type('a')) except PSTypeError: - if STRICT: raise + if STRICT: + raise elif token == KEYWORD_DICT_BEGIN: # begin dictionary self.start_type(pos, 'd') @@ -564,10 +583,11 @@ class PSStackParser(PSBaseParser): if len(objs) % 2 != 0: raise PSSyntaxError('Invalid dictionary construct: %r' % objs) # construct a Python dictionary. - d = dict( (literal_name(k), v) for (k,v) in choplist(2, objs) if v is not None ) + d = dict((literal_name(k), v) for (k, v) in choplist(2, objs) if v is not None) self.push((pos, d)) except PSTypeError: - if STRICT: raise + if STRICT: + raise elif token == KEYWORD_PROC_BEGIN: # begin proc self.start_type(pos, 'p') @@ -576,7 +596,8 @@ class PSStackParser(PSBaseParser): try: self.push(self.end_type('p')) except PSTypeError: - if STRICT: raise + if STRICT: + raise else: if 2 <= self.debug: print >>sys.stderr, 'do_keyword: pos=%r, token=%r, stack=%r' % \ @@ -592,9 +613,11 @@ class PSStackParser(PSBaseParser): return obj +import unittest + + ## Simplistic Test cases ## -import unittest class TestPSBaseParser(unittest.TestCase): TESTDATA = r'''%!PS @@ -630,7 +653,7 @@ func/a/b{(c)do*}def (242, KWD('def')), (246, KWD('[')), (248, 1), (250, 'z'), (254, KWD('!')), (256, KWD(']')), (258, KWD('<<')), (261, LIT('foo')), (266, 'bar'), (272, KWD('>>')) - ] + ] OBJS = [ (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')), @@ -641,10 +664,11 @@ func/a/b{(c)do*}def (191, ''), (194, ' '), (199, '@@ '), (211, '\xab\xcd\x00\x124\x05'), (230, LIT('a')), (232, LIT('b')), (234, ['c']), (246, [1, 'z']), (258, {'foo': 'bar'}), - ] + ] def get_tokens(self, s): import StringIO + class MyParser(PSBaseParser): def flush(self): self.add_results(*self.popall()) @@ -659,6 +683,7 @@ func/a/b{(c)do*}def def get_objects(self, s): import StringIO + class MyParser(PSStackParser): def flush(self): self.add_results(*self.popall()) @@ -683,4 +708,5 @@ func/a/b{(c)do*}def self.assertEqual(objs, self.OBJS) return -if __name__ == '__main__': unittest.main() +if __name__ == '__main__': + unittest.main() diff --git a/pdfminer/rijndael.py b/pdfminer/rijndael.py index d0b8f08..83e9b47 100644 --- a/pdfminer/rijndael.py +++ b/pdfminer/rijndael.py @@ -12,686 +12,694 @@ by Philip J. Erdelsky: import struct -def KEYLENGTH(keybits): return (keybits)/8 -def RKLENGTH(keybits): return (keybits)/8+28 -def NROUNDS(keybits): return (keybits)/32+6 + +def KEYLENGTH(keybits): + return (keybits)/8 + + +def RKLENGTH(keybits): + return (keybits)/8+28 + + +def NROUNDS(keybits): + return (keybits)/32+6 Te0 = [ - 0xc66363a5L, 0xf87c7c84L, 0xee777799L, 0xf67b7b8dL, - 0xfff2f20dL, 0xd66b6bbdL, 0xde6f6fb1L, 0x91c5c554L, - 0x60303050L, 0x02010103L, 0xce6767a9L, 0x562b2b7dL, - 0xe7fefe19L, 0xb5d7d762L, 0x4dababe6L, 0xec76769aL, - 0x8fcaca45L, 0x1f82829dL, 0x89c9c940L, 0xfa7d7d87L, - 0xeffafa15L, 0xb25959ebL, 0x8e4747c9L, 0xfbf0f00bL, - 0x41adadecL, 0xb3d4d467L, 0x5fa2a2fdL, 0x45afafeaL, - 0x239c9cbfL, 0x53a4a4f7L, 0xe4727296L, 0x9bc0c05bL, - 0x75b7b7c2L, 0xe1fdfd1cL, 0x3d9393aeL, 0x4c26266aL, - 0x6c36365aL, 0x7e3f3f41L, 0xf5f7f702L, 0x83cccc4fL, - 0x6834345cL, 0x51a5a5f4L, 0xd1e5e534L, 0xf9f1f108L, - 0xe2717193L, 0xabd8d873L, 0x62313153L, 0x2a15153fL, - 0x0804040cL, 0x95c7c752L, 0x46232365L, 0x9dc3c35eL, - 0x30181828L, 0x379696a1L, 0x0a05050fL, 0x2f9a9ab5L, - 0x0e070709L, 0x24121236L, 0x1b80809bL, 0xdfe2e23dL, - 0xcdebeb26L, 0x4e272769L, 0x7fb2b2cdL, 0xea75759fL, - 0x1209091bL, 0x1d83839eL, 0x582c2c74L, 0x341a1a2eL, - 0x361b1b2dL, 0xdc6e6eb2L, 0xb45a5aeeL, 0x5ba0a0fbL, - 0xa45252f6L, 0x763b3b4dL, 0xb7d6d661L, 0x7db3b3ceL, - 0x5229297bL, 0xdde3e33eL, 0x5e2f2f71L, 0x13848497L, - 0xa65353f5L, 0xb9d1d168L, 0x00000000L, 0xc1eded2cL, - 0x40202060L, 0xe3fcfc1fL, 0x79b1b1c8L, 0xb65b5bedL, - 0xd46a6abeL, 0x8dcbcb46L, 0x67bebed9L, 0x7239394bL, - 0x944a4adeL, 0x984c4cd4L, 0xb05858e8L, 0x85cfcf4aL, - 0xbbd0d06bL, 0xc5efef2aL, 0x4faaaae5L, 0xedfbfb16L, - 0x864343c5L, 0x9a4d4dd7L, 0x66333355L, 0x11858594L, - 0x8a4545cfL, 0xe9f9f910L, 0x04020206L, 0xfe7f7f81L, - 0xa05050f0L, 0x783c3c44L, 0x259f9fbaL, 0x4ba8a8e3L, - 0xa25151f3L, 0x5da3a3feL, 0x804040c0L, 0x058f8f8aL, - 0x3f9292adL, 0x219d9dbcL, 0x70383848L, 0xf1f5f504L, - 0x63bcbcdfL, 0x77b6b6c1L, 0xafdada75L, 0x42212163L, - 0x20101030L, 0xe5ffff1aL, 0xfdf3f30eL, 0xbfd2d26dL, - 0x81cdcd4cL, 0x180c0c14L, 0x26131335L, 0xc3ecec2fL, - 0xbe5f5fe1L, 0x359797a2L, 0x884444ccL, 0x2e171739L, - 0x93c4c457L, 0x55a7a7f2L, 0xfc7e7e82L, 0x7a3d3d47L, - 0xc86464acL, 0xba5d5de7L, 0x3219192bL, 0xe6737395L, - 0xc06060a0L, 0x19818198L, 0x9e4f4fd1L, 0xa3dcdc7fL, - 0x44222266L, 0x542a2a7eL, 0x3b9090abL, 0x0b888883L, - 0x8c4646caL, 0xc7eeee29L, 0x6bb8b8d3L, 0x2814143cL, - 0xa7dede79L, 0xbc5e5ee2L, 0x160b0b1dL, 0xaddbdb76L, - 0xdbe0e03bL, 0x64323256L, 0x743a3a4eL, 0x140a0a1eL, - 0x924949dbL, 0x0c06060aL, 0x4824246cL, 0xb85c5ce4L, - 0x9fc2c25dL, 0xbdd3d36eL, 0x43acacefL, 0xc46262a6L, - 0x399191a8L, 0x319595a4L, 0xd3e4e437L, 0xf279798bL, - 0xd5e7e732L, 0x8bc8c843L, 0x6e373759L, 0xda6d6db7L, - 0x018d8d8cL, 0xb1d5d564L, 0x9c4e4ed2L, 0x49a9a9e0L, - 0xd86c6cb4L, 0xac5656faL, 0xf3f4f407L, 0xcfeaea25L, - 0xca6565afL, 0xf47a7a8eL, 0x47aeaee9L, 0x10080818L, - 0x6fbabad5L, 0xf0787888L, 0x4a25256fL, 0x5c2e2e72L, - 0x381c1c24L, 0x57a6a6f1L, 0x73b4b4c7L, 0x97c6c651L, - 0xcbe8e823L, 0xa1dddd7cL, 0xe874749cL, 0x3e1f1f21L, - 0x964b4bddL, 0x61bdbddcL, 0x0d8b8b86L, 0x0f8a8a85L, - 0xe0707090L, 0x7c3e3e42L, 0x71b5b5c4L, 0xcc6666aaL, - 0x904848d8L, 0x06030305L, 0xf7f6f601L, 0x1c0e0e12L, - 0xc26161a3L, 0x6a35355fL, 0xae5757f9L, 0x69b9b9d0L, - 0x17868691L, 0x99c1c158L, 0x3a1d1d27L, 0x279e9eb9L, - 0xd9e1e138L, 0xebf8f813L, 0x2b9898b3L, 0x22111133L, - 0xd26969bbL, 0xa9d9d970L, 0x078e8e89L, 0x339494a7L, - 0x2d9b9bb6L, 0x3c1e1e22L, 0x15878792L, 0xc9e9e920L, - 0x87cece49L, 0xaa5555ffL, 0x50282878L, 0xa5dfdf7aL, - 0x038c8c8fL, 0x59a1a1f8L, 0x09898980L, 0x1a0d0d17L, - 0x65bfbfdaL, 0xd7e6e631L, 0x844242c6L, 0xd06868b8L, - 0x824141c3L, 0x299999b0L, 0x5a2d2d77L, 0x1e0f0f11L, - 0x7bb0b0cbL, 0xa85454fcL, 0x6dbbbbd6L, 0x2c16163aL, - ] + 0xc66363a5L, 0xf87c7c84L, 0xee777799L, 0xf67b7b8dL, + 0xfff2f20dL, 0xd66b6bbdL, 0xde6f6fb1L, 0x91c5c554L, + 0x60303050L, 0x02010103L, 0xce6767a9L, 0x562b2b7dL, + 0xe7fefe19L, 0xb5d7d762L, 0x4dababe6L, 0xec76769aL, + 0x8fcaca45L, 0x1f82829dL, 0x89c9c940L, 0xfa7d7d87L, + 0xeffafa15L, 0xb25959ebL, 0x8e4747c9L, 0xfbf0f00bL, + 0x41adadecL, 0xb3d4d467L, 0x5fa2a2fdL, 0x45afafeaL, + 0x239c9cbfL, 0x53a4a4f7L, 0xe4727296L, 0x9bc0c05bL, + 0x75b7b7c2L, 0xe1fdfd1cL, 0x3d9393aeL, 0x4c26266aL, + 0x6c36365aL, 0x7e3f3f41L, 0xf5f7f702L, 0x83cccc4fL, + 0x6834345cL, 0x51a5a5f4L, 0xd1e5e534L, 0xf9f1f108L, + 0xe2717193L, 0xabd8d873L, 0x62313153L, 0x2a15153fL, + 0x0804040cL, 0x95c7c752L, 0x46232365L, 0x9dc3c35eL, + 0x30181828L, 0x379696a1L, 0x0a05050fL, 0x2f9a9ab5L, + 0x0e070709L, 0x24121236L, 0x1b80809bL, 0xdfe2e23dL, + 0xcdebeb26L, 0x4e272769L, 0x7fb2b2cdL, 0xea75759fL, + 0x1209091bL, 0x1d83839eL, 0x582c2c74L, 0x341a1a2eL, + 0x361b1b2dL, 0xdc6e6eb2L, 0xb45a5aeeL, 0x5ba0a0fbL, + 0xa45252f6L, 0x763b3b4dL, 0xb7d6d661L, 0x7db3b3ceL, + 0x5229297bL, 0xdde3e33eL, 0x5e2f2f71L, 0x13848497L, + 0xa65353f5L, 0xb9d1d168L, 0x00000000L, 0xc1eded2cL, + 0x40202060L, 0xe3fcfc1fL, 0x79b1b1c8L, 0xb65b5bedL, + 0xd46a6abeL, 0x8dcbcb46L, 0x67bebed9L, 0x7239394bL, + 0x944a4adeL, 0x984c4cd4L, 0xb05858e8L, 0x85cfcf4aL, + 0xbbd0d06bL, 0xc5efef2aL, 0x4faaaae5L, 0xedfbfb16L, + 0x864343c5L, 0x9a4d4dd7L, 0x66333355L, 0x11858594L, + 0x8a4545cfL, 0xe9f9f910L, 0x04020206L, 0xfe7f7f81L, + 0xa05050f0L, 0x783c3c44L, 0x259f9fbaL, 0x4ba8a8e3L, + 0xa25151f3L, 0x5da3a3feL, 0x804040c0L, 0x058f8f8aL, + 0x3f9292adL, 0x219d9dbcL, 0x70383848L, 0xf1f5f504L, + 0x63bcbcdfL, 0x77b6b6c1L, 0xafdada75L, 0x42212163L, + 0x20101030L, 0xe5ffff1aL, 0xfdf3f30eL, 0xbfd2d26dL, + 0x81cdcd4cL, 0x180c0c14L, 0x26131335L, 0xc3ecec2fL, + 0xbe5f5fe1L, 0x359797a2L, 0x884444ccL, 0x2e171739L, + 0x93c4c457L, 0x55a7a7f2L, 0xfc7e7e82L, 0x7a3d3d47L, + 0xc86464acL, 0xba5d5de7L, 0x3219192bL, 0xe6737395L, + 0xc06060a0L, 0x19818198L, 0x9e4f4fd1L, 0xa3dcdc7fL, + 0x44222266L, 0x542a2a7eL, 0x3b9090abL, 0x0b888883L, + 0x8c4646caL, 0xc7eeee29L, 0x6bb8b8d3L, 0x2814143cL, + 0xa7dede79L, 0xbc5e5ee2L, 0x160b0b1dL, 0xaddbdb76L, + 0xdbe0e03bL, 0x64323256L, 0x743a3a4eL, 0x140a0a1eL, + 0x924949dbL, 0x0c06060aL, 0x4824246cL, 0xb85c5ce4L, + 0x9fc2c25dL, 0xbdd3d36eL, 0x43acacefL, 0xc46262a6L, + 0x399191a8L, 0x319595a4L, 0xd3e4e437L, 0xf279798bL, + 0xd5e7e732L, 0x8bc8c843L, 0x6e373759L, 0xda6d6db7L, + 0x018d8d8cL, 0xb1d5d564L, 0x9c4e4ed2L, 0x49a9a9e0L, + 0xd86c6cb4L, 0xac5656faL, 0xf3f4f407L, 0xcfeaea25L, + 0xca6565afL, 0xf47a7a8eL, 0x47aeaee9L, 0x10080818L, + 0x6fbabad5L, 0xf0787888L, 0x4a25256fL, 0x5c2e2e72L, + 0x381c1c24L, 0x57a6a6f1L, 0x73b4b4c7L, 0x97c6c651L, + 0xcbe8e823L, 0xa1dddd7cL, 0xe874749cL, 0x3e1f1f21L, + 0x964b4bddL, 0x61bdbddcL, 0x0d8b8b86L, 0x0f8a8a85L, + 0xe0707090L, 0x7c3e3e42L, 0x71b5b5c4L, 0xcc6666aaL, + 0x904848d8L, 0x06030305L, 0xf7f6f601L, 0x1c0e0e12L, + 0xc26161a3L, 0x6a35355fL, 0xae5757f9L, 0x69b9b9d0L, + 0x17868691L, 0x99c1c158L, 0x3a1d1d27L, 0x279e9eb9L, + 0xd9e1e138L, 0xebf8f813L, 0x2b9898b3L, 0x22111133L, + 0xd26969bbL, 0xa9d9d970L, 0x078e8e89L, 0x339494a7L, + 0x2d9b9bb6L, 0x3c1e1e22L, 0x15878792L, 0xc9e9e920L, + 0x87cece49L, 0xaa5555ffL, 0x50282878L, 0xa5dfdf7aL, + 0x038c8c8fL, 0x59a1a1f8L, 0x09898980L, 0x1a0d0d17L, + 0x65bfbfdaL, 0xd7e6e631L, 0x844242c6L, 0xd06868b8L, + 0x824141c3L, 0x299999b0L, 0x5a2d2d77L, 0x1e0f0f11L, + 0x7bb0b0cbL, 0xa85454fcL, 0x6dbbbbd6L, 0x2c16163aL, +] Te1 = [ - 0xa5c66363L, 0x84f87c7cL, 0x99ee7777L, 0x8df67b7bL, - 0x0dfff2f2L, 0xbdd66b6bL, 0xb1de6f6fL, 0x5491c5c5L, - 0x50603030L, 0x03020101L, 0xa9ce6767L, 0x7d562b2bL, - 0x19e7fefeL, 0x62b5d7d7L, 0xe64dababL, 0x9aec7676L, - 0x458fcacaL, 0x9d1f8282L, 0x4089c9c9L, 0x87fa7d7dL, - 0x15effafaL, 0xebb25959L, 0xc98e4747L, 0x0bfbf0f0L, - 0xec41adadL, 0x67b3d4d4L, 0xfd5fa2a2L, 0xea45afafL, - 0xbf239c9cL, 0xf753a4a4L, 0x96e47272L, 0x5b9bc0c0L, - 0xc275b7b7L, 0x1ce1fdfdL, 0xae3d9393L, 0x6a4c2626L, - 0x5a6c3636L, 0x417e3f3fL, 0x02f5f7f7L, 0x4f83ccccL, - 0x5c683434L, 0xf451a5a5L, 0x34d1e5e5L, 0x08f9f1f1L, - 0x93e27171L, 0x73abd8d8L, 0x53623131L, 0x3f2a1515L, - 0x0c080404L, 0x5295c7c7L, 0x65462323L, 0x5e9dc3c3L, - 0x28301818L, 0xa1379696L, 0x0f0a0505L, 0xb52f9a9aL, - 0x090e0707L, 0x36241212L, 0x9b1b8080L, 0x3ddfe2e2L, - 0x26cdebebL, 0x694e2727L, 0xcd7fb2b2L, 0x9fea7575L, - 0x1b120909L, 0x9e1d8383L, 0x74582c2cL, 0x2e341a1aL, - 0x2d361b1bL, 0xb2dc6e6eL, 0xeeb45a5aL, 0xfb5ba0a0L, - 0xf6a45252L, 0x4d763b3bL, 0x61b7d6d6L, 0xce7db3b3L, - 0x7b522929L, 0x3edde3e3L, 0x715e2f2fL, 0x97138484L, - 0xf5a65353L, 0x68b9d1d1L, 0x00000000L, 0x2cc1ededL, - 0x60402020L, 0x1fe3fcfcL, 0xc879b1b1L, 0xedb65b5bL, - 0xbed46a6aL, 0x468dcbcbL, 0xd967bebeL, 0x4b723939L, - 0xde944a4aL, 0xd4984c4cL, 0xe8b05858L, 0x4a85cfcfL, - 0x6bbbd0d0L, 0x2ac5efefL, 0xe54faaaaL, 0x16edfbfbL, - 0xc5864343L, 0xd79a4d4dL, 0x55663333L, 0x94118585L, - 0xcf8a4545L, 0x10e9f9f9L, 0x06040202L, 0x81fe7f7fL, - 0xf0a05050L, 0x44783c3cL, 0xba259f9fL, 0xe34ba8a8L, - 0xf3a25151L, 0xfe5da3a3L, 0xc0804040L, 0x8a058f8fL, - 0xad3f9292L, 0xbc219d9dL, 0x48703838L, 0x04f1f5f5L, - 0xdf63bcbcL, 0xc177b6b6L, 0x75afdadaL, 0x63422121L, - 0x30201010L, 0x1ae5ffffL, 0x0efdf3f3L, 0x6dbfd2d2L, - 0x4c81cdcdL, 0x14180c0cL, 0x35261313L, 0x2fc3ececL, - 0xe1be5f5fL, 0xa2359797L, 0xcc884444L, 0x392e1717L, - 0x5793c4c4L, 0xf255a7a7L, 0x82fc7e7eL, 0x477a3d3dL, - 0xacc86464L, 0xe7ba5d5dL, 0x2b321919L, 0x95e67373L, - 0xa0c06060L, 0x98198181L, 0xd19e4f4fL, 0x7fa3dcdcL, - 0x66442222L, 0x7e542a2aL, 0xab3b9090L, 0x830b8888L, - 0xca8c4646L, 0x29c7eeeeL, 0xd36bb8b8L, 0x3c281414L, - 0x79a7dedeL, 0xe2bc5e5eL, 0x1d160b0bL, 0x76addbdbL, - 0x3bdbe0e0L, 0x56643232L, 0x4e743a3aL, 0x1e140a0aL, - 0xdb924949L, 0x0a0c0606L, 0x6c482424L, 0xe4b85c5cL, - 0x5d9fc2c2L, 0x6ebdd3d3L, 0xef43acacL, 0xa6c46262L, - 0xa8399191L, 0xa4319595L, 0x37d3e4e4L, 0x8bf27979L, - 0x32d5e7e7L, 0x438bc8c8L, 0x596e3737L, 0xb7da6d6dL, - 0x8c018d8dL, 0x64b1d5d5L, 0xd29c4e4eL, 0xe049a9a9L, - 0xb4d86c6cL, 0xfaac5656L, 0x07f3f4f4L, 0x25cfeaeaL, - 0xafca6565L, 0x8ef47a7aL, 0xe947aeaeL, 0x18100808L, - 0xd56fbabaL, 0x88f07878L, 0x6f4a2525L, 0x725c2e2eL, - 0x24381c1cL, 0xf157a6a6L, 0xc773b4b4L, 0x5197c6c6L, - 0x23cbe8e8L, 0x7ca1ddddL, 0x9ce87474L, 0x213e1f1fL, - 0xdd964b4bL, 0xdc61bdbdL, 0x860d8b8bL, 0x850f8a8aL, - 0x90e07070L, 0x427c3e3eL, 0xc471b5b5L, 0xaacc6666L, - 0xd8904848L, 0x05060303L, 0x01f7f6f6L, 0x121c0e0eL, - 0xa3c26161L, 0x5f6a3535L, 0xf9ae5757L, 0xd069b9b9L, - 0x91178686L, 0x5899c1c1L, 0x273a1d1dL, 0xb9279e9eL, - 0x38d9e1e1L, 0x13ebf8f8L, 0xb32b9898L, 0x33221111L, - 0xbbd26969L, 0x70a9d9d9L, 0x89078e8eL, 0xa7339494L, - 0xb62d9b9bL, 0x223c1e1eL, 0x92158787L, 0x20c9e9e9L, - 0x4987ceceL, 0xffaa5555L, 0x78502828L, 0x7aa5dfdfL, - 0x8f038c8cL, 0xf859a1a1L, 0x80098989L, 0x171a0d0dL, - 0xda65bfbfL, 0x31d7e6e6L, 0xc6844242L, 0xb8d06868L, - 0xc3824141L, 0xb0299999L, 0x775a2d2dL, 0x111e0f0fL, - 0xcb7bb0b0L, 0xfca85454L, 0xd66dbbbbL, 0x3a2c1616L, - ] + 0xa5c66363L, 0x84f87c7cL, 0x99ee7777L, 0x8df67b7bL, + 0x0dfff2f2L, 0xbdd66b6bL, 0xb1de6f6fL, 0x5491c5c5L, + 0x50603030L, 0x03020101L, 0xa9ce6767L, 0x7d562b2bL, + 0x19e7fefeL, 0x62b5d7d7L, 0xe64dababL, 0x9aec7676L, + 0x458fcacaL, 0x9d1f8282L, 0x4089c9c9L, 0x87fa7d7dL, + 0x15effafaL, 0xebb25959L, 0xc98e4747L, 0x0bfbf0f0L, + 0xec41adadL, 0x67b3d4d4L, 0xfd5fa2a2L, 0xea45afafL, + 0xbf239c9cL, 0xf753a4a4L, 0x96e47272L, 0x5b9bc0c0L, + 0xc275b7b7L, 0x1ce1fdfdL, 0xae3d9393L, 0x6a4c2626L, + 0x5a6c3636L, 0x417e3f3fL, 0x02f5f7f7L, 0x4f83ccccL, + 0x5c683434L, 0xf451a5a5L, 0x34d1e5e5L, 0x08f9f1f1L, + 0x93e27171L, 0x73abd8d8L, 0x53623131L, 0x3f2a1515L, + 0x0c080404L, 0x5295c7c7L, 0x65462323L, 0x5e9dc3c3L, + 0x28301818L, 0xa1379696L, 0x0f0a0505L, 0xb52f9a9aL, + 0x090e0707L, 0x36241212L, 0x9b1b8080L, 0x3ddfe2e2L, + 0x26cdebebL, 0x694e2727L, 0xcd7fb2b2L, 0x9fea7575L, + 0x1b120909L, 0x9e1d8383L, 0x74582c2cL, 0x2e341a1aL, + 0x2d361b1bL, 0xb2dc6e6eL, 0xeeb45a5aL, 0xfb5ba0a0L, + 0xf6a45252L, 0x4d763b3bL, 0x61b7d6d6L, 0xce7db3b3L, + 0x7b522929L, 0x3edde3e3L, 0x715e2f2fL, 0x97138484L, + 0xf5a65353L, 0x68b9d1d1L, 0x00000000L, 0x2cc1ededL, + 0x60402020L, 0x1fe3fcfcL, 0xc879b1b1L, 0xedb65b5bL, + 0xbed46a6aL, 0x468dcbcbL, 0xd967bebeL, 0x4b723939L, + 0xde944a4aL, 0xd4984c4cL, 0xe8b05858L, 0x4a85cfcfL, + 0x6bbbd0d0L, 0x2ac5efefL, 0xe54faaaaL, 0x16edfbfbL, + 0xc5864343L, 0xd79a4d4dL, 0x55663333L, 0x94118585L, + 0xcf8a4545L, 0x10e9f9f9L, 0x06040202L, 0x81fe7f7fL, + 0xf0a05050L, 0x44783c3cL, 0xba259f9fL, 0xe34ba8a8L, + 0xf3a25151L, 0xfe5da3a3L, 0xc0804040L, 0x8a058f8fL, + 0xad3f9292L, 0xbc219d9dL, 0x48703838L, 0x04f1f5f5L, + 0xdf63bcbcL, 0xc177b6b6L, 0x75afdadaL, 0x63422121L, + 0x30201010L, 0x1ae5ffffL, 0x0efdf3f3L, 0x6dbfd2d2L, + 0x4c81cdcdL, 0x14180c0cL, 0x35261313L, 0x2fc3ececL, + 0xe1be5f5fL, 0xa2359797L, 0xcc884444L, 0x392e1717L, + 0x5793c4c4L, 0xf255a7a7L, 0x82fc7e7eL, 0x477a3d3dL, + 0xacc86464L, 0xe7ba5d5dL, 0x2b321919L, 0x95e67373L, + 0xa0c06060L, 0x98198181L, 0xd19e4f4fL, 0x7fa3dcdcL, + 0x66442222L, 0x7e542a2aL, 0xab3b9090L, 0x830b8888L, + 0xca8c4646L, 0x29c7eeeeL, 0xd36bb8b8L, 0x3c281414L, + 0x79a7dedeL, 0xe2bc5e5eL, 0x1d160b0bL, 0x76addbdbL, + 0x3bdbe0e0L, 0x56643232L, 0x4e743a3aL, 0x1e140a0aL, + 0xdb924949L, 0x0a0c0606L, 0x6c482424L, 0xe4b85c5cL, + 0x5d9fc2c2L, 0x6ebdd3d3L, 0xef43acacL, 0xa6c46262L, + 0xa8399191L, 0xa4319595L, 0x37d3e4e4L, 0x8bf27979L, + 0x32d5e7e7L, 0x438bc8c8L, 0x596e3737L, 0xb7da6d6dL, + 0x8c018d8dL, 0x64b1d5d5L, 0xd29c4e4eL, 0xe049a9a9L, + 0xb4d86c6cL, 0xfaac5656L, 0x07f3f4f4L, 0x25cfeaeaL, + 0xafca6565L, 0x8ef47a7aL, 0xe947aeaeL, 0x18100808L, + 0xd56fbabaL, 0x88f07878L, 0x6f4a2525L, 0x725c2e2eL, + 0x24381c1cL, 0xf157a6a6L, 0xc773b4b4L, 0x5197c6c6L, + 0x23cbe8e8L, 0x7ca1ddddL, 0x9ce87474L, 0x213e1f1fL, + 0xdd964b4bL, 0xdc61bdbdL, 0x860d8b8bL, 0x850f8a8aL, + 0x90e07070L, 0x427c3e3eL, 0xc471b5b5L, 0xaacc6666L, + 0xd8904848L, 0x05060303L, 0x01f7f6f6L, 0x121c0e0eL, + 0xa3c26161L, 0x5f6a3535L, 0xf9ae5757L, 0xd069b9b9L, + 0x91178686L, 0x5899c1c1L, 0x273a1d1dL, 0xb9279e9eL, + 0x38d9e1e1L, 0x13ebf8f8L, 0xb32b9898L, 0x33221111L, + 0xbbd26969L, 0x70a9d9d9L, 0x89078e8eL, 0xa7339494L, + 0xb62d9b9bL, 0x223c1e1eL, 0x92158787L, 0x20c9e9e9L, + 0x4987ceceL, 0xffaa5555L, 0x78502828L, 0x7aa5dfdfL, + 0x8f038c8cL, 0xf859a1a1L, 0x80098989L, 0x171a0d0dL, + 0xda65bfbfL, 0x31d7e6e6L, 0xc6844242L, 0xb8d06868L, + 0xc3824141L, 0xb0299999L, 0x775a2d2dL, 0x111e0f0fL, + 0xcb7bb0b0L, 0xfca85454L, 0xd66dbbbbL, 0x3a2c1616L, +] Te2 = [ - 0x63a5c663L, 0x7c84f87cL, 0x7799ee77L, 0x7b8df67bL, - 0xf20dfff2L, 0x6bbdd66bL, 0x6fb1de6fL, 0xc55491c5L, - 0x30506030L, 0x01030201L, 0x67a9ce67L, 0x2b7d562bL, - 0xfe19e7feL, 0xd762b5d7L, 0xabe64dabL, 0x769aec76L, - 0xca458fcaL, 0x829d1f82L, 0xc94089c9L, 0x7d87fa7dL, - 0xfa15effaL, 0x59ebb259L, 0x47c98e47L, 0xf00bfbf0L, - 0xadec41adL, 0xd467b3d4L, 0xa2fd5fa2L, 0xafea45afL, - 0x9cbf239cL, 0xa4f753a4L, 0x7296e472L, 0xc05b9bc0L, - 0xb7c275b7L, 0xfd1ce1fdL, 0x93ae3d93L, 0x266a4c26L, - 0x365a6c36L, 0x3f417e3fL, 0xf702f5f7L, 0xcc4f83ccL, - 0x345c6834L, 0xa5f451a5L, 0xe534d1e5L, 0xf108f9f1L, - 0x7193e271L, 0xd873abd8L, 0x31536231L, 0x153f2a15L, - 0x040c0804L, 0xc75295c7L, 0x23654623L, 0xc35e9dc3L, - 0x18283018L, 0x96a13796L, 0x050f0a05L, 0x9ab52f9aL, - 0x07090e07L, 0x12362412L, 0x809b1b80L, 0xe23ddfe2L, - 0xeb26cdebL, 0x27694e27L, 0xb2cd7fb2L, 0x759fea75L, - 0x091b1209L, 0x839e1d83L, 0x2c74582cL, 0x1a2e341aL, - 0x1b2d361bL, 0x6eb2dc6eL, 0x5aeeb45aL, 0xa0fb5ba0L, - 0x52f6a452L, 0x3b4d763bL, 0xd661b7d6L, 0xb3ce7db3L, - 0x297b5229L, 0xe33edde3L, 0x2f715e2fL, 0x84971384L, - 0x53f5a653L, 0xd168b9d1L, 0x00000000L, 0xed2cc1edL, - 0x20604020L, 0xfc1fe3fcL, 0xb1c879b1L, 0x5bedb65bL, - 0x6abed46aL, 0xcb468dcbL, 0xbed967beL, 0x394b7239L, - 0x4ade944aL, 0x4cd4984cL, 0x58e8b058L, 0xcf4a85cfL, - 0xd06bbbd0L, 0xef2ac5efL, 0xaae54faaL, 0xfb16edfbL, - 0x43c58643L, 0x4dd79a4dL, 0x33556633L, 0x85941185L, - 0x45cf8a45L, 0xf910e9f9L, 0x02060402L, 0x7f81fe7fL, - 0x50f0a050L, 0x3c44783cL, 0x9fba259fL, 0xa8e34ba8L, - 0x51f3a251L, 0xa3fe5da3L, 0x40c08040L, 0x8f8a058fL, - 0x92ad3f92L, 0x9dbc219dL, 0x38487038L, 0xf504f1f5L, - 0xbcdf63bcL, 0xb6c177b6L, 0xda75afdaL, 0x21634221L, - 0x10302010L, 0xff1ae5ffL, 0xf30efdf3L, 0xd26dbfd2L, - 0xcd4c81cdL, 0x0c14180cL, 0x13352613L, 0xec2fc3ecL, - 0x5fe1be5fL, 0x97a23597L, 0x44cc8844L, 0x17392e17L, - 0xc45793c4L, 0xa7f255a7L, 0x7e82fc7eL, 0x3d477a3dL, - 0x64acc864L, 0x5de7ba5dL, 0x192b3219L, 0x7395e673L, - 0x60a0c060L, 0x81981981L, 0x4fd19e4fL, 0xdc7fa3dcL, - 0x22664422L, 0x2a7e542aL, 0x90ab3b90L, 0x88830b88L, - 0x46ca8c46L, 0xee29c7eeL, 0xb8d36bb8L, 0x143c2814L, - 0xde79a7deL, 0x5ee2bc5eL, 0x0b1d160bL, 0xdb76addbL, - 0xe03bdbe0L, 0x32566432L, 0x3a4e743aL, 0x0a1e140aL, - 0x49db9249L, 0x060a0c06L, 0x246c4824L, 0x5ce4b85cL, - 0xc25d9fc2L, 0xd36ebdd3L, 0xacef43acL, 0x62a6c462L, - 0x91a83991L, 0x95a43195L, 0xe437d3e4L, 0x798bf279L, - 0xe732d5e7L, 0xc8438bc8L, 0x37596e37L, 0x6db7da6dL, - 0x8d8c018dL, 0xd564b1d5L, 0x4ed29c4eL, 0xa9e049a9L, - 0x6cb4d86cL, 0x56faac56L, 0xf407f3f4L, 0xea25cfeaL, - 0x65afca65L, 0x7a8ef47aL, 0xaee947aeL, 0x08181008L, - 0xbad56fbaL, 0x7888f078L, 0x256f4a25L, 0x2e725c2eL, - 0x1c24381cL, 0xa6f157a6L, 0xb4c773b4L, 0xc65197c6L, - 0xe823cbe8L, 0xdd7ca1ddL, 0x749ce874L, 0x1f213e1fL, - 0x4bdd964bL, 0xbddc61bdL, 0x8b860d8bL, 0x8a850f8aL, - 0x7090e070L, 0x3e427c3eL, 0xb5c471b5L, 0x66aacc66L, - 0x48d89048L, 0x03050603L, 0xf601f7f6L, 0x0e121c0eL, - 0x61a3c261L, 0x355f6a35L, 0x57f9ae57L, 0xb9d069b9L, - 0x86911786L, 0xc15899c1L, 0x1d273a1dL, 0x9eb9279eL, - 0xe138d9e1L, 0xf813ebf8L, 0x98b32b98L, 0x11332211L, - 0x69bbd269L, 0xd970a9d9L, 0x8e89078eL, 0x94a73394L, - 0x9bb62d9bL, 0x1e223c1eL, 0x87921587L, 0xe920c9e9L, - 0xce4987ceL, 0x55ffaa55L, 0x28785028L, 0xdf7aa5dfL, - 0x8c8f038cL, 0xa1f859a1L, 0x89800989L, 0x0d171a0dL, - 0xbfda65bfL, 0xe631d7e6L, 0x42c68442L, 0x68b8d068L, - 0x41c38241L, 0x99b02999L, 0x2d775a2dL, 0x0f111e0fL, - 0xb0cb7bb0L, 0x54fca854L, 0xbbd66dbbL, 0x163a2c16L, - ] + 0x63a5c663L, 0x7c84f87cL, 0x7799ee77L, 0x7b8df67bL, + 0xf20dfff2L, 0x6bbdd66bL, 0x6fb1de6fL, 0xc55491c5L, + 0x30506030L, 0x01030201L, 0x67a9ce67L, 0x2b7d562bL, + 0xfe19e7feL, 0xd762b5d7L, 0xabe64dabL, 0x769aec76L, + 0xca458fcaL, 0x829d1f82L, 0xc94089c9L, 0x7d87fa7dL, + 0xfa15effaL, 0x59ebb259L, 0x47c98e47L, 0xf00bfbf0L, + 0xadec41adL, 0xd467b3d4L, 0xa2fd5fa2L, 0xafea45afL, + 0x9cbf239cL, 0xa4f753a4L, 0x7296e472L, 0xc05b9bc0L, + 0xb7c275b7L, 0xfd1ce1fdL, 0x93ae3d93L, 0x266a4c26L, + 0x365a6c36L, 0x3f417e3fL, 0xf702f5f7L, 0xcc4f83ccL, + 0x345c6834L, 0xa5f451a5L, 0xe534d1e5L, 0xf108f9f1L, + 0x7193e271L, 0xd873abd8L, 0x31536231L, 0x153f2a15L, + 0x040c0804L, 0xc75295c7L, 0x23654623L, 0xc35e9dc3L, + 0x18283018L, 0x96a13796L, 0x050f0a05L, 0x9ab52f9aL, + 0x07090e07L, 0x12362412L, 0x809b1b80L, 0xe23ddfe2L, + 0xeb26cdebL, 0x27694e27L, 0xb2cd7fb2L, 0x759fea75L, + 0x091b1209L, 0x839e1d83L, 0x2c74582cL, 0x1a2e341aL, + 0x1b2d361bL, 0x6eb2dc6eL, 0x5aeeb45aL, 0xa0fb5ba0L, + 0x52f6a452L, 0x3b4d763bL, 0xd661b7d6L, 0xb3ce7db3L, + 0x297b5229L, 0xe33edde3L, 0x2f715e2fL, 0x84971384L, + 0x53f5a653L, 0xd168b9d1L, 0x00000000L, 0xed2cc1edL, + 0x20604020L, 0xfc1fe3fcL, 0xb1c879b1L, 0x5bedb65bL, + 0x6abed46aL, 0xcb468dcbL, 0xbed967beL, 0x394b7239L, + 0x4ade944aL, 0x4cd4984cL, 0x58e8b058L, 0xcf4a85cfL, + 0xd06bbbd0L, 0xef2ac5efL, 0xaae54faaL, 0xfb16edfbL, + 0x43c58643L, 0x4dd79a4dL, 0x33556633L, 0x85941185L, + 0x45cf8a45L, 0xf910e9f9L, 0x02060402L, 0x7f81fe7fL, + 0x50f0a050L, 0x3c44783cL, 0x9fba259fL, 0xa8e34ba8L, + 0x51f3a251L, 0xa3fe5da3L, 0x40c08040L, 0x8f8a058fL, + 0x92ad3f92L, 0x9dbc219dL, 0x38487038L, 0xf504f1f5L, + 0xbcdf63bcL, 0xb6c177b6L, 0xda75afdaL, 0x21634221L, + 0x10302010L, 0xff1ae5ffL, 0xf30efdf3L, 0xd26dbfd2L, + 0xcd4c81cdL, 0x0c14180cL, 0x13352613L, 0xec2fc3ecL, + 0x5fe1be5fL, 0x97a23597L, 0x44cc8844L, 0x17392e17L, + 0xc45793c4L, 0xa7f255a7L, 0x7e82fc7eL, 0x3d477a3dL, + 0x64acc864L, 0x5de7ba5dL, 0x192b3219L, 0x7395e673L, + 0x60a0c060L, 0x81981981L, 0x4fd19e4fL, 0xdc7fa3dcL, + 0x22664422L, 0x2a7e542aL, 0x90ab3b90L, 0x88830b88L, + 0x46ca8c46L, 0xee29c7eeL, 0xb8d36bb8L, 0x143c2814L, + 0xde79a7deL, 0x5ee2bc5eL, 0x0b1d160bL, 0xdb76addbL, + 0xe03bdbe0L, 0x32566432L, 0x3a4e743aL, 0x0a1e140aL, + 0x49db9249L, 0x060a0c06L, 0x246c4824L, 0x5ce4b85cL, + 0xc25d9fc2L, 0xd36ebdd3L, 0xacef43acL, 0x62a6c462L, + 0x91a83991L, 0x95a43195L, 0xe437d3e4L, 0x798bf279L, + 0xe732d5e7L, 0xc8438bc8L, 0x37596e37L, 0x6db7da6dL, + 0x8d8c018dL, 0xd564b1d5L, 0x4ed29c4eL, 0xa9e049a9L, + 0x6cb4d86cL, 0x56faac56L, 0xf407f3f4L, 0xea25cfeaL, + 0x65afca65L, 0x7a8ef47aL, 0xaee947aeL, 0x08181008L, + 0xbad56fbaL, 0x7888f078L, 0x256f4a25L, 0x2e725c2eL, + 0x1c24381cL, 0xa6f157a6L, 0xb4c773b4L, 0xc65197c6L, + 0xe823cbe8L, 0xdd7ca1ddL, 0x749ce874L, 0x1f213e1fL, + 0x4bdd964bL, 0xbddc61bdL, 0x8b860d8bL, 0x8a850f8aL, + 0x7090e070L, 0x3e427c3eL, 0xb5c471b5L, 0x66aacc66L, + 0x48d89048L, 0x03050603L, 0xf601f7f6L, 0x0e121c0eL, + 0x61a3c261L, 0x355f6a35L, 0x57f9ae57L, 0xb9d069b9L, + 0x86911786L, 0xc15899c1L, 0x1d273a1dL, 0x9eb9279eL, + 0xe138d9e1L, 0xf813ebf8L, 0x98b32b98L, 0x11332211L, + 0x69bbd269L, 0xd970a9d9L, 0x8e89078eL, 0x94a73394L, + 0x9bb62d9bL, 0x1e223c1eL, 0x87921587L, 0xe920c9e9L, + 0xce4987ceL, 0x55ffaa55L, 0x28785028L, 0xdf7aa5dfL, + 0x8c8f038cL, 0xa1f859a1L, 0x89800989L, 0x0d171a0dL, + 0xbfda65bfL, 0xe631d7e6L, 0x42c68442L, 0x68b8d068L, + 0x41c38241L, 0x99b02999L, 0x2d775a2dL, 0x0f111e0fL, + 0xb0cb7bb0L, 0x54fca854L, 0xbbd66dbbL, 0x163a2c16L, +] Te3 = [ - 0x6363a5c6L, 0x7c7c84f8L, 0x777799eeL, 0x7b7b8df6L, - 0xf2f20dffL, 0x6b6bbdd6L, 0x6f6fb1deL, 0xc5c55491L, - 0x30305060L, 0x01010302L, 0x6767a9ceL, 0x2b2b7d56L, - 0xfefe19e7L, 0xd7d762b5L, 0xababe64dL, 0x76769aecL, - 0xcaca458fL, 0x82829d1fL, 0xc9c94089L, 0x7d7d87faL, - 0xfafa15efL, 0x5959ebb2L, 0x4747c98eL, 0xf0f00bfbL, - 0xadadec41L, 0xd4d467b3L, 0xa2a2fd5fL, 0xafafea45L, - 0x9c9cbf23L, 0xa4a4f753L, 0x727296e4L, 0xc0c05b9bL, - 0xb7b7c275L, 0xfdfd1ce1L, 0x9393ae3dL, 0x26266a4cL, - 0x36365a6cL, 0x3f3f417eL, 0xf7f702f5L, 0xcccc4f83L, - 0x34345c68L, 0xa5a5f451L, 0xe5e534d1L, 0xf1f108f9L, - 0x717193e2L, 0xd8d873abL, 0x31315362L, 0x15153f2aL, - 0x04040c08L, 0xc7c75295L, 0x23236546L, 0xc3c35e9dL, - 0x18182830L, 0x9696a137L, 0x05050f0aL, 0x9a9ab52fL, - 0x0707090eL, 0x12123624L, 0x80809b1bL, 0xe2e23ddfL, - 0xebeb26cdL, 0x2727694eL, 0xb2b2cd7fL, 0x75759feaL, - 0x09091b12L, 0x83839e1dL, 0x2c2c7458L, 0x1a1a2e34L, - 0x1b1b2d36L, 0x6e6eb2dcL, 0x5a5aeeb4L, 0xa0a0fb5bL, - 0x5252f6a4L, 0x3b3b4d76L, 0xd6d661b7L, 0xb3b3ce7dL, - 0x29297b52L, 0xe3e33eddL, 0x2f2f715eL, 0x84849713L, - 0x5353f5a6L, 0xd1d168b9L, 0x00000000L, 0xeded2cc1L, - 0x20206040L, 0xfcfc1fe3L, 0xb1b1c879L, 0x5b5bedb6L, - 0x6a6abed4L, 0xcbcb468dL, 0xbebed967L, 0x39394b72L, - 0x4a4ade94L, 0x4c4cd498L, 0x5858e8b0L, 0xcfcf4a85L, - 0xd0d06bbbL, 0xefef2ac5L, 0xaaaae54fL, 0xfbfb16edL, - 0x4343c586L, 0x4d4dd79aL, 0x33335566L, 0x85859411L, - 0x4545cf8aL, 0xf9f910e9L, 0x02020604L, 0x7f7f81feL, - 0x5050f0a0L, 0x3c3c4478L, 0x9f9fba25L, 0xa8a8e34bL, - 0x5151f3a2L, 0xa3a3fe5dL, 0x4040c080L, 0x8f8f8a05L, - 0x9292ad3fL, 0x9d9dbc21L, 0x38384870L, 0xf5f504f1L, - 0xbcbcdf63L, 0xb6b6c177L, 0xdada75afL, 0x21216342L, - 0x10103020L, 0xffff1ae5L, 0xf3f30efdL, 0xd2d26dbfL, - 0xcdcd4c81L, 0x0c0c1418L, 0x13133526L, 0xecec2fc3L, - 0x5f5fe1beL, 0x9797a235L, 0x4444cc88L, 0x1717392eL, - 0xc4c45793L, 0xa7a7f255L, 0x7e7e82fcL, 0x3d3d477aL, - 0x6464acc8L, 0x5d5de7baL, 0x19192b32L, 0x737395e6L, - 0x6060a0c0L, 0x81819819L, 0x4f4fd19eL, 0xdcdc7fa3L, - 0x22226644L, 0x2a2a7e54L, 0x9090ab3bL, 0x8888830bL, - 0x4646ca8cL, 0xeeee29c7L, 0xb8b8d36bL, 0x14143c28L, - 0xdede79a7L, 0x5e5ee2bcL, 0x0b0b1d16L, 0xdbdb76adL, - 0xe0e03bdbL, 0x32325664L, 0x3a3a4e74L, 0x0a0a1e14L, - 0x4949db92L, 0x06060a0cL, 0x24246c48L, 0x5c5ce4b8L, - 0xc2c25d9fL, 0xd3d36ebdL, 0xacacef43L, 0x6262a6c4L, - 0x9191a839L, 0x9595a431L, 0xe4e437d3L, 0x79798bf2L, - 0xe7e732d5L, 0xc8c8438bL, 0x3737596eL, 0x6d6db7daL, - 0x8d8d8c01L, 0xd5d564b1L, 0x4e4ed29cL, 0xa9a9e049L, - 0x6c6cb4d8L, 0x5656faacL, 0xf4f407f3L, 0xeaea25cfL, - 0x6565afcaL, 0x7a7a8ef4L, 0xaeaee947L, 0x08081810L, - 0xbabad56fL, 0x787888f0L, 0x25256f4aL, 0x2e2e725cL, - 0x1c1c2438L, 0xa6a6f157L, 0xb4b4c773L, 0xc6c65197L, - 0xe8e823cbL, 0xdddd7ca1L, 0x74749ce8L, 0x1f1f213eL, - 0x4b4bdd96L, 0xbdbddc61L, 0x8b8b860dL, 0x8a8a850fL, - 0x707090e0L, 0x3e3e427cL, 0xb5b5c471L, 0x6666aaccL, - 0x4848d890L, 0x03030506L, 0xf6f601f7L, 0x0e0e121cL, - 0x6161a3c2L, 0x35355f6aL, 0x5757f9aeL, 0xb9b9d069L, - 0x86869117L, 0xc1c15899L, 0x1d1d273aL, 0x9e9eb927L, - 0xe1e138d9L, 0xf8f813ebL, 0x9898b32bL, 0x11113322L, - 0x6969bbd2L, 0xd9d970a9L, 0x8e8e8907L, 0x9494a733L, - 0x9b9bb62dL, 0x1e1e223cL, 0x87879215L, 0xe9e920c9L, - 0xcece4987L, 0x5555ffaaL, 0x28287850L, 0xdfdf7aa5L, - 0x8c8c8f03L, 0xa1a1f859L, 0x89898009L, 0x0d0d171aL, - 0xbfbfda65L, 0xe6e631d7L, 0x4242c684L, 0x6868b8d0L, - 0x4141c382L, 0x9999b029L, 0x2d2d775aL, 0x0f0f111eL, - 0xb0b0cb7bL, 0x5454fca8L, 0xbbbbd66dL, 0x16163a2cL, - ] + 0x6363a5c6L, 0x7c7c84f8L, 0x777799eeL, 0x7b7b8df6L, + 0xf2f20dffL, 0x6b6bbdd6L, 0x6f6fb1deL, 0xc5c55491L, + 0x30305060L, 0x01010302L, 0x6767a9ceL, 0x2b2b7d56L, + 0xfefe19e7L, 0xd7d762b5L, 0xababe64dL, 0x76769aecL, + 0xcaca458fL, 0x82829d1fL, 0xc9c94089L, 0x7d7d87faL, + 0xfafa15efL, 0x5959ebb2L, 0x4747c98eL, 0xf0f00bfbL, + 0xadadec41L, 0xd4d467b3L, 0xa2a2fd5fL, 0xafafea45L, + 0x9c9cbf23L, 0xa4a4f753L, 0x727296e4L, 0xc0c05b9bL, + 0xb7b7c275L, 0xfdfd1ce1L, 0x9393ae3dL, 0x26266a4cL, + 0x36365a6cL, 0x3f3f417eL, 0xf7f702f5L, 0xcccc4f83L, + 0x34345c68L, 0xa5a5f451L, 0xe5e534d1L, 0xf1f108f9L, + 0x717193e2L, 0xd8d873abL, 0x31315362L, 0x15153f2aL, + 0x04040c08L, 0xc7c75295L, 0x23236546L, 0xc3c35e9dL, + 0x18182830L, 0x9696a137L, 0x05050f0aL, 0x9a9ab52fL, + 0x0707090eL, 0x12123624L, 0x80809b1bL, 0xe2e23ddfL, + 0xebeb26cdL, 0x2727694eL, 0xb2b2cd7fL, 0x75759feaL, + 0x09091b12L, 0x83839e1dL, 0x2c2c7458L, 0x1a1a2e34L, + 0x1b1b2d36L, 0x6e6eb2dcL, 0x5a5aeeb4L, 0xa0a0fb5bL, + 0x5252f6a4L, 0x3b3b4d76L, 0xd6d661b7L, 0xb3b3ce7dL, + 0x29297b52L, 0xe3e33eddL, 0x2f2f715eL, 0x84849713L, + 0x5353f5a6L, 0xd1d168b9L, 0x00000000L, 0xeded2cc1L, + 0x20206040L, 0xfcfc1fe3L, 0xb1b1c879L, 0x5b5bedb6L, + 0x6a6abed4L, 0xcbcb468dL, 0xbebed967L, 0x39394b72L, + 0x4a4ade94L, 0x4c4cd498L, 0x5858e8b0L, 0xcfcf4a85L, + 0xd0d06bbbL, 0xefef2ac5L, 0xaaaae54fL, 0xfbfb16edL, + 0x4343c586L, 0x4d4dd79aL, 0x33335566L, 0x85859411L, + 0x4545cf8aL, 0xf9f910e9L, 0x02020604L, 0x7f7f81feL, + 0x5050f0a0L, 0x3c3c4478L, 0x9f9fba25L, 0xa8a8e34bL, + 0x5151f3a2L, 0xa3a3fe5dL, 0x4040c080L, 0x8f8f8a05L, + 0x9292ad3fL, 0x9d9dbc21L, 0x38384870L, 0xf5f504f1L, + 0xbcbcdf63L, 0xb6b6c177L, 0xdada75afL, 0x21216342L, + 0x10103020L, 0xffff1ae5L, 0xf3f30efdL, 0xd2d26dbfL, + 0xcdcd4c81L, 0x0c0c1418L, 0x13133526L, 0xecec2fc3L, + 0x5f5fe1beL, 0x9797a235L, 0x4444cc88L, 0x1717392eL, + 0xc4c45793L, 0xa7a7f255L, 0x7e7e82fcL, 0x3d3d477aL, + 0x6464acc8L, 0x5d5de7baL, 0x19192b32L, 0x737395e6L, + 0x6060a0c0L, 0x81819819L, 0x4f4fd19eL, 0xdcdc7fa3L, + 0x22226644L, 0x2a2a7e54L, 0x9090ab3bL, 0x8888830bL, + 0x4646ca8cL, 0xeeee29c7L, 0xb8b8d36bL, 0x14143c28L, + 0xdede79a7L, 0x5e5ee2bcL, 0x0b0b1d16L, 0xdbdb76adL, + 0xe0e03bdbL, 0x32325664L, 0x3a3a4e74L, 0x0a0a1e14L, + 0x4949db92L, 0x06060a0cL, 0x24246c48L, 0x5c5ce4b8L, + 0xc2c25d9fL, 0xd3d36ebdL, 0xacacef43L, 0x6262a6c4L, + 0x9191a839L, 0x9595a431L, 0xe4e437d3L, 0x79798bf2L, + 0xe7e732d5L, 0xc8c8438bL, 0x3737596eL, 0x6d6db7daL, + 0x8d8d8c01L, 0xd5d564b1L, 0x4e4ed29cL, 0xa9a9e049L, + 0x6c6cb4d8L, 0x5656faacL, 0xf4f407f3L, 0xeaea25cfL, + 0x6565afcaL, 0x7a7a8ef4L, 0xaeaee947L, 0x08081810L, + 0xbabad56fL, 0x787888f0L, 0x25256f4aL, 0x2e2e725cL, + 0x1c1c2438L, 0xa6a6f157L, 0xb4b4c773L, 0xc6c65197L, + 0xe8e823cbL, 0xdddd7ca1L, 0x74749ce8L, 0x1f1f213eL, + 0x4b4bdd96L, 0xbdbddc61L, 0x8b8b860dL, 0x8a8a850fL, + 0x707090e0L, 0x3e3e427cL, 0xb5b5c471L, 0x6666aaccL, + 0x4848d890L, 0x03030506L, 0xf6f601f7L, 0x0e0e121cL, + 0x6161a3c2L, 0x35355f6aL, 0x5757f9aeL, 0xb9b9d069L, + 0x86869117L, 0xc1c15899L, 0x1d1d273aL, 0x9e9eb927L, + 0xe1e138d9L, 0xf8f813ebL, 0x9898b32bL, 0x11113322L, + 0x6969bbd2L, 0xd9d970a9L, 0x8e8e8907L, 0x9494a733L, + 0x9b9bb62dL, 0x1e1e223cL, 0x87879215L, 0xe9e920c9L, + 0xcece4987L, 0x5555ffaaL, 0x28287850L, 0xdfdf7aa5L, + 0x8c8c8f03L, 0xa1a1f859L, 0x89898009L, 0x0d0d171aL, + 0xbfbfda65L, 0xe6e631d7L, 0x4242c684L, 0x6868b8d0L, + 0x4141c382L, 0x9999b029L, 0x2d2d775aL, 0x0f0f111eL, + 0xb0b0cb7bL, 0x5454fca8L, 0xbbbbd66dL, 0x16163a2cL, +] Te4 = [ - 0x63636363L, 0x7c7c7c7cL, 0x77777777L, 0x7b7b7b7bL, - 0xf2f2f2f2L, 0x6b6b6b6bL, 0x6f6f6f6fL, 0xc5c5c5c5L, - 0x30303030L, 0x01010101L, 0x67676767L, 0x2b2b2b2bL, - 0xfefefefeL, 0xd7d7d7d7L, 0xababababL, 0x76767676L, - 0xcacacacaL, 0x82828282L, 0xc9c9c9c9L, 0x7d7d7d7dL, - 0xfafafafaL, 0x59595959L, 0x47474747L, 0xf0f0f0f0L, - 0xadadadadL, 0xd4d4d4d4L, 0xa2a2a2a2L, 0xafafafafL, - 0x9c9c9c9cL, 0xa4a4a4a4L, 0x72727272L, 0xc0c0c0c0L, - 0xb7b7b7b7L, 0xfdfdfdfdL, 0x93939393L, 0x26262626L, - 0x36363636L, 0x3f3f3f3fL, 0xf7f7f7f7L, 0xccccccccL, - 0x34343434L, 0xa5a5a5a5L, 0xe5e5e5e5L, 0xf1f1f1f1L, - 0x71717171L, 0xd8d8d8d8L, 0x31313131L, 0x15151515L, - 0x04040404L, 0xc7c7c7c7L, 0x23232323L, 0xc3c3c3c3L, - 0x18181818L, 0x96969696L, 0x05050505L, 0x9a9a9a9aL, - 0x07070707L, 0x12121212L, 0x80808080L, 0xe2e2e2e2L, - 0xebebebebL, 0x27272727L, 0xb2b2b2b2L, 0x75757575L, - 0x09090909L, 0x83838383L, 0x2c2c2c2cL, 0x1a1a1a1aL, - 0x1b1b1b1bL, 0x6e6e6e6eL, 0x5a5a5a5aL, 0xa0a0a0a0L, - 0x52525252L, 0x3b3b3b3bL, 0xd6d6d6d6L, 0xb3b3b3b3L, - 0x29292929L, 0xe3e3e3e3L, 0x2f2f2f2fL, 0x84848484L, - 0x53535353L, 0xd1d1d1d1L, 0x00000000L, 0xededededL, - 0x20202020L, 0xfcfcfcfcL, 0xb1b1b1b1L, 0x5b5b5b5bL, - 0x6a6a6a6aL, 0xcbcbcbcbL, 0xbebebebeL, 0x39393939L, - 0x4a4a4a4aL, 0x4c4c4c4cL, 0x58585858L, 0xcfcfcfcfL, - 0xd0d0d0d0L, 0xefefefefL, 0xaaaaaaaaL, 0xfbfbfbfbL, - 0x43434343L, 0x4d4d4d4dL, 0x33333333L, 0x85858585L, - 0x45454545L, 0xf9f9f9f9L, 0x02020202L, 0x7f7f7f7fL, - 0x50505050L, 0x3c3c3c3cL, 0x9f9f9f9fL, 0xa8a8a8a8L, - 0x51515151L, 0xa3a3a3a3L, 0x40404040L, 0x8f8f8f8fL, - 0x92929292L, 0x9d9d9d9dL, 0x38383838L, 0xf5f5f5f5L, - 0xbcbcbcbcL, 0xb6b6b6b6L, 0xdadadadaL, 0x21212121L, - 0x10101010L, 0xffffffffL, 0xf3f3f3f3L, 0xd2d2d2d2L, - 0xcdcdcdcdL, 0x0c0c0c0cL, 0x13131313L, 0xececececL, - 0x5f5f5f5fL, 0x97979797L, 0x44444444L, 0x17171717L, - 0xc4c4c4c4L, 0xa7a7a7a7L, 0x7e7e7e7eL, 0x3d3d3d3dL, - 0x64646464L, 0x5d5d5d5dL, 0x19191919L, 0x73737373L, - 0x60606060L, 0x81818181L, 0x4f4f4f4fL, 0xdcdcdcdcL, - 0x22222222L, 0x2a2a2a2aL, 0x90909090L, 0x88888888L, - 0x46464646L, 0xeeeeeeeeL, 0xb8b8b8b8L, 0x14141414L, - 0xdedededeL, 0x5e5e5e5eL, 0x0b0b0b0bL, 0xdbdbdbdbL, - 0xe0e0e0e0L, 0x32323232L, 0x3a3a3a3aL, 0x0a0a0a0aL, - 0x49494949L, 0x06060606L, 0x24242424L, 0x5c5c5c5cL, - 0xc2c2c2c2L, 0xd3d3d3d3L, 0xacacacacL, 0x62626262L, - 0x91919191L, 0x95959595L, 0xe4e4e4e4L, 0x79797979L, - 0xe7e7e7e7L, 0xc8c8c8c8L, 0x37373737L, 0x6d6d6d6dL, - 0x8d8d8d8dL, 0xd5d5d5d5L, 0x4e4e4e4eL, 0xa9a9a9a9L, - 0x6c6c6c6cL, 0x56565656L, 0xf4f4f4f4L, 0xeaeaeaeaL, - 0x65656565L, 0x7a7a7a7aL, 0xaeaeaeaeL, 0x08080808L, - 0xbabababaL, 0x78787878L, 0x25252525L, 0x2e2e2e2eL, - 0x1c1c1c1cL, 0xa6a6a6a6L, 0xb4b4b4b4L, 0xc6c6c6c6L, - 0xe8e8e8e8L, 0xddddddddL, 0x74747474L, 0x1f1f1f1fL, - 0x4b4b4b4bL, 0xbdbdbdbdL, 0x8b8b8b8bL, 0x8a8a8a8aL, - 0x70707070L, 0x3e3e3e3eL, 0xb5b5b5b5L, 0x66666666L, - 0x48484848L, 0x03030303L, 0xf6f6f6f6L, 0x0e0e0e0eL, - 0x61616161L, 0x35353535L, 0x57575757L, 0xb9b9b9b9L, - 0x86868686L, 0xc1c1c1c1L, 0x1d1d1d1dL, 0x9e9e9e9eL, - 0xe1e1e1e1L, 0xf8f8f8f8L, 0x98989898L, 0x11111111L, - 0x69696969L, 0xd9d9d9d9L, 0x8e8e8e8eL, 0x94949494L, - 0x9b9b9b9bL, 0x1e1e1e1eL, 0x87878787L, 0xe9e9e9e9L, - 0xcecececeL, 0x55555555L, 0x28282828L, 0xdfdfdfdfL, - 0x8c8c8c8cL, 0xa1a1a1a1L, 0x89898989L, 0x0d0d0d0dL, - 0xbfbfbfbfL, 0xe6e6e6e6L, 0x42424242L, 0x68686868L, - 0x41414141L, 0x99999999L, 0x2d2d2d2dL, 0x0f0f0f0fL, - 0xb0b0b0b0L, 0x54545454L, 0xbbbbbbbbL, 0x16161616L, - ] + 0x63636363L, 0x7c7c7c7cL, 0x77777777L, 0x7b7b7b7bL, + 0xf2f2f2f2L, 0x6b6b6b6bL, 0x6f6f6f6fL, 0xc5c5c5c5L, + 0x30303030L, 0x01010101L, 0x67676767L, 0x2b2b2b2bL, + 0xfefefefeL, 0xd7d7d7d7L, 0xababababL, 0x76767676L, + 0xcacacacaL, 0x82828282L, 0xc9c9c9c9L, 0x7d7d7d7dL, + 0xfafafafaL, 0x59595959L, 0x47474747L, 0xf0f0f0f0L, + 0xadadadadL, 0xd4d4d4d4L, 0xa2a2a2a2L, 0xafafafafL, + 0x9c9c9c9cL, 0xa4a4a4a4L, 0x72727272L, 0xc0c0c0c0L, + 0xb7b7b7b7L, 0xfdfdfdfdL, 0x93939393L, 0x26262626L, + 0x36363636L, 0x3f3f3f3fL, 0xf7f7f7f7L, 0xccccccccL, + 0x34343434L, 0xa5a5a5a5L, 0xe5e5e5e5L, 0xf1f1f1f1L, + 0x71717171L, 0xd8d8d8d8L, 0x31313131L, 0x15151515L, + 0x04040404L, 0xc7c7c7c7L, 0x23232323L, 0xc3c3c3c3L, + 0x18181818L, 0x96969696L, 0x05050505L, 0x9a9a9a9aL, + 0x07070707L, 0x12121212L, 0x80808080L, 0xe2e2e2e2L, + 0xebebebebL, 0x27272727L, 0xb2b2b2b2L, 0x75757575L, + 0x09090909L, 0x83838383L, 0x2c2c2c2cL, 0x1a1a1a1aL, + 0x1b1b1b1bL, 0x6e6e6e6eL, 0x5a5a5a5aL, 0xa0a0a0a0L, + 0x52525252L, 0x3b3b3b3bL, 0xd6d6d6d6L, 0xb3b3b3b3L, + 0x29292929L, 0xe3e3e3e3L, 0x2f2f2f2fL, 0x84848484L, + 0x53535353L, 0xd1d1d1d1L, 0x00000000L, 0xededededL, + 0x20202020L, 0xfcfcfcfcL, 0xb1b1b1b1L, 0x5b5b5b5bL, + 0x6a6a6a6aL, 0xcbcbcbcbL, 0xbebebebeL, 0x39393939L, + 0x4a4a4a4aL, 0x4c4c4c4cL, 0x58585858L, 0xcfcfcfcfL, + 0xd0d0d0d0L, 0xefefefefL, 0xaaaaaaaaL, 0xfbfbfbfbL, + 0x43434343L, 0x4d4d4d4dL, 0x33333333L, 0x85858585L, + 0x45454545L, 0xf9f9f9f9L, 0x02020202L, 0x7f7f7f7fL, + 0x50505050L, 0x3c3c3c3cL, 0x9f9f9f9fL, 0xa8a8a8a8L, + 0x51515151L, 0xa3a3a3a3L, 0x40404040L, 0x8f8f8f8fL, + 0x92929292L, 0x9d9d9d9dL, 0x38383838L, 0xf5f5f5f5L, + 0xbcbcbcbcL, 0xb6b6b6b6L, 0xdadadadaL, 0x21212121L, + 0x10101010L, 0xffffffffL, 0xf3f3f3f3L, 0xd2d2d2d2L, + 0xcdcdcdcdL, 0x0c0c0c0cL, 0x13131313L, 0xececececL, + 0x5f5f5f5fL, 0x97979797L, 0x44444444L, 0x17171717L, + 0xc4c4c4c4L, 0xa7a7a7a7L, 0x7e7e7e7eL, 0x3d3d3d3dL, + 0x64646464L, 0x5d5d5d5dL, 0x19191919L, 0x73737373L, + 0x60606060L, 0x81818181L, 0x4f4f4f4fL, 0xdcdcdcdcL, + 0x22222222L, 0x2a2a2a2aL, 0x90909090L, 0x88888888L, + 0x46464646L, 0xeeeeeeeeL, 0xb8b8b8b8L, 0x14141414L, + 0xdedededeL, 0x5e5e5e5eL, 0x0b0b0b0bL, 0xdbdbdbdbL, + 0xe0e0e0e0L, 0x32323232L, 0x3a3a3a3aL, 0x0a0a0a0aL, + 0x49494949L, 0x06060606L, 0x24242424L, 0x5c5c5c5cL, + 0xc2c2c2c2L, 0xd3d3d3d3L, 0xacacacacL, 0x62626262L, + 0x91919191L, 0x95959595L, 0xe4e4e4e4L, 0x79797979L, + 0xe7e7e7e7L, 0xc8c8c8c8L, 0x37373737L, 0x6d6d6d6dL, + 0x8d8d8d8dL, 0xd5d5d5d5L, 0x4e4e4e4eL, 0xa9a9a9a9L, + 0x6c6c6c6cL, 0x56565656L, 0xf4f4f4f4L, 0xeaeaeaeaL, + 0x65656565L, 0x7a7a7a7aL, 0xaeaeaeaeL, 0x08080808L, + 0xbabababaL, 0x78787878L, 0x25252525L, 0x2e2e2e2eL, + 0x1c1c1c1cL, 0xa6a6a6a6L, 0xb4b4b4b4L, 0xc6c6c6c6L, + 0xe8e8e8e8L, 0xddddddddL, 0x74747474L, 0x1f1f1f1fL, + 0x4b4b4b4bL, 0xbdbdbdbdL, 0x8b8b8b8bL, 0x8a8a8a8aL, + 0x70707070L, 0x3e3e3e3eL, 0xb5b5b5b5L, 0x66666666L, + 0x48484848L, 0x03030303L, 0xf6f6f6f6L, 0x0e0e0e0eL, + 0x61616161L, 0x35353535L, 0x57575757L, 0xb9b9b9b9L, + 0x86868686L, 0xc1c1c1c1L, 0x1d1d1d1dL, 0x9e9e9e9eL, + 0xe1e1e1e1L, 0xf8f8f8f8L, 0x98989898L, 0x11111111L, + 0x69696969L, 0xd9d9d9d9L, 0x8e8e8e8eL, 0x94949494L, + 0x9b9b9b9bL, 0x1e1e1e1eL, 0x87878787L, 0xe9e9e9e9L, + 0xcecececeL, 0x55555555L, 0x28282828L, 0xdfdfdfdfL, + 0x8c8c8c8cL, 0xa1a1a1a1L, 0x89898989L, 0x0d0d0d0dL, + 0xbfbfbfbfL, 0xe6e6e6e6L, 0x42424242L, 0x68686868L, + 0x41414141L, 0x99999999L, 0x2d2d2d2dL, 0x0f0f0f0fL, + 0xb0b0b0b0L, 0x54545454L, 0xbbbbbbbbL, 0x16161616L, +] Td0 = [ - 0x51f4a750L, 0x7e416553L, 0x1a17a4c3L, 0x3a275e96L, - 0x3bab6bcbL, 0x1f9d45f1L, 0xacfa58abL, 0x4be30393L, - 0x2030fa55L, 0xad766df6L, 0x88cc7691L, 0xf5024c25L, - 0x4fe5d7fcL, 0xc52acbd7L, 0x26354480L, 0xb562a38fL, - 0xdeb15a49L, 0x25ba1b67L, 0x45ea0e98L, 0x5dfec0e1L, - 0xc32f7502L, 0x814cf012L, 0x8d4697a3L, 0x6bd3f9c6L, - 0x038f5fe7L, 0x15929c95L, 0xbf6d7aebL, 0x955259daL, - 0xd4be832dL, 0x587421d3L, 0x49e06929L, 0x8ec9c844L, - 0x75c2896aL, 0xf48e7978L, 0x99583e6bL, 0x27b971ddL, - 0xbee14fb6L, 0xf088ad17L, 0xc920ac66L, 0x7dce3ab4L, - 0x63df4a18L, 0xe51a3182L, 0x97513360L, 0x62537f45L, - 0xb16477e0L, 0xbb6bae84L, 0xfe81a01cL, 0xf9082b94L, - 0x70486858L, 0x8f45fd19L, 0x94de6c87L, 0x527bf8b7L, - 0xab73d323L, 0x724b02e2L, 0xe31f8f57L, 0x6655ab2aL, - 0xb2eb2807L, 0x2fb5c203L, 0x86c57b9aL, 0xd33708a5L, - 0x302887f2L, 0x23bfa5b2L, 0x02036abaL, 0xed16825cL, - 0x8acf1c2bL, 0xa779b492L, 0xf307f2f0L, 0x4e69e2a1L, - 0x65daf4cdL, 0x0605bed5L, 0xd134621fL, 0xc4a6fe8aL, - 0x342e539dL, 0xa2f355a0L, 0x058ae132L, 0xa4f6eb75L, - 0x0b83ec39L, 0x4060efaaL, 0x5e719f06L, 0xbd6e1051L, - 0x3e218af9L, 0x96dd063dL, 0xdd3e05aeL, 0x4de6bd46L, - 0x91548db5L, 0x71c45d05L, 0x0406d46fL, 0x605015ffL, - 0x1998fb24L, 0xd6bde997L, 0x894043ccL, 0x67d99e77L, - 0xb0e842bdL, 0x07898b88L, 0xe7195b38L, 0x79c8eedbL, - 0xa17c0a47L, 0x7c420fe9L, 0xf8841ec9L, 0x00000000L, - 0x09808683L, 0x322bed48L, 0x1e1170acL, 0x6c5a724eL, - 0xfd0efffbL, 0x0f853856L, 0x3daed51eL, 0x362d3927L, - 0x0a0fd964L, 0x685ca621L, 0x9b5b54d1L, 0x24362e3aL, - 0x0c0a67b1L, 0x9357e70fL, 0xb4ee96d2L, 0x1b9b919eL, - 0x80c0c54fL, 0x61dc20a2L, 0x5a774b69L, 0x1c121a16L, - 0xe293ba0aL, 0xc0a02ae5L, 0x3c22e043L, 0x121b171dL, - 0x0e090d0bL, 0xf28bc7adL, 0x2db6a8b9L, 0x141ea9c8L, - 0x57f11985L, 0xaf75074cL, 0xee99ddbbL, 0xa37f60fdL, - 0xf701269fL, 0x5c72f5bcL, 0x44663bc5L, 0x5bfb7e34L, - 0x8b432976L, 0xcb23c6dcL, 0xb6edfc68L, 0xb8e4f163L, - 0xd731dccaL, 0x42638510L, 0x13972240L, 0x84c61120L, - 0x854a247dL, 0xd2bb3df8L, 0xaef93211L, 0xc729a16dL, - 0x1d9e2f4bL, 0xdcb230f3L, 0x0d8652ecL, 0x77c1e3d0L, - 0x2bb3166cL, 0xa970b999L, 0x119448faL, 0x47e96422L, - 0xa8fc8cc4L, 0xa0f03f1aL, 0x567d2cd8L, 0x223390efL, - 0x87494ec7L, 0xd938d1c1L, 0x8ccaa2feL, 0x98d40b36L, - 0xa6f581cfL, 0xa57ade28L, 0xdab78e26L, 0x3fadbfa4L, - 0x2c3a9de4L, 0x5078920dL, 0x6a5fcc9bL, 0x547e4662L, - 0xf68d13c2L, 0x90d8b8e8L, 0x2e39f75eL, 0x82c3aff5L, - 0x9f5d80beL, 0x69d0937cL, 0x6fd52da9L, 0xcf2512b3L, - 0xc8ac993bL, 0x10187da7L, 0xe89c636eL, 0xdb3bbb7bL, - 0xcd267809L, 0x6e5918f4L, 0xec9ab701L, 0x834f9aa8L, - 0xe6956e65L, 0xaaffe67eL, 0x21bccf08L, 0xef15e8e6L, - 0xbae79bd9L, 0x4a6f36ceL, 0xea9f09d4L, 0x29b07cd6L, - 0x31a4b2afL, 0x2a3f2331L, 0xc6a59430L, 0x35a266c0L, - 0x744ebc37L, 0xfc82caa6L, 0xe090d0b0L, 0x33a7d815L, - 0xf104984aL, 0x41ecdaf7L, 0x7fcd500eL, 0x1791f62fL, - 0x764dd68dL, 0x43efb04dL, 0xccaa4d54L, 0xe49604dfL, - 0x9ed1b5e3L, 0x4c6a881bL, 0xc12c1fb8L, 0x4665517fL, - 0x9d5eea04L, 0x018c355dL, 0xfa877473L, 0xfb0b412eL, - 0xb3671d5aL, 0x92dbd252L, 0xe9105633L, 0x6dd64713L, - 0x9ad7618cL, 0x37a10c7aL, 0x59f8148eL, 0xeb133c89L, - 0xcea927eeL, 0xb761c935L, 0xe11ce5edL, 0x7a47b13cL, - 0x9cd2df59L, 0x55f2733fL, 0x1814ce79L, 0x73c737bfL, - 0x53f7cdeaL, 0x5ffdaa5bL, 0xdf3d6f14L, 0x7844db86L, - 0xcaaff381L, 0xb968c43eL, 0x3824342cL, 0xc2a3405fL, - 0x161dc372L, 0xbce2250cL, 0x283c498bL, 0xff0d9541L, - 0x39a80171L, 0x080cb3deL, 0xd8b4e49cL, 0x6456c190L, - 0x7bcb8461L, 0xd532b670L, 0x486c5c74L, 0xd0b85742L, - ] + 0x51f4a750L, 0x7e416553L, 0x1a17a4c3L, 0x3a275e96L, + 0x3bab6bcbL, 0x1f9d45f1L, 0xacfa58abL, 0x4be30393L, + 0x2030fa55L, 0xad766df6L, 0x88cc7691L, 0xf5024c25L, + 0x4fe5d7fcL, 0xc52acbd7L, 0x26354480L, 0xb562a38fL, + 0xdeb15a49L, 0x25ba1b67L, 0x45ea0e98L, 0x5dfec0e1L, + 0xc32f7502L, 0x814cf012L, 0x8d4697a3L, 0x6bd3f9c6L, + 0x038f5fe7L, 0x15929c95L, 0xbf6d7aebL, 0x955259daL, + 0xd4be832dL, 0x587421d3L, 0x49e06929L, 0x8ec9c844L, + 0x75c2896aL, 0xf48e7978L, 0x99583e6bL, 0x27b971ddL, + 0xbee14fb6L, 0xf088ad17L, 0xc920ac66L, 0x7dce3ab4L, + 0x63df4a18L, 0xe51a3182L, 0x97513360L, 0x62537f45L, + 0xb16477e0L, 0xbb6bae84L, 0xfe81a01cL, 0xf9082b94L, + 0x70486858L, 0x8f45fd19L, 0x94de6c87L, 0x527bf8b7L, + 0xab73d323L, 0x724b02e2L, 0xe31f8f57L, 0x6655ab2aL, + 0xb2eb2807L, 0x2fb5c203L, 0x86c57b9aL, 0xd33708a5L, + 0x302887f2L, 0x23bfa5b2L, 0x02036abaL, 0xed16825cL, + 0x8acf1c2bL, 0xa779b492L, 0xf307f2f0L, 0x4e69e2a1L, + 0x65daf4cdL, 0x0605bed5L, 0xd134621fL, 0xc4a6fe8aL, + 0x342e539dL, 0xa2f355a0L, 0x058ae132L, 0xa4f6eb75L, + 0x0b83ec39L, 0x4060efaaL, 0x5e719f06L, 0xbd6e1051L, + 0x3e218af9L, 0x96dd063dL, 0xdd3e05aeL, 0x4de6bd46L, + 0x91548db5L, 0x71c45d05L, 0x0406d46fL, 0x605015ffL, + 0x1998fb24L, 0xd6bde997L, 0x894043ccL, 0x67d99e77L, + 0xb0e842bdL, 0x07898b88L, 0xe7195b38L, 0x79c8eedbL, + 0xa17c0a47L, 0x7c420fe9L, 0xf8841ec9L, 0x00000000L, + 0x09808683L, 0x322bed48L, 0x1e1170acL, 0x6c5a724eL, + 0xfd0efffbL, 0x0f853856L, 0x3daed51eL, 0x362d3927L, + 0x0a0fd964L, 0x685ca621L, 0x9b5b54d1L, 0x24362e3aL, + 0x0c0a67b1L, 0x9357e70fL, 0xb4ee96d2L, 0x1b9b919eL, + 0x80c0c54fL, 0x61dc20a2L, 0x5a774b69L, 0x1c121a16L, + 0xe293ba0aL, 0xc0a02ae5L, 0x3c22e043L, 0x121b171dL, + 0x0e090d0bL, 0xf28bc7adL, 0x2db6a8b9L, 0x141ea9c8L, + 0x57f11985L, 0xaf75074cL, 0xee99ddbbL, 0xa37f60fdL, + 0xf701269fL, 0x5c72f5bcL, 0x44663bc5L, 0x5bfb7e34L, + 0x8b432976L, 0xcb23c6dcL, 0xb6edfc68L, 0xb8e4f163L, + 0xd731dccaL, 0x42638510L, 0x13972240L, 0x84c61120L, + 0x854a247dL, 0xd2bb3df8L, 0xaef93211L, 0xc729a16dL, + 0x1d9e2f4bL, 0xdcb230f3L, 0x0d8652ecL, 0x77c1e3d0L, + 0x2bb3166cL, 0xa970b999L, 0x119448faL, 0x47e96422L, + 0xa8fc8cc4L, 0xa0f03f1aL, 0x567d2cd8L, 0x223390efL, + 0x87494ec7L, 0xd938d1c1L, 0x8ccaa2feL, 0x98d40b36L, + 0xa6f581cfL, 0xa57ade28L, 0xdab78e26L, 0x3fadbfa4L, + 0x2c3a9de4L, 0x5078920dL, 0x6a5fcc9bL, 0x547e4662L, + 0xf68d13c2L, 0x90d8b8e8L, 0x2e39f75eL, 0x82c3aff5L, + 0x9f5d80beL, 0x69d0937cL, 0x6fd52da9L, 0xcf2512b3L, + 0xc8ac993bL, 0x10187da7L, 0xe89c636eL, 0xdb3bbb7bL, + 0xcd267809L, 0x6e5918f4L, 0xec9ab701L, 0x834f9aa8L, + 0xe6956e65L, 0xaaffe67eL, 0x21bccf08L, 0xef15e8e6L, + 0xbae79bd9L, 0x4a6f36ceL, 0xea9f09d4L, 0x29b07cd6L, + 0x31a4b2afL, 0x2a3f2331L, 0xc6a59430L, 0x35a266c0L, + 0x744ebc37L, 0xfc82caa6L, 0xe090d0b0L, 0x33a7d815L, + 0xf104984aL, 0x41ecdaf7L, 0x7fcd500eL, 0x1791f62fL, + 0x764dd68dL, 0x43efb04dL, 0xccaa4d54L, 0xe49604dfL, + 0x9ed1b5e3L, 0x4c6a881bL, 0xc12c1fb8L, 0x4665517fL, + 0x9d5eea04L, 0x018c355dL, 0xfa877473L, 0xfb0b412eL, + 0xb3671d5aL, 0x92dbd252L, 0xe9105633L, 0x6dd64713L, + 0x9ad7618cL, 0x37a10c7aL, 0x59f8148eL, 0xeb133c89L, + 0xcea927eeL, 0xb761c935L, 0xe11ce5edL, 0x7a47b13cL, + 0x9cd2df59L, 0x55f2733fL, 0x1814ce79L, 0x73c737bfL, + 0x53f7cdeaL, 0x5ffdaa5bL, 0xdf3d6f14L, 0x7844db86L, + 0xcaaff381L, 0xb968c43eL, 0x3824342cL, 0xc2a3405fL, + 0x161dc372L, 0xbce2250cL, 0x283c498bL, 0xff0d9541L, + 0x39a80171L, 0x080cb3deL, 0xd8b4e49cL, 0x6456c190L, + 0x7bcb8461L, 0xd532b670L, 0x486c5c74L, 0xd0b85742L, +] Td1 = [ - 0x5051f4a7L, 0x537e4165L, 0xc31a17a4L, 0x963a275eL, - 0xcb3bab6bL, 0xf11f9d45L, 0xabacfa58L, 0x934be303L, - 0x552030faL, 0xf6ad766dL, 0x9188cc76L, 0x25f5024cL, - 0xfc4fe5d7L, 0xd7c52acbL, 0x80263544L, 0x8fb562a3L, - 0x49deb15aL, 0x6725ba1bL, 0x9845ea0eL, 0xe15dfec0L, - 0x02c32f75L, 0x12814cf0L, 0xa38d4697L, 0xc66bd3f9L, - 0xe7038f5fL, 0x9515929cL, 0xebbf6d7aL, 0xda955259L, - 0x2dd4be83L, 0xd3587421L, 0x2949e069L, 0x448ec9c8L, - 0x6a75c289L, 0x78f48e79L, 0x6b99583eL, 0xdd27b971L, - 0xb6bee14fL, 0x17f088adL, 0x66c920acL, 0xb47dce3aL, - 0x1863df4aL, 0x82e51a31L, 0x60975133L, 0x4562537fL, - 0xe0b16477L, 0x84bb6baeL, 0x1cfe81a0L, 0x94f9082bL, - 0x58704868L, 0x198f45fdL, 0x8794de6cL, 0xb7527bf8L, - 0x23ab73d3L, 0xe2724b02L, 0x57e31f8fL, 0x2a6655abL, - 0x07b2eb28L, 0x032fb5c2L, 0x9a86c57bL, 0xa5d33708L, - 0xf2302887L, 0xb223bfa5L, 0xba02036aL, 0x5ced1682L, - 0x2b8acf1cL, 0x92a779b4L, 0xf0f307f2L, 0xa14e69e2L, - 0xcd65daf4L, 0xd50605beL, 0x1fd13462L, 0x8ac4a6feL, - 0x9d342e53L, 0xa0a2f355L, 0x32058ae1L, 0x75a4f6ebL, - 0x390b83ecL, 0xaa4060efL, 0x065e719fL, 0x51bd6e10L, - 0xf93e218aL, 0x3d96dd06L, 0xaedd3e05L, 0x464de6bdL, - 0xb591548dL, 0x0571c45dL, 0x6f0406d4L, 0xff605015L, - 0x241998fbL, 0x97d6bde9L, 0xcc894043L, 0x7767d99eL, - 0xbdb0e842L, 0x8807898bL, 0x38e7195bL, 0xdb79c8eeL, - 0x47a17c0aL, 0xe97c420fL, 0xc9f8841eL, 0x00000000L, - 0x83098086L, 0x48322bedL, 0xac1e1170L, 0x4e6c5a72L, - 0xfbfd0effL, 0x560f8538L, 0x1e3daed5L, 0x27362d39L, - 0x640a0fd9L, 0x21685ca6L, 0xd19b5b54L, 0x3a24362eL, - 0xb10c0a67L, 0x0f9357e7L, 0xd2b4ee96L, 0x9e1b9b91L, - 0x4f80c0c5L, 0xa261dc20L, 0x695a774bL, 0x161c121aL, - 0x0ae293baL, 0xe5c0a02aL, 0x433c22e0L, 0x1d121b17L, - 0x0b0e090dL, 0xadf28bc7L, 0xb92db6a8L, 0xc8141ea9L, - 0x8557f119L, 0x4caf7507L, 0xbbee99ddL, 0xfda37f60L, - 0x9ff70126L, 0xbc5c72f5L, 0xc544663bL, 0x345bfb7eL, - 0x768b4329L, 0xdccb23c6L, 0x68b6edfcL, 0x63b8e4f1L, - 0xcad731dcL, 0x10426385L, 0x40139722L, 0x2084c611L, - 0x7d854a24L, 0xf8d2bb3dL, 0x11aef932L, 0x6dc729a1L, - 0x4b1d9e2fL, 0xf3dcb230L, 0xec0d8652L, 0xd077c1e3L, - 0x6c2bb316L, 0x99a970b9L, 0xfa119448L, 0x2247e964L, - 0xc4a8fc8cL, 0x1aa0f03fL, 0xd8567d2cL, 0xef223390L, - 0xc787494eL, 0xc1d938d1L, 0xfe8ccaa2L, 0x3698d40bL, - 0xcfa6f581L, 0x28a57adeL, 0x26dab78eL, 0xa43fadbfL, - 0xe42c3a9dL, 0x0d507892L, 0x9b6a5fccL, 0x62547e46L, - 0xc2f68d13L, 0xe890d8b8L, 0x5e2e39f7L, 0xf582c3afL, - 0xbe9f5d80L, 0x7c69d093L, 0xa96fd52dL, 0xb3cf2512L, - 0x3bc8ac99L, 0xa710187dL, 0x6ee89c63L, 0x7bdb3bbbL, - 0x09cd2678L, 0xf46e5918L, 0x01ec9ab7L, 0xa8834f9aL, - 0x65e6956eL, 0x7eaaffe6L, 0x0821bccfL, 0xe6ef15e8L, - 0xd9bae79bL, 0xce4a6f36L, 0xd4ea9f09L, 0xd629b07cL, - 0xaf31a4b2L, 0x312a3f23L, 0x30c6a594L, 0xc035a266L, - 0x37744ebcL, 0xa6fc82caL, 0xb0e090d0L, 0x1533a7d8L, - 0x4af10498L, 0xf741ecdaL, 0x0e7fcd50L, 0x2f1791f6L, - 0x8d764dd6L, 0x4d43efb0L, 0x54ccaa4dL, 0xdfe49604L, - 0xe39ed1b5L, 0x1b4c6a88L, 0xb8c12c1fL, 0x7f466551L, - 0x049d5eeaL, 0x5d018c35L, 0x73fa8774L, 0x2efb0b41L, - 0x5ab3671dL, 0x5292dbd2L, 0x33e91056L, 0x136dd647L, - 0x8c9ad761L, 0x7a37a10cL, 0x8e59f814L, 0x89eb133cL, - 0xeecea927L, 0x35b761c9L, 0xede11ce5L, 0x3c7a47b1L, - 0x599cd2dfL, 0x3f55f273L, 0x791814ceL, 0xbf73c737L, - 0xea53f7cdL, 0x5b5ffdaaL, 0x14df3d6fL, 0x867844dbL, - 0x81caaff3L, 0x3eb968c4L, 0x2c382434L, 0x5fc2a340L, - 0x72161dc3L, 0x0cbce225L, 0x8b283c49L, 0x41ff0d95L, - 0x7139a801L, 0xde080cb3L, 0x9cd8b4e4L, 0x906456c1L, - 0x617bcb84L, 0x70d532b6L, 0x74486c5cL, 0x42d0b857L, - ] + 0x5051f4a7L, 0x537e4165L, 0xc31a17a4L, 0x963a275eL, + 0xcb3bab6bL, 0xf11f9d45L, 0xabacfa58L, 0x934be303L, + 0x552030faL, 0xf6ad766dL, 0x9188cc76L, 0x25f5024cL, + 0xfc4fe5d7L, 0xd7c52acbL, 0x80263544L, 0x8fb562a3L, + 0x49deb15aL, 0x6725ba1bL, 0x9845ea0eL, 0xe15dfec0L, + 0x02c32f75L, 0x12814cf0L, 0xa38d4697L, 0xc66bd3f9L, + 0xe7038f5fL, 0x9515929cL, 0xebbf6d7aL, 0xda955259L, + 0x2dd4be83L, 0xd3587421L, 0x2949e069L, 0x448ec9c8L, + 0x6a75c289L, 0x78f48e79L, 0x6b99583eL, 0xdd27b971L, + 0xb6bee14fL, 0x17f088adL, 0x66c920acL, 0xb47dce3aL, + 0x1863df4aL, 0x82e51a31L, 0x60975133L, 0x4562537fL, + 0xe0b16477L, 0x84bb6baeL, 0x1cfe81a0L, 0x94f9082bL, + 0x58704868L, 0x198f45fdL, 0x8794de6cL, 0xb7527bf8L, + 0x23ab73d3L, 0xe2724b02L, 0x57e31f8fL, 0x2a6655abL, + 0x07b2eb28L, 0x032fb5c2L, 0x9a86c57bL, 0xa5d33708L, + 0xf2302887L, 0xb223bfa5L, 0xba02036aL, 0x5ced1682L, + 0x2b8acf1cL, 0x92a779b4L, 0xf0f307f2L, 0xa14e69e2L, + 0xcd65daf4L, 0xd50605beL, 0x1fd13462L, 0x8ac4a6feL, + 0x9d342e53L, 0xa0a2f355L, 0x32058ae1L, 0x75a4f6ebL, + 0x390b83ecL, 0xaa4060efL, 0x065e719fL, 0x51bd6e10L, + 0xf93e218aL, 0x3d96dd06L, 0xaedd3e05L, 0x464de6bdL, + 0xb591548dL, 0x0571c45dL, 0x6f0406d4L, 0xff605015L, + 0x241998fbL, 0x97d6bde9L, 0xcc894043L, 0x7767d99eL, + 0xbdb0e842L, 0x8807898bL, 0x38e7195bL, 0xdb79c8eeL, + 0x47a17c0aL, 0xe97c420fL, 0xc9f8841eL, 0x00000000L, + 0x83098086L, 0x48322bedL, 0xac1e1170L, 0x4e6c5a72L, + 0xfbfd0effL, 0x560f8538L, 0x1e3daed5L, 0x27362d39L, + 0x640a0fd9L, 0x21685ca6L, 0xd19b5b54L, 0x3a24362eL, + 0xb10c0a67L, 0x0f9357e7L, 0xd2b4ee96L, 0x9e1b9b91L, + 0x4f80c0c5L, 0xa261dc20L, 0x695a774bL, 0x161c121aL, + 0x0ae293baL, 0xe5c0a02aL, 0x433c22e0L, 0x1d121b17L, + 0x0b0e090dL, 0xadf28bc7L, 0xb92db6a8L, 0xc8141ea9L, + 0x8557f119L, 0x4caf7507L, 0xbbee99ddL, 0xfda37f60L, + 0x9ff70126L, 0xbc5c72f5L, 0xc544663bL, 0x345bfb7eL, + 0x768b4329L, 0xdccb23c6L, 0x68b6edfcL, 0x63b8e4f1L, + 0xcad731dcL, 0x10426385L, 0x40139722L, 0x2084c611L, + 0x7d854a24L, 0xf8d2bb3dL, 0x11aef932L, 0x6dc729a1L, + 0x4b1d9e2fL, 0xf3dcb230L, 0xec0d8652L, 0xd077c1e3L, + 0x6c2bb316L, 0x99a970b9L, 0xfa119448L, 0x2247e964L, + 0xc4a8fc8cL, 0x1aa0f03fL, 0xd8567d2cL, 0xef223390L, + 0xc787494eL, 0xc1d938d1L, 0xfe8ccaa2L, 0x3698d40bL, + 0xcfa6f581L, 0x28a57adeL, 0x26dab78eL, 0xa43fadbfL, + 0xe42c3a9dL, 0x0d507892L, 0x9b6a5fccL, 0x62547e46L, + 0xc2f68d13L, 0xe890d8b8L, 0x5e2e39f7L, 0xf582c3afL, + 0xbe9f5d80L, 0x7c69d093L, 0xa96fd52dL, 0xb3cf2512L, + 0x3bc8ac99L, 0xa710187dL, 0x6ee89c63L, 0x7bdb3bbbL, + 0x09cd2678L, 0xf46e5918L, 0x01ec9ab7L, 0xa8834f9aL, + 0x65e6956eL, 0x7eaaffe6L, 0x0821bccfL, 0xe6ef15e8L, + 0xd9bae79bL, 0xce4a6f36L, 0xd4ea9f09L, 0xd629b07cL, + 0xaf31a4b2L, 0x312a3f23L, 0x30c6a594L, 0xc035a266L, + 0x37744ebcL, 0xa6fc82caL, 0xb0e090d0L, 0x1533a7d8L, + 0x4af10498L, 0xf741ecdaL, 0x0e7fcd50L, 0x2f1791f6L, + 0x8d764dd6L, 0x4d43efb0L, 0x54ccaa4dL, 0xdfe49604L, + 0xe39ed1b5L, 0x1b4c6a88L, 0xb8c12c1fL, 0x7f466551L, + 0x049d5eeaL, 0x5d018c35L, 0x73fa8774L, 0x2efb0b41L, + 0x5ab3671dL, 0x5292dbd2L, 0x33e91056L, 0x136dd647L, + 0x8c9ad761L, 0x7a37a10cL, 0x8e59f814L, 0x89eb133cL, + 0xeecea927L, 0x35b761c9L, 0xede11ce5L, 0x3c7a47b1L, + 0x599cd2dfL, 0x3f55f273L, 0x791814ceL, 0xbf73c737L, + 0xea53f7cdL, 0x5b5ffdaaL, 0x14df3d6fL, 0x867844dbL, + 0x81caaff3L, 0x3eb968c4L, 0x2c382434L, 0x5fc2a340L, + 0x72161dc3L, 0x0cbce225L, 0x8b283c49L, 0x41ff0d95L, + 0x7139a801L, 0xde080cb3L, 0x9cd8b4e4L, 0x906456c1L, + 0x617bcb84L, 0x70d532b6L, 0x74486c5cL, 0x42d0b857L, +] Td2 = [ - 0xa75051f4L, 0x65537e41L, 0xa4c31a17L, 0x5e963a27L, - 0x6bcb3babL, 0x45f11f9dL, 0x58abacfaL, 0x03934be3L, - 0xfa552030L, 0x6df6ad76L, 0x769188ccL, 0x4c25f502L, - 0xd7fc4fe5L, 0xcbd7c52aL, 0x44802635L, 0xa38fb562L, - 0x5a49deb1L, 0x1b6725baL, 0x0e9845eaL, 0xc0e15dfeL, - 0x7502c32fL, 0xf012814cL, 0x97a38d46L, 0xf9c66bd3L, - 0x5fe7038fL, 0x9c951592L, 0x7aebbf6dL, 0x59da9552L, - 0x832dd4beL, 0x21d35874L, 0x692949e0L, 0xc8448ec9L, - 0x896a75c2L, 0x7978f48eL, 0x3e6b9958L, 0x71dd27b9L, - 0x4fb6bee1L, 0xad17f088L, 0xac66c920L, 0x3ab47dceL, - 0x4a1863dfL, 0x3182e51aL, 0x33609751L, 0x7f456253L, - 0x77e0b164L, 0xae84bb6bL, 0xa01cfe81L, 0x2b94f908L, - 0x68587048L, 0xfd198f45L, 0x6c8794deL, 0xf8b7527bL, - 0xd323ab73L, 0x02e2724bL, 0x8f57e31fL, 0xab2a6655L, - 0x2807b2ebL, 0xc2032fb5L, 0x7b9a86c5L, 0x08a5d337L, - 0x87f23028L, 0xa5b223bfL, 0x6aba0203L, 0x825ced16L, - 0x1c2b8acfL, 0xb492a779L, 0xf2f0f307L, 0xe2a14e69L, - 0xf4cd65daL, 0xbed50605L, 0x621fd134L, 0xfe8ac4a6L, - 0x539d342eL, 0x55a0a2f3L, 0xe132058aL, 0xeb75a4f6L, - 0xec390b83L, 0xefaa4060L, 0x9f065e71L, 0x1051bd6eL, - 0x8af93e21L, 0x063d96ddL, 0x05aedd3eL, 0xbd464de6L, - 0x8db59154L, 0x5d0571c4L, 0xd46f0406L, 0x15ff6050L, - 0xfb241998L, 0xe997d6bdL, 0x43cc8940L, 0x9e7767d9L, - 0x42bdb0e8L, 0x8b880789L, 0x5b38e719L, 0xeedb79c8L, - 0x0a47a17cL, 0x0fe97c42L, 0x1ec9f884L, 0x00000000L, - 0x86830980L, 0xed48322bL, 0x70ac1e11L, 0x724e6c5aL, - 0xfffbfd0eL, 0x38560f85L, 0xd51e3daeL, 0x3927362dL, - 0xd9640a0fL, 0xa621685cL, 0x54d19b5bL, 0x2e3a2436L, - 0x67b10c0aL, 0xe70f9357L, 0x96d2b4eeL, 0x919e1b9bL, - 0xc54f80c0L, 0x20a261dcL, 0x4b695a77L, 0x1a161c12L, - 0xba0ae293L, 0x2ae5c0a0L, 0xe0433c22L, 0x171d121bL, - 0x0d0b0e09L, 0xc7adf28bL, 0xa8b92db6L, 0xa9c8141eL, - 0x198557f1L, 0x074caf75L, 0xddbbee99L, 0x60fda37fL, - 0x269ff701L, 0xf5bc5c72L, 0x3bc54466L, 0x7e345bfbL, - 0x29768b43L, 0xc6dccb23L, 0xfc68b6edL, 0xf163b8e4L, - 0xdccad731L, 0x85104263L, 0x22401397L, 0x112084c6L, - 0x247d854aL, 0x3df8d2bbL, 0x3211aef9L, 0xa16dc729L, - 0x2f4b1d9eL, 0x30f3dcb2L, 0x52ec0d86L, 0xe3d077c1L, - 0x166c2bb3L, 0xb999a970L, 0x48fa1194L, 0x642247e9L, - 0x8cc4a8fcL, 0x3f1aa0f0L, 0x2cd8567dL, 0x90ef2233L, - 0x4ec78749L, 0xd1c1d938L, 0xa2fe8ccaL, 0x0b3698d4L, - 0x81cfa6f5L, 0xde28a57aL, 0x8e26dab7L, 0xbfa43fadL, - 0x9de42c3aL, 0x920d5078L, 0xcc9b6a5fL, 0x4662547eL, - 0x13c2f68dL, 0xb8e890d8L, 0xf75e2e39L, 0xaff582c3L, - 0x80be9f5dL, 0x937c69d0L, 0x2da96fd5L, 0x12b3cf25L, - 0x993bc8acL, 0x7da71018L, 0x636ee89cL, 0xbb7bdb3bL, - 0x7809cd26L, 0x18f46e59L, 0xb701ec9aL, 0x9aa8834fL, - 0x6e65e695L, 0xe67eaaffL, 0xcf0821bcL, 0xe8e6ef15L, - 0x9bd9bae7L, 0x36ce4a6fL, 0x09d4ea9fL, 0x7cd629b0L, - 0xb2af31a4L, 0x23312a3fL, 0x9430c6a5L, 0x66c035a2L, - 0xbc37744eL, 0xcaa6fc82L, 0xd0b0e090L, 0xd81533a7L, - 0x984af104L, 0xdaf741ecL, 0x500e7fcdL, 0xf62f1791L, - 0xd68d764dL, 0xb04d43efL, 0x4d54ccaaL, 0x04dfe496L, - 0xb5e39ed1L, 0x881b4c6aL, 0x1fb8c12cL, 0x517f4665L, - 0xea049d5eL, 0x355d018cL, 0x7473fa87L, 0x412efb0bL, - 0x1d5ab367L, 0xd25292dbL, 0x5633e910L, 0x47136dd6L, - 0x618c9ad7L, 0x0c7a37a1L, 0x148e59f8L, 0x3c89eb13L, - 0x27eecea9L, 0xc935b761L, 0xe5ede11cL, 0xb13c7a47L, - 0xdf599cd2L, 0x733f55f2L, 0xce791814L, 0x37bf73c7L, - 0xcdea53f7L, 0xaa5b5ffdL, 0x6f14df3dL, 0xdb867844L, - 0xf381caafL, 0xc43eb968L, 0x342c3824L, 0x405fc2a3L, - 0xc372161dL, 0x250cbce2L, 0x498b283cL, 0x9541ff0dL, - 0x017139a8L, 0xb3de080cL, 0xe49cd8b4L, 0xc1906456L, - 0x84617bcbL, 0xb670d532L, 0x5c74486cL, 0x5742d0b8L, - ] + 0xa75051f4L, 0x65537e41L, 0xa4c31a17L, 0x5e963a27L, + 0x6bcb3babL, 0x45f11f9dL, 0x58abacfaL, 0x03934be3L, + 0xfa552030L, 0x6df6ad76L, 0x769188ccL, 0x4c25f502L, + 0xd7fc4fe5L, 0xcbd7c52aL, 0x44802635L, 0xa38fb562L, + 0x5a49deb1L, 0x1b6725baL, 0x0e9845eaL, 0xc0e15dfeL, + 0x7502c32fL, 0xf012814cL, 0x97a38d46L, 0xf9c66bd3L, + 0x5fe7038fL, 0x9c951592L, 0x7aebbf6dL, 0x59da9552L, + 0x832dd4beL, 0x21d35874L, 0x692949e0L, 0xc8448ec9L, + 0x896a75c2L, 0x7978f48eL, 0x3e6b9958L, 0x71dd27b9L, + 0x4fb6bee1L, 0xad17f088L, 0xac66c920L, 0x3ab47dceL, + 0x4a1863dfL, 0x3182e51aL, 0x33609751L, 0x7f456253L, + 0x77e0b164L, 0xae84bb6bL, 0xa01cfe81L, 0x2b94f908L, + 0x68587048L, 0xfd198f45L, 0x6c8794deL, 0xf8b7527bL, + 0xd323ab73L, 0x02e2724bL, 0x8f57e31fL, 0xab2a6655L, + 0x2807b2ebL, 0xc2032fb5L, 0x7b9a86c5L, 0x08a5d337L, + 0x87f23028L, 0xa5b223bfL, 0x6aba0203L, 0x825ced16L, + 0x1c2b8acfL, 0xb492a779L, 0xf2f0f307L, 0xe2a14e69L, + 0xf4cd65daL, 0xbed50605L, 0x621fd134L, 0xfe8ac4a6L, + 0x539d342eL, 0x55a0a2f3L, 0xe132058aL, 0xeb75a4f6L, + 0xec390b83L, 0xefaa4060L, 0x9f065e71L, 0x1051bd6eL, + 0x8af93e21L, 0x063d96ddL, 0x05aedd3eL, 0xbd464de6L, + 0x8db59154L, 0x5d0571c4L, 0xd46f0406L, 0x15ff6050L, + 0xfb241998L, 0xe997d6bdL, 0x43cc8940L, 0x9e7767d9L, + 0x42bdb0e8L, 0x8b880789L, 0x5b38e719L, 0xeedb79c8L, + 0x0a47a17cL, 0x0fe97c42L, 0x1ec9f884L, 0x00000000L, + 0x86830980L, 0xed48322bL, 0x70ac1e11L, 0x724e6c5aL, + 0xfffbfd0eL, 0x38560f85L, 0xd51e3daeL, 0x3927362dL, + 0xd9640a0fL, 0xa621685cL, 0x54d19b5bL, 0x2e3a2436L, + 0x67b10c0aL, 0xe70f9357L, 0x96d2b4eeL, 0x919e1b9bL, + 0xc54f80c0L, 0x20a261dcL, 0x4b695a77L, 0x1a161c12L, + 0xba0ae293L, 0x2ae5c0a0L, 0xe0433c22L, 0x171d121bL, + 0x0d0b0e09L, 0xc7adf28bL, 0xa8b92db6L, 0xa9c8141eL, + 0x198557f1L, 0x074caf75L, 0xddbbee99L, 0x60fda37fL, + 0x269ff701L, 0xf5bc5c72L, 0x3bc54466L, 0x7e345bfbL, + 0x29768b43L, 0xc6dccb23L, 0xfc68b6edL, 0xf163b8e4L, + 0xdccad731L, 0x85104263L, 0x22401397L, 0x112084c6L, + 0x247d854aL, 0x3df8d2bbL, 0x3211aef9L, 0xa16dc729L, + 0x2f4b1d9eL, 0x30f3dcb2L, 0x52ec0d86L, 0xe3d077c1L, + 0x166c2bb3L, 0xb999a970L, 0x48fa1194L, 0x642247e9L, + 0x8cc4a8fcL, 0x3f1aa0f0L, 0x2cd8567dL, 0x90ef2233L, + 0x4ec78749L, 0xd1c1d938L, 0xa2fe8ccaL, 0x0b3698d4L, + 0x81cfa6f5L, 0xde28a57aL, 0x8e26dab7L, 0xbfa43fadL, + 0x9de42c3aL, 0x920d5078L, 0xcc9b6a5fL, 0x4662547eL, + 0x13c2f68dL, 0xb8e890d8L, 0xf75e2e39L, 0xaff582c3L, + 0x80be9f5dL, 0x937c69d0L, 0x2da96fd5L, 0x12b3cf25L, + 0x993bc8acL, 0x7da71018L, 0x636ee89cL, 0xbb7bdb3bL, + 0x7809cd26L, 0x18f46e59L, 0xb701ec9aL, 0x9aa8834fL, + 0x6e65e695L, 0xe67eaaffL, 0xcf0821bcL, 0xe8e6ef15L, + 0x9bd9bae7L, 0x36ce4a6fL, 0x09d4ea9fL, 0x7cd629b0L, + 0xb2af31a4L, 0x23312a3fL, 0x9430c6a5L, 0x66c035a2L, + 0xbc37744eL, 0xcaa6fc82L, 0xd0b0e090L, 0xd81533a7L, + 0x984af104L, 0xdaf741ecL, 0x500e7fcdL, 0xf62f1791L, + 0xd68d764dL, 0xb04d43efL, 0x4d54ccaaL, 0x04dfe496L, + 0xb5e39ed1L, 0x881b4c6aL, 0x1fb8c12cL, 0x517f4665L, + 0xea049d5eL, 0x355d018cL, 0x7473fa87L, 0x412efb0bL, + 0x1d5ab367L, 0xd25292dbL, 0x5633e910L, 0x47136dd6L, + 0x618c9ad7L, 0x0c7a37a1L, 0x148e59f8L, 0x3c89eb13L, + 0x27eecea9L, 0xc935b761L, 0xe5ede11cL, 0xb13c7a47L, + 0xdf599cd2L, 0x733f55f2L, 0xce791814L, 0x37bf73c7L, + 0xcdea53f7L, 0xaa5b5ffdL, 0x6f14df3dL, 0xdb867844L, + 0xf381caafL, 0xc43eb968L, 0x342c3824L, 0x405fc2a3L, + 0xc372161dL, 0x250cbce2L, 0x498b283cL, 0x9541ff0dL, + 0x017139a8L, 0xb3de080cL, 0xe49cd8b4L, 0xc1906456L, + 0x84617bcbL, 0xb670d532L, 0x5c74486cL, 0x5742d0b8L, +] Td3 = [ - 0xf4a75051L, 0x4165537eL, 0x17a4c31aL, 0x275e963aL, - 0xab6bcb3bL, 0x9d45f11fL, 0xfa58abacL, 0xe303934bL, - 0x30fa5520L, 0x766df6adL, 0xcc769188L, 0x024c25f5L, - 0xe5d7fc4fL, 0x2acbd7c5L, 0x35448026L, 0x62a38fb5L, - 0xb15a49deL, 0xba1b6725L, 0xea0e9845L, 0xfec0e15dL, - 0x2f7502c3L, 0x4cf01281L, 0x4697a38dL, 0xd3f9c66bL, - 0x8f5fe703L, 0x929c9515L, 0x6d7aebbfL, 0x5259da95L, - 0xbe832dd4L, 0x7421d358L, 0xe0692949L, 0xc9c8448eL, - 0xc2896a75L, 0x8e7978f4L, 0x583e6b99L, 0xb971dd27L, - 0xe14fb6beL, 0x88ad17f0L, 0x20ac66c9L, 0xce3ab47dL, - 0xdf4a1863L, 0x1a3182e5L, 0x51336097L, 0x537f4562L, - 0x6477e0b1L, 0x6bae84bbL, 0x81a01cfeL, 0x082b94f9L, - 0x48685870L, 0x45fd198fL, 0xde6c8794L, 0x7bf8b752L, - 0x73d323abL, 0x4b02e272L, 0x1f8f57e3L, 0x55ab2a66L, - 0xeb2807b2L, 0xb5c2032fL, 0xc57b9a86L, 0x3708a5d3L, - 0x2887f230L, 0xbfa5b223L, 0x036aba02L, 0x16825cedL, - 0xcf1c2b8aL, 0x79b492a7L, 0x07f2f0f3L, 0x69e2a14eL, - 0xdaf4cd65L, 0x05bed506L, 0x34621fd1L, 0xa6fe8ac4L, - 0x2e539d34L, 0xf355a0a2L, 0x8ae13205L, 0xf6eb75a4L, - 0x83ec390bL, 0x60efaa40L, 0x719f065eL, 0x6e1051bdL, - 0x218af93eL, 0xdd063d96L, 0x3e05aeddL, 0xe6bd464dL, - 0x548db591L, 0xc45d0571L, 0x06d46f04L, 0x5015ff60L, - 0x98fb2419L, 0xbde997d6L, 0x4043cc89L, 0xd99e7767L, - 0xe842bdb0L, 0x898b8807L, 0x195b38e7L, 0xc8eedb79L, - 0x7c0a47a1L, 0x420fe97cL, 0x841ec9f8L, 0x00000000L, - 0x80868309L, 0x2bed4832L, 0x1170ac1eL, 0x5a724e6cL, - 0x0efffbfdL, 0x8538560fL, 0xaed51e3dL, 0x2d392736L, - 0x0fd9640aL, 0x5ca62168L, 0x5b54d19bL, 0x362e3a24L, - 0x0a67b10cL, 0x57e70f93L, 0xee96d2b4L, 0x9b919e1bL, - 0xc0c54f80L, 0xdc20a261L, 0x774b695aL, 0x121a161cL, - 0x93ba0ae2L, 0xa02ae5c0L, 0x22e0433cL, 0x1b171d12L, - 0x090d0b0eL, 0x8bc7adf2L, 0xb6a8b92dL, 0x1ea9c814L, - 0xf1198557L, 0x75074cafL, 0x99ddbbeeL, 0x7f60fda3L, - 0x01269ff7L, 0x72f5bc5cL, 0x663bc544L, 0xfb7e345bL, - 0x4329768bL, 0x23c6dccbL, 0xedfc68b6L, 0xe4f163b8L, - 0x31dccad7L, 0x63851042L, 0x97224013L, 0xc6112084L, - 0x4a247d85L, 0xbb3df8d2L, 0xf93211aeL, 0x29a16dc7L, - 0x9e2f4b1dL, 0xb230f3dcL, 0x8652ec0dL, 0xc1e3d077L, - 0xb3166c2bL, 0x70b999a9L, 0x9448fa11L, 0xe9642247L, - 0xfc8cc4a8L, 0xf03f1aa0L, 0x7d2cd856L, 0x3390ef22L, - 0x494ec787L, 0x38d1c1d9L, 0xcaa2fe8cL, 0xd40b3698L, - 0xf581cfa6L, 0x7ade28a5L, 0xb78e26daL, 0xadbfa43fL, - 0x3a9de42cL, 0x78920d50L, 0x5fcc9b6aL, 0x7e466254L, - 0x8d13c2f6L, 0xd8b8e890L, 0x39f75e2eL, 0xc3aff582L, - 0x5d80be9fL, 0xd0937c69L, 0xd52da96fL, 0x2512b3cfL, - 0xac993bc8L, 0x187da710L, 0x9c636ee8L, 0x3bbb7bdbL, - 0x267809cdL, 0x5918f46eL, 0x9ab701ecL, 0x4f9aa883L, - 0x956e65e6L, 0xffe67eaaL, 0xbccf0821L, 0x15e8e6efL, - 0xe79bd9baL, 0x6f36ce4aL, 0x9f09d4eaL, 0xb07cd629L, - 0xa4b2af31L, 0x3f23312aL, 0xa59430c6L, 0xa266c035L, - 0x4ebc3774L, 0x82caa6fcL, 0x90d0b0e0L, 0xa7d81533L, - 0x04984af1L, 0xecdaf741L, 0xcd500e7fL, 0x91f62f17L, - 0x4dd68d76L, 0xefb04d43L, 0xaa4d54ccL, 0x9604dfe4L, - 0xd1b5e39eL, 0x6a881b4cL, 0x2c1fb8c1L, 0x65517f46L, - 0x5eea049dL, 0x8c355d01L, 0x877473faL, 0x0b412efbL, - 0x671d5ab3L, 0xdbd25292L, 0x105633e9L, 0xd647136dL, - 0xd7618c9aL, 0xa10c7a37L, 0xf8148e59L, 0x133c89ebL, - 0xa927eeceL, 0x61c935b7L, 0x1ce5ede1L, 0x47b13c7aL, - 0xd2df599cL, 0xf2733f55L, 0x14ce7918L, 0xc737bf73L, - 0xf7cdea53L, 0xfdaa5b5fL, 0x3d6f14dfL, 0x44db8678L, - 0xaff381caL, 0x68c43eb9L, 0x24342c38L, 0xa3405fc2L, - 0x1dc37216L, 0xe2250cbcL, 0x3c498b28L, 0x0d9541ffL, - 0xa8017139L, 0x0cb3de08L, 0xb4e49cd8L, 0x56c19064L, - 0xcb84617bL, 0x32b670d5L, 0x6c5c7448L, 0xb85742d0L, - ] + 0xf4a75051L, 0x4165537eL, 0x17a4c31aL, 0x275e963aL, + 0xab6bcb3bL, 0x9d45f11fL, 0xfa58abacL, 0xe303934bL, + 0x30fa5520L, 0x766df6adL, 0xcc769188L, 0x024c25f5L, + 0xe5d7fc4fL, 0x2acbd7c5L, 0x35448026L, 0x62a38fb5L, + 0xb15a49deL, 0xba1b6725L, 0xea0e9845L, 0xfec0e15dL, + 0x2f7502c3L, 0x4cf01281L, 0x4697a38dL, 0xd3f9c66bL, + 0x8f5fe703L, 0x929c9515L, 0x6d7aebbfL, 0x5259da95L, + 0xbe832dd4L, 0x7421d358L, 0xe0692949L, 0xc9c8448eL, + 0xc2896a75L, 0x8e7978f4L, 0x583e6b99L, 0xb971dd27L, + 0xe14fb6beL, 0x88ad17f0L, 0x20ac66c9L, 0xce3ab47dL, + 0xdf4a1863L, 0x1a3182e5L, 0x51336097L, 0x537f4562L, + 0x6477e0b1L, 0x6bae84bbL, 0x81a01cfeL, 0x082b94f9L, + 0x48685870L, 0x45fd198fL, 0xde6c8794L, 0x7bf8b752L, + 0x73d323abL, 0x4b02e272L, 0x1f8f57e3L, 0x55ab2a66L, + 0xeb2807b2L, 0xb5c2032fL, 0xc57b9a86L, 0x3708a5d3L, + 0x2887f230L, 0xbfa5b223L, 0x036aba02L, 0x16825cedL, + 0xcf1c2b8aL, 0x79b492a7L, 0x07f2f0f3L, 0x69e2a14eL, + 0xdaf4cd65L, 0x05bed506L, 0x34621fd1L, 0xa6fe8ac4L, + 0x2e539d34L, 0xf355a0a2L, 0x8ae13205L, 0xf6eb75a4L, + 0x83ec390bL, 0x60efaa40L, 0x719f065eL, 0x6e1051bdL, + 0x218af93eL, 0xdd063d96L, 0x3e05aeddL, 0xe6bd464dL, + 0x548db591L, 0xc45d0571L, 0x06d46f04L, 0x5015ff60L, + 0x98fb2419L, 0xbde997d6L, 0x4043cc89L, 0xd99e7767L, + 0xe842bdb0L, 0x898b8807L, 0x195b38e7L, 0xc8eedb79L, + 0x7c0a47a1L, 0x420fe97cL, 0x841ec9f8L, 0x00000000L, + 0x80868309L, 0x2bed4832L, 0x1170ac1eL, 0x5a724e6cL, + 0x0efffbfdL, 0x8538560fL, 0xaed51e3dL, 0x2d392736L, + 0x0fd9640aL, 0x5ca62168L, 0x5b54d19bL, 0x362e3a24L, + 0x0a67b10cL, 0x57e70f93L, 0xee96d2b4L, 0x9b919e1bL, + 0xc0c54f80L, 0xdc20a261L, 0x774b695aL, 0x121a161cL, + 0x93ba0ae2L, 0xa02ae5c0L, 0x22e0433cL, 0x1b171d12L, + 0x090d0b0eL, 0x8bc7adf2L, 0xb6a8b92dL, 0x1ea9c814L, + 0xf1198557L, 0x75074cafL, 0x99ddbbeeL, 0x7f60fda3L, + 0x01269ff7L, 0x72f5bc5cL, 0x663bc544L, 0xfb7e345bL, + 0x4329768bL, 0x23c6dccbL, 0xedfc68b6L, 0xe4f163b8L, + 0x31dccad7L, 0x63851042L, 0x97224013L, 0xc6112084L, + 0x4a247d85L, 0xbb3df8d2L, 0xf93211aeL, 0x29a16dc7L, + 0x9e2f4b1dL, 0xb230f3dcL, 0x8652ec0dL, 0xc1e3d077L, + 0xb3166c2bL, 0x70b999a9L, 0x9448fa11L, 0xe9642247L, + 0xfc8cc4a8L, 0xf03f1aa0L, 0x7d2cd856L, 0x3390ef22L, + 0x494ec787L, 0x38d1c1d9L, 0xcaa2fe8cL, 0xd40b3698L, + 0xf581cfa6L, 0x7ade28a5L, 0xb78e26daL, 0xadbfa43fL, + 0x3a9de42cL, 0x78920d50L, 0x5fcc9b6aL, 0x7e466254L, + 0x8d13c2f6L, 0xd8b8e890L, 0x39f75e2eL, 0xc3aff582L, + 0x5d80be9fL, 0xd0937c69L, 0xd52da96fL, 0x2512b3cfL, + 0xac993bc8L, 0x187da710L, 0x9c636ee8L, 0x3bbb7bdbL, + 0x267809cdL, 0x5918f46eL, 0x9ab701ecL, 0x4f9aa883L, + 0x956e65e6L, 0xffe67eaaL, 0xbccf0821L, 0x15e8e6efL, + 0xe79bd9baL, 0x6f36ce4aL, 0x9f09d4eaL, 0xb07cd629L, + 0xa4b2af31L, 0x3f23312aL, 0xa59430c6L, 0xa266c035L, + 0x4ebc3774L, 0x82caa6fcL, 0x90d0b0e0L, 0xa7d81533L, + 0x04984af1L, 0xecdaf741L, 0xcd500e7fL, 0x91f62f17L, + 0x4dd68d76L, 0xefb04d43L, 0xaa4d54ccL, 0x9604dfe4L, + 0xd1b5e39eL, 0x6a881b4cL, 0x2c1fb8c1L, 0x65517f46L, + 0x5eea049dL, 0x8c355d01L, 0x877473faL, 0x0b412efbL, + 0x671d5ab3L, 0xdbd25292L, 0x105633e9L, 0xd647136dL, + 0xd7618c9aL, 0xa10c7a37L, 0xf8148e59L, 0x133c89ebL, + 0xa927eeceL, 0x61c935b7L, 0x1ce5ede1L, 0x47b13c7aL, + 0xd2df599cL, 0xf2733f55L, 0x14ce7918L, 0xc737bf73L, + 0xf7cdea53L, 0xfdaa5b5fL, 0x3d6f14dfL, 0x44db8678L, + 0xaff381caL, 0x68c43eb9L, 0x24342c38L, 0xa3405fc2L, + 0x1dc37216L, 0xe2250cbcL, 0x3c498b28L, 0x0d9541ffL, + 0xa8017139L, 0x0cb3de08L, 0xb4e49cd8L, 0x56c19064L, + 0xcb84617bL, 0x32b670d5L, 0x6c5c7448L, 0xb85742d0L, +] Td4 = [ - 0x52525252L, 0x09090909L, 0x6a6a6a6aL, 0xd5d5d5d5L, - 0x30303030L, 0x36363636L, 0xa5a5a5a5L, 0x38383838L, - 0xbfbfbfbfL, 0x40404040L, 0xa3a3a3a3L, 0x9e9e9e9eL, - 0x81818181L, 0xf3f3f3f3L, 0xd7d7d7d7L, 0xfbfbfbfbL, - 0x7c7c7c7cL, 0xe3e3e3e3L, 0x39393939L, 0x82828282L, - 0x9b9b9b9bL, 0x2f2f2f2fL, 0xffffffffL, 0x87878787L, - 0x34343434L, 0x8e8e8e8eL, 0x43434343L, 0x44444444L, - 0xc4c4c4c4L, 0xdedededeL, 0xe9e9e9e9L, 0xcbcbcbcbL, - 0x54545454L, 0x7b7b7b7bL, 0x94949494L, 0x32323232L, - 0xa6a6a6a6L, 0xc2c2c2c2L, 0x23232323L, 0x3d3d3d3dL, - 0xeeeeeeeeL, 0x4c4c4c4cL, 0x95959595L, 0x0b0b0b0bL, - 0x42424242L, 0xfafafafaL, 0xc3c3c3c3L, 0x4e4e4e4eL, - 0x08080808L, 0x2e2e2e2eL, 0xa1a1a1a1L, 0x66666666L, - 0x28282828L, 0xd9d9d9d9L, 0x24242424L, 0xb2b2b2b2L, - 0x76767676L, 0x5b5b5b5bL, 0xa2a2a2a2L, 0x49494949L, - 0x6d6d6d6dL, 0x8b8b8b8bL, 0xd1d1d1d1L, 0x25252525L, - 0x72727272L, 0xf8f8f8f8L, 0xf6f6f6f6L, 0x64646464L, - 0x86868686L, 0x68686868L, 0x98989898L, 0x16161616L, - 0xd4d4d4d4L, 0xa4a4a4a4L, 0x5c5c5c5cL, 0xccccccccL, - 0x5d5d5d5dL, 0x65656565L, 0xb6b6b6b6L, 0x92929292L, - 0x6c6c6c6cL, 0x70707070L, 0x48484848L, 0x50505050L, - 0xfdfdfdfdL, 0xededededL, 0xb9b9b9b9L, 0xdadadadaL, - 0x5e5e5e5eL, 0x15151515L, 0x46464646L, 0x57575757L, - 0xa7a7a7a7L, 0x8d8d8d8dL, 0x9d9d9d9dL, 0x84848484L, - 0x90909090L, 0xd8d8d8d8L, 0xababababL, 0x00000000L, - 0x8c8c8c8cL, 0xbcbcbcbcL, 0xd3d3d3d3L, 0x0a0a0a0aL, - 0xf7f7f7f7L, 0xe4e4e4e4L, 0x58585858L, 0x05050505L, - 0xb8b8b8b8L, 0xb3b3b3b3L, 0x45454545L, 0x06060606L, - 0xd0d0d0d0L, 0x2c2c2c2cL, 0x1e1e1e1eL, 0x8f8f8f8fL, - 0xcacacacaL, 0x3f3f3f3fL, 0x0f0f0f0fL, 0x02020202L, - 0xc1c1c1c1L, 0xafafafafL, 0xbdbdbdbdL, 0x03030303L, - 0x01010101L, 0x13131313L, 0x8a8a8a8aL, 0x6b6b6b6bL, - 0x3a3a3a3aL, 0x91919191L, 0x11111111L, 0x41414141L, - 0x4f4f4f4fL, 0x67676767L, 0xdcdcdcdcL, 0xeaeaeaeaL, - 0x97979797L, 0xf2f2f2f2L, 0xcfcfcfcfL, 0xcecececeL, - 0xf0f0f0f0L, 0xb4b4b4b4L, 0xe6e6e6e6L, 0x73737373L, - 0x96969696L, 0xacacacacL, 0x74747474L, 0x22222222L, - 0xe7e7e7e7L, 0xadadadadL, 0x35353535L, 0x85858585L, - 0xe2e2e2e2L, 0xf9f9f9f9L, 0x37373737L, 0xe8e8e8e8L, - 0x1c1c1c1cL, 0x75757575L, 0xdfdfdfdfL, 0x6e6e6e6eL, - 0x47474747L, 0xf1f1f1f1L, 0x1a1a1a1aL, 0x71717171L, - 0x1d1d1d1dL, 0x29292929L, 0xc5c5c5c5L, 0x89898989L, - 0x6f6f6f6fL, 0xb7b7b7b7L, 0x62626262L, 0x0e0e0e0eL, - 0xaaaaaaaaL, 0x18181818L, 0xbebebebeL, 0x1b1b1b1bL, - 0xfcfcfcfcL, 0x56565656L, 0x3e3e3e3eL, 0x4b4b4b4bL, - 0xc6c6c6c6L, 0xd2d2d2d2L, 0x79797979L, 0x20202020L, - 0x9a9a9a9aL, 0xdbdbdbdbL, 0xc0c0c0c0L, 0xfefefefeL, - 0x78787878L, 0xcdcdcdcdL, 0x5a5a5a5aL, 0xf4f4f4f4L, - 0x1f1f1f1fL, 0xddddddddL, 0xa8a8a8a8L, 0x33333333L, - 0x88888888L, 0x07070707L, 0xc7c7c7c7L, 0x31313131L, - 0xb1b1b1b1L, 0x12121212L, 0x10101010L, 0x59595959L, - 0x27272727L, 0x80808080L, 0xececececL, 0x5f5f5f5fL, - 0x60606060L, 0x51515151L, 0x7f7f7f7fL, 0xa9a9a9a9L, - 0x19191919L, 0xb5b5b5b5L, 0x4a4a4a4aL, 0x0d0d0d0dL, - 0x2d2d2d2dL, 0xe5e5e5e5L, 0x7a7a7a7aL, 0x9f9f9f9fL, - 0x93939393L, 0xc9c9c9c9L, 0x9c9c9c9cL, 0xefefefefL, - 0xa0a0a0a0L, 0xe0e0e0e0L, 0x3b3b3b3bL, 0x4d4d4d4dL, - 0xaeaeaeaeL, 0x2a2a2a2aL, 0xf5f5f5f5L, 0xb0b0b0b0L, - 0xc8c8c8c8L, 0xebebebebL, 0xbbbbbbbbL, 0x3c3c3c3cL, - 0x83838383L, 0x53535353L, 0x99999999L, 0x61616161L, - 0x17171717L, 0x2b2b2b2bL, 0x04040404L, 0x7e7e7e7eL, - 0xbabababaL, 0x77777777L, 0xd6d6d6d6L, 0x26262626L, - 0xe1e1e1e1L, 0x69696969L, 0x14141414L, 0x63636363L, - 0x55555555L, 0x21212121L, 0x0c0c0c0cL, 0x7d7d7d7dL, - ] + 0x52525252L, 0x09090909L, 0x6a6a6a6aL, 0xd5d5d5d5L, + 0x30303030L, 0x36363636L, 0xa5a5a5a5L, 0x38383838L, + 0xbfbfbfbfL, 0x40404040L, 0xa3a3a3a3L, 0x9e9e9e9eL, + 0x81818181L, 0xf3f3f3f3L, 0xd7d7d7d7L, 0xfbfbfbfbL, + 0x7c7c7c7cL, 0xe3e3e3e3L, 0x39393939L, 0x82828282L, + 0x9b9b9b9bL, 0x2f2f2f2fL, 0xffffffffL, 0x87878787L, + 0x34343434L, 0x8e8e8e8eL, 0x43434343L, 0x44444444L, + 0xc4c4c4c4L, 0xdedededeL, 0xe9e9e9e9L, 0xcbcbcbcbL, + 0x54545454L, 0x7b7b7b7bL, 0x94949494L, 0x32323232L, + 0xa6a6a6a6L, 0xc2c2c2c2L, 0x23232323L, 0x3d3d3d3dL, + 0xeeeeeeeeL, 0x4c4c4c4cL, 0x95959595L, 0x0b0b0b0bL, + 0x42424242L, 0xfafafafaL, 0xc3c3c3c3L, 0x4e4e4e4eL, + 0x08080808L, 0x2e2e2e2eL, 0xa1a1a1a1L, 0x66666666L, + 0x28282828L, 0xd9d9d9d9L, 0x24242424L, 0xb2b2b2b2L, + 0x76767676L, 0x5b5b5b5bL, 0xa2a2a2a2L, 0x49494949L, + 0x6d6d6d6dL, 0x8b8b8b8bL, 0xd1d1d1d1L, 0x25252525L, + 0x72727272L, 0xf8f8f8f8L, 0xf6f6f6f6L, 0x64646464L, + 0x86868686L, 0x68686868L, 0x98989898L, 0x16161616L, + 0xd4d4d4d4L, 0xa4a4a4a4L, 0x5c5c5c5cL, 0xccccccccL, + 0x5d5d5d5dL, 0x65656565L, 0xb6b6b6b6L, 0x92929292L, + 0x6c6c6c6cL, 0x70707070L, 0x48484848L, 0x50505050L, + 0xfdfdfdfdL, 0xededededL, 0xb9b9b9b9L, 0xdadadadaL, + 0x5e5e5e5eL, 0x15151515L, 0x46464646L, 0x57575757L, + 0xa7a7a7a7L, 0x8d8d8d8dL, 0x9d9d9d9dL, 0x84848484L, + 0x90909090L, 0xd8d8d8d8L, 0xababababL, 0x00000000L, + 0x8c8c8c8cL, 0xbcbcbcbcL, 0xd3d3d3d3L, 0x0a0a0a0aL, + 0xf7f7f7f7L, 0xe4e4e4e4L, 0x58585858L, 0x05050505L, + 0xb8b8b8b8L, 0xb3b3b3b3L, 0x45454545L, 0x06060606L, + 0xd0d0d0d0L, 0x2c2c2c2cL, 0x1e1e1e1eL, 0x8f8f8f8fL, + 0xcacacacaL, 0x3f3f3f3fL, 0x0f0f0f0fL, 0x02020202L, + 0xc1c1c1c1L, 0xafafafafL, 0xbdbdbdbdL, 0x03030303L, + 0x01010101L, 0x13131313L, 0x8a8a8a8aL, 0x6b6b6b6bL, + 0x3a3a3a3aL, 0x91919191L, 0x11111111L, 0x41414141L, + 0x4f4f4f4fL, 0x67676767L, 0xdcdcdcdcL, 0xeaeaeaeaL, + 0x97979797L, 0xf2f2f2f2L, 0xcfcfcfcfL, 0xcecececeL, + 0xf0f0f0f0L, 0xb4b4b4b4L, 0xe6e6e6e6L, 0x73737373L, + 0x96969696L, 0xacacacacL, 0x74747474L, 0x22222222L, + 0xe7e7e7e7L, 0xadadadadL, 0x35353535L, 0x85858585L, + 0xe2e2e2e2L, 0xf9f9f9f9L, 0x37373737L, 0xe8e8e8e8L, + 0x1c1c1c1cL, 0x75757575L, 0xdfdfdfdfL, 0x6e6e6e6eL, + 0x47474747L, 0xf1f1f1f1L, 0x1a1a1a1aL, 0x71717171L, + 0x1d1d1d1dL, 0x29292929L, 0xc5c5c5c5L, 0x89898989L, + 0x6f6f6f6fL, 0xb7b7b7b7L, 0x62626262L, 0x0e0e0e0eL, + 0xaaaaaaaaL, 0x18181818L, 0xbebebebeL, 0x1b1b1b1bL, + 0xfcfcfcfcL, 0x56565656L, 0x3e3e3e3eL, 0x4b4b4b4bL, + 0xc6c6c6c6L, 0xd2d2d2d2L, 0x79797979L, 0x20202020L, + 0x9a9a9a9aL, 0xdbdbdbdbL, 0xc0c0c0c0L, 0xfefefefeL, + 0x78787878L, 0xcdcdcdcdL, 0x5a5a5a5aL, 0xf4f4f4f4L, + 0x1f1f1f1fL, 0xddddddddL, 0xa8a8a8a8L, 0x33333333L, + 0x88888888L, 0x07070707L, 0xc7c7c7c7L, 0x31313131L, + 0xb1b1b1b1L, 0x12121212L, 0x10101010L, 0x59595959L, + 0x27272727L, 0x80808080L, 0xececececL, 0x5f5f5f5fL, + 0x60606060L, 0x51515151L, 0x7f7f7f7fL, 0xa9a9a9a9L, + 0x19191919L, 0xb5b5b5b5L, 0x4a4a4a4aL, 0x0d0d0d0dL, + 0x2d2d2d2dL, 0xe5e5e5e5L, 0x7a7a7a7aL, 0x9f9f9f9fL, + 0x93939393L, 0xc9c9c9c9L, 0x9c9c9c9cL, 0xefefefefL, + 0xa0a0a0a0L, 0xe0e0e0e0L, 0x3b3b3b3bL, 0x4d4d4d4dL, + 0xaeaeaeaeL, 0x2a2a2a2aL, 0xf5f5f5f5L, 0xb0b0b0b0L, + 0xc8c8c8c8L, 0xebebebebL, 0xbbbbbbbbL, 0x3c3c3c3cL, + 0x83838383L, 0x53535353L, 0x99999999L, 0x61616161L, + 0x17171717L, 0x2b2b2b2bL, 0x04040404L, 0x7e7e7e7eL, + 0xbabababaL, 0x77777777L, 0xd6d6d6d6L, 0x26262626L, + 0xe1e1e1e1L, 0x69696969L, 0x14141414L, 0x63636363L, + 0x55555555L, 0x21212121L, 0x0c0c0c0cL, 0x7d7d7d7dL, +] rcon = [ - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, - # 128-bit blocks, Rijndael never uses more than 10 rcon values - ] + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, + # 128-bit blocks, Rijndael never uses more than 10 rcon values +] if len(struct.pack('L',0)) == 4: # 32bit @@ -702,6 +710,7 @@ else: def GETU32(x): return struct.unpack('>I', x)[0] def PUTU32(x): return struct.pack('>I', x) + # Expand the cipher key into the encryption key schedule. # # @return the number of rounds for the given cipher key size. @@ -1050,6 +1059,7 @@ class RijndaelDecryptor(object): assert len(ciphertext) == 16 return rijndaelDecrypt(self.rk, self.nrounds, ciphertext) + # encrypt(key, fin, fout, keybits=256) class RijndaelEncryptor(object): @@ -1059,7 +1069,7 @@ class RijndaelEncryptor(object): >>> RijndaelEncryptor(key, 128).encrypt(plaintext).encode('hex') 'd8f532538289ef7d06b506a4fd5be9c9' """ - + def __init__(self, key, keybits=256): assert len(key) == KEYLENGTH(keybits) (self.rk, self.nrounds) = rijndaelSetupEncrypt(key, keybits) diff --git a/pdfminer/runlength.py b/pdfminer/runlength.py index f05e14d..4637198 100644 --- a/pdfminer/runlength.py +++ b/pdfminer/runlength.py @@ -24,7 +24,7 @@ def rldecode(data): '1234567777777abcde' """ decoded = [] - i=0 + i = 0 while i < len(data): #print "data[%d]=:%d:" % (i,ord(data[i])) length = ord(data[i]) diff --git a/pdfminer/utils.py b/pdfminer/utils.py index 670bca4..8a46cd0 100644 --- a/pdfminer/utils.py +++ b/pdfminer/utils.py @@ -32,13 +32,13 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data): buf += chr(c) elif pred == '\x02': # PNG up - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = (ord(a)+ord(b)) & 255 buf += chr(c) elif pred == '\x03': # PNG average (UNTESTED) c = 0 - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = ((c+ord(a)+ord(b))/2) & 255 buf += chr(c) else: @@ -52,21 +52,25 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data): ## MATRIX_IDENTITY = (1, 0, 0, 1, 0, 0) -def mult_matrix((a1,b1,c1,d1,e1,f1), (a0,b0,c0,d0,e0,f0)): + +def mult_matrix((a1, b1, c1, d1, e1, f1), (a0, b0, c0, d0, e0, f0)): """Returns the multiplication of two matrices.""" return (a0*a1+c0*b1, b0*a1+d0*b1, a0*c1+c0*d1, b0*c1+d0*d1, a0*e1+c0*f1+e0, b0*e1+d0*f1+f0) -def translate_matrix((a,b,c,d,e,f), (x,y)): - """Translates a matrix by (x,y).""" - return (a,b,c,d,x*a+y*c+e,x*b+y*d+f) -def apply_matrix_pt((a,b,c,d,e,f), (x,y)): +def translate_matrix((a, b, c, d, e, f), (x, y)): + """Translates a matrix by (x, y).""" + return (a, b, c, d, x*a+y*c+e, x*b+y*d+f) + + +def apply_matrix_pt((a, b, c, d, e, f), (x, y)): """Applies a matrix to a point.""" return (a*x+c*y+e, b*x+d*y+f) -def apply_matrix_norm((a,b,c,d,e,f), (p,q)): + +def apply_matrix_norm((a, b, c, d, e, f), (p, q)): """Equivalent to apply_matrix_pt(M, (p,q)) - apply_matrix_pt(M, (0,0))""" return (a*p+c*q, b*p+d*q) @@ -79,17 +83,20 @@ def uniq(objs): """Eliminates duplicated elements.""" done = set() for obj in objs: - if obj in done: continue + if obj in done: + continue done.add(obj) yield obj return + # csort -def csort(objs, key=lambda x:x): +def csort(objs, key=lambda x: x): """Order-preserving sorting function.""" - idxs = dict( (obj,i) for (i,obj) in enumerate(objs) ) + idxs = dict((obj, i) for (i, obj) in enumerate(objs)) return sorted(objs, key=lambda obj: (key(obj), idxs[obj])) + # fsplit def fsplit(pred, objs): """Split a list into two classes according to the predicate.""" @@ -100,7 +107,8 @@ def fsplit(pred, objs): t.append(obj) else: f.append(obj) - return (t,f) + return (t, f) + # drange def drange(v0, v1, d): @@ -108,16 +116,18 @@ def drange(v0, v1, d): assert v0 < v1 return xrange(int(v0)/d, int(v1+d)/d) + # get_bound def get_bound(pts): """Compute a minimal rectangle that covers all the points.""" (x0, y0, x1, y1) = (INF, INF, -INF, -INF) - for (x,y) in pts: + for (x, y) in pts: x0 = min(x0, x) y0 = min(y0, y) x1 = max(x1, x) y1 = max(y1, y) - return (x0,y0,x1,y1) + return (x0, y0, x1, y1) + # pick def pick(seq, func, maxobj=None): @@ -126,9 +136,10 @@ def pick(seq, func, maxobj=None): for obj in seq: score = func(obj) if maxscore is None or maxscore < score: - (maxscore,maxobj) = (score,obj) + (maxscore, maxobj) = (score, obj) return maxobj + # choplist def choplist(n, seq): """Groups every n elements of the list.""" @@ -140,6 +151,7 @@ def choplist(n, seq): r = [] return + # nunpack def nunpack(s, default=0): """Unpacks 1 to 4 byte integers (big endian).""" @@ -157,59 +169,65 @@ def nunpack(s, default=0): else: raise TypeError('invalid length: %d' % l) + # decode_text -PDFDocEncoding = ''.join( unichr(x) for x in ( - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, - 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, - 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, - 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, - 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, - 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, - 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, +PDFDocEncoding = ''.join(unichr(x) for x in ( + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, )) + + def decode_text(s): """Decodes a PDFDocEncoding string to Unicode.""" if s.startswith('\xfe\xff'): return unicode(s[2:], 'utf-16be', 'ignore') else: - return ''.join( PDFDocEncoding[ord(c)] for c in s ) + return ''.join(PDFDocEncoding[ord(c)] for c in s) + # enc def enc(x, codec='ascii'): """Encodes a string for SGML/XML/HTML""" - x = x.replace('&','&').replace('>','>').replace('<','<').replace('"','"') + x = x.replace('&', '&').replace('>', '>').replace('<', '<').replace('"', '"') return x.encode(codec, 'xmlcharrefreplace') -def bbox2str((x0,y0,x1,y1)): + +def bbox2str((x0, y0, x1, y1)): return '%.3f,%.3f,%.3f,%.3f' % (x0, y0, x1, y1) -def matrix2str((a,b,c,d,e,f)): - return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a,b,c,d,e,f) + +def matrix2str((a, b, c, d, e, f)): + return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a, b, c, d, e, f) ## Plane @@ -240,14 +258,14 @@ class Plane(object): def __contains__(self, obj): return obj in self._objs - def _getrange(self, (x0,y0,x1,y1)): + def _getrange(self, (x0, y0, x1, y1)): x0 = max(self.x0, x0) y0 = max(self.y0, y0) x1 = min(self.x1, x1) y1 = min(self.y1, y1) for y in drange(y0, y1, self.gridsize): for x in drange(x0, x1, self.gridsize): - yield (x,y) + yield (x, y) return # extend(objs) @@ -255,7 +273,7 @@ class Plane(object): for obj in objs: self.add(obj) return - + # add(obj): place an object. def add(self, obj): for k in self._getrange((obj.x0, obj.y0, obj.x1, obj.y1)): @@ -279,14 +297,17 @@ class Plane(object): return # find(): finds objects that are in a certain area. - def find(self, (x0,y0,x1,y1)): + def find(self, (x0, y0, x1, y1)): done = set() - for k in self._getrange((x0,y0,x1,y1)): - if k not in self._grid: continue + for k in self._getrange((x0, y0, x1, y1)): + if k not in self._grid: + continue for obj in self._grid[k]: - if obj in done: continue + if obj in done: + continue done.add(obj) if (obj.x1 <= x0 or x1 <= obj.x0 or - obj.y1 <= y0 or y1 <= obj.y0): continue + obj.y1 <= y0 or y1 <= obj.y0): + continue yield obj return diff --git a/setup.py b/setup.py index e5e8d7c..d3f73fa 100644 --- a/setup.py +++ b/setup.py @@ -7,9 +7,9 @@ setup( version=__version__, description='PDF parser and analyzer', long_description='''PDFMiner is a tool for extracting information from PDF documents. -Unlike other PDF-related tools, it focuses entirely on getting +Unlike other PDF-related tools, it focuses entirely on getting and analyzing text data. PDFMiner allows to obtain -the exact location of texts in a page, as well as +the exact location of texts in a page, as well as other information such as fonts or lines. It includes a PDF converter that can transform PDF files into other text formats (such as HTML). It has an extensible diff --git a/tools/conv_cmap.py b/tools/conv_cmap.py index a32ace6..4e908bd 100755 --- a/tools/conv_cmap.py +++ b/tools/conv_cmap.py @@ -50,7 +50,7 @@ class CMapConverter(object): assert values[0] == 'CID' encs = values continue - + def put(dmap, code, cid, force=False): for b in code[:-1]: b = ord(b) @@ -64,7 +64,7 @@ class CMapConverter(object): if force or ((b not in dmap) or dmap[b] == cid): dmap[b] = cid return - + def add(unimap, enc, code): try: codec = self.enc2codec[enc] @@ -78,20 +78,20 @@ class CMapConverter(object): except UnicodeError: pass return - + def pick(unimap): chars = unimap.items() chars.sort(key=(lambda (c,n):(n,-ord(c))), reverse=True) (c,_) = chars[0] return c - + cid = int(values[0]) unimap_h = {} unimap_v = {} for (enc,value) in zip(encs, values): if enc == 'CID': continue if value == '*': continue - + # hcodes, vcodes: encoded bytes for each writing mode. hcodes = [] vcodes = [] @@ -121,7 +121,7 @@ class CMapConverter(object): for code in hcodes: put(hmap, code, cid) put(vmap, code, cid) - + # Determine the "most popular" candidate. if unimap_h: self.cid2unichr_h[cid] = pick(unimap_h) @@ -137,7 +137,7 @@ class CMapConverter(object): ) fp.write(pickle.dumps(data)) return - + def dump_unicodemap(self, fp): data = dict( CID2UNICHR_H=self.cid2unichr_h, @@ -151,7 +151,7 @@ def main(argv): import getopt import gzip import os.path - + def usage(): print 'usage: %s [-c enc=codec] output_dir regname [cid2code.txt ...]' % argv[0] return 100 diff --git a/tools/dumppdf.py b/tools/dumppdf.py index 380356e..bf68f30 100755 --- a/tools/dumppdf.py +++ b/tools/dumppdf.py @@ -25,7 +25,7 @@ def dumpxml(out, obj, codec=None): if obj is None: out.write('') return - + if isinstance(obj, dict): out.write('\n' % len(obj)) for (k,v) in obj.iteritems(): @@ -179,7 +179,7 @@ def extractembedded(outfp, fname, objids, pagenos, password='', out.write(fileobj.get_data()) out.close() return - + fp = file(fname, 'rb') parser = PDFParser(fp) doc = PDFDocument(parser) diff --git a/tools/latin2ascii.py b/tools/latin2ascii.py index 36588a6..ab6c708 100755 --- a/tools/latin2ascii.py +++ b/tools/latin2ascii.py @@ -14,7 +14,7 @@ This is an in-house mapping table for some Latin-1 characters LATIN2ASCII = { #0x00a0: '', #0x00a7: '', - + # iso-8859-1 0x00c0: 'A`', 0x00c1: "A'", diff --git a/tools/pdf2html.cgi b/tools/pdf2html.cgi index 3fd445a..aa11f4c 100755 --- a/tools/pdf2html.cgi +++ b/tools/pdf2html.cgi @@ -159,7 +159,7 @@ class WebApp(object): def convert(self): self.form = cgi.FieldStorage(fp=self.infp, environ=self.environ) - if (self.method != 'POST' or + if (self.method != 'POST' or 'c' not in self.form or 'f' not in self.form): self.response_200()