[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@18.116.20.205: ~ $
"""
Read and write ZIP files.
"""
import struct, os, time, sys, shutil
import binascii, cStringIO, stat
import io
import re
import string

try:
    import zlib # We may need its compression method
    crc32 = zlib.crc32
except ImportError:
    zlib = None
    crc32 = binascii.crc32

__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
           "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ]

class BadZipfile(Exception):
    pass


class LargeZipFile(Exception):
    """
    Raised when writing a zipfile, the zipfile requires ZIP64 extensions
    and those extensions are disabled.
    """

error = BadZipfile      # The exception raised by this module

ZIP64_LIMIT = (1 << 31) - 1
ZIP_FILECOUNT_LIMIT = 1 << 16
ZIP_MAX_COMMENT = (1 << 16) - 1

# constants for Zip file compression methods
ZIP_STORED = 0
ZIP_DEFLATED = 8
# Other ZIP compression methods not supported

# Below are some formats and associated data for reading/writing headers using
# the struct module.  The names and structures of headers/records are those used
# in the PKWARE description of the ZIP file format:
#     http://www.pkware.com/documents/casestudies/APPNOTE.TXT
# (URL valid as of January 2008)

# The "end of central directory" structure, magic number, size, and indices
# (section V.I in the format document)
structEndArchive = "<4s4H2LH"
stringEndArchive = "PK\005\006"
sizeEndCentDir = struct.calcsize(structEndArchive)

_ECD_SIGNATURE = 0
_ECD_DISK_NUMBER = 1
_ECD_DISK_START = 2
_ECD_ENTRIES_THIS_DISK = 3
_ECD_ENTRIES_TOTAL = 4
_ECD_SIZE = 5
_ECD_OFFSET = 6
_ECD_COMMENT_SIZE = 7
# These last two indices are not part of the structure as defined in the
# spec, but they are used internally by this module as a convenience
_ECD_COMMENT = 8
_ECD_LOCATION = 9

# The "central directory" structure, magic number, size, and indices
# of entries in the structure (section V.F in the format document)
structCentralDir = "<4s4B4HL2L5H2L"
stringCentralDir = "PK\001\002"
sizeCentralDir = struct.calcsize(structCentralDir)

# indexes of entries in the central directory structure
_CD_SIGNATURE = 0
_CD_CREATE_VERSION = 1
_CD_CREATE_SYSTEM = 2
_CD_EXTRACT_VERSION = 3
_CD_EXTRACT_SYSTEM = 4
_CD_FLAG_BITS = 5
_CD_COMPRESS_TYPE = 6
_CD_TIME = 7
_CD_DATE = 8
_CD_CRC = 9
_CD_COMPRESSED_SIZE = 10
_CD_UNCOMPRESSED_SIZE = 11
_CD_FILENAME_LENGTH = 12
_CD_EXTRA_FIELD_LENGTH = 13
_CD_COMMENT_LENGTH = 14
_CD_DISK_NUMBER_START = 15
_CD_INTERNAL_FILE_ATTRIBUTES = 16
_CD_EXTERNAL_FILE_ATTRIBUTES = 17
_CD_LOCAL_HEADER_OFFSET = 18

# The "local file header" structure, magic number, size, and indices
# (section V.A in the format document)
structFileHeader = "<4s2B4HL2L2H"
stringFileHeader = "PK\003\004"
sizeFileHeader = struct.calcsize(structFileHeader)

_FH_SIGNATURE = 0
_FH_EXTRACT_VERSION = 1
_FH_EXTRACT_SYSTEM = 2
_FH_GENERAL_PURPOSE_FLAG_BITS = 3
_FH_COMPRESSION_METHOD = 4
_FH_LAST_MOD_TIME = 5
_FH_LAST_MOD_DATE = 6
_FH_CRC = 7
_FH_COMPRESSED_SIZE = 8
_FH_UNCOMPRESSED_SIZE = 9
_FH_FILENAME_LENGTH = 10
_FH_EXTRA_FIELD_LENGTH = 11

# The "Zip64 end of central directory locator" structure, magic number, and size
structEndArchive64Locator = "<4sLQL"
stringEndArchive64Locator = "PK\x06\x07"
sizeEndCentDir64Locator = struct.calcsize(structEndArchive64Locator)

# The "Zip64 end of central directory" record, magic number, size, and indices
# (section V.G in the format document)
structEndArchive64 = "<4sQ2H2L4Q"
stringEndArchive64 = "PK\x06\x06"
sizeEndCentDir64 = struct.calcsize(structEndArchive64)

_CD64_SIGNATURE = 0
_CD64_DIRECTORY_RECSIZE = 1
_CD64_CREATE_VERSION = 2
_CD64_EXTRACT_VERSION = 3
_CD64_DISK_NUMBER = 4
_CD64_DISK_NUMBER_START = 5
_CD64_NUMBER_ENTRIES_THIS_DISK = 6
_CD64_NUMBER_ENTRIES_TOTAL = 7
_CD64_DIRECTORY_SIZE = 8
_CD64_OFFSET_START_CENTDIR = 9

def _check_zipfile(fp):
    try:
        if _EndRecData(fp):
            return True         # file has correct magic number
    except IOError:
        pass
    return False

def is_zipfile(filename):
    """Quickly see if a file is a ZIP file by checking the magic number.

    The filename argument may be a file or file-like object too.
    """
    result = False
    try:
        if hasattr(filename, "read"):
            result = _check_zipfile(fp=filename)
        else:
            with open(filename, "rb") as fp:
                result = _check_zipfile(fp)
    except IOError:
        pass
    return result

def _EndRecData64(fpin, offset, endrec):
    """
    Read the ZIP64 end-of-archive records and use that to update endrec
    """
    try:
        fpin.seek(offset - sizeEndCentDir64Locator, 2)
    except IOError:
        # If the seek fails, the file is not large enough to contain a ZIP64
        # end-of-archive record, so just return the end record we were given.
        return endrec

    data = fpin.read(sizeEndCentDir64Locator)
    if len(data) != sizeEndCentDir64Locator:
        return endrec
    sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data)
    if sig != stringEndArchive64Locator:
        return endrec

    if diskno != 0 or disks != 1:
        raise BadZipfile("zipfiles that span multiple disks are not supported")

    # Assume no 'zip64 extensible data'
    fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2)
    data = fpin.read(sizeEndCentDir64)
    if len(data) != sizeEndCentDir64:
        return endrec
    sig, sz, create_version, read_version, disk_num, disk_dir, \
            dircount, dircount2, dirsize, diroffset = \
            struct.unpack(structEndArchive64, data)
    if sig != stringEndArchive64:
        return endrec

    # Update the original endrec using data from the ZIP64 record
    endrec[_ECD_SIGNATURE] = sig
    endrec[_ECD_DISK_NUMBER] = disk_num
    endrec[_ECD_DISK_START] = disk_dir
    endrec[_ECD_ENTRIES_THIS_DISK] = dircount
    endrec[_ECD_ENTRIES_TOTAL] = dircount2
    endrec[_ECD_SIZE] = dirsize
    endrec[_ECD_OFFSET] = diroffset
    return endrec


def _EndRecData(fpin):
    """Return data from the "End of Central Directory" record, or None.

    The data is a list of the nine items in the ZIP "End of central dir"
    record followed by a tenth item, the file seek offset of this record."""

    # Determine file size
    fpin.seek(0, 2)
    filesize = fpin.tell()

    # Check to see if this is ZIP file with no archive comment (the
    # "end of central directory" structure should be the last item in the
    # file if this is the case).
    try:
        fpin.seek(-sizeEndCentDir, 2)
    except IOError:
        return None
    data = fpin.read()
    if (len(data) == sizeEndCentDir and
        data[0:4] == stringEndArchive and
        data[-2:] == b"\000\000"):
        # the signature is correct and there's no comment, unpack structure
        endrec = struct.unpack(structEndArchive, data)
        endrec=list(endrec)

        # Append a blank comment and record start offset
        endrec.append("")
        endrec.append(filesize - sizeEndCentDir)

        # Try to read the "Zip64 end of central directory" structure
        return _EndRecData64(fpin, -sizeEndCentDir, endrec)

    # Either this is not a ZIP file, or it is a ZIP file with an archive
    # comment.  Search the end of the file for the "end of central directory"
    # record signature. The comment is the last item in the ZIP file and may be
    # up to 64K long.  It is assumed that the "end of central directory" magic
    # number does not appear in the comment.
    maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0)
    fpin.seek(maxCommentStart, 0)
    data = fpin.read()
    start = data.rfind(stringEndArchive)
    if start >= 0:
        # found the magic number; attempt to unpack and interpret
        recData = data[start:start+sizeEndCentDir]
        if len(recData) != sizeEndCentDir:
            # Zip file is corrupted.
            return None
        endrec = list(struct.unpack(structEndArchive, recData))
        commentSize = endrec[_ECD_COMMENT_SIZE] #as claimed by the zip file
        comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize]
        endrec.append(comment)
        endrec.append(maxCommentStart + start)

        # Try to read the "Zip64 end of central directory" structure
        return _EndRecData64(fpin, maxCommentStart + start - filesize,
                             endrec)

    # Unable to find a valid end of central directory structure
    return None


class ZipInfo (object):
    """Class with attributes describing each file in the ZIP archive."""

    __slots__ = (
            'orig_filename',
            'filename',
            'date_time',
            'compress_type',
            'comment',
            'extra',
            'create_system',
            'create_version',
            'extract_version',
            'reserved',
            'flag_bits',
            'volume',
            'internal_attr',
            'external_attr',
            'header_offset',
            'CRC',
            'compress_size',
            'file_size',
            '_raw_time',
        )

    def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
        self.orig_filename = filename   # Original file name in archive

        # Terminate the file name at the first null byte.  Null bytes in file
        # names are used as tricks by viruses in archives.
        null_byte = filename.find(chr(0))
        if null_byte >= 0:
            filename = filename[0:null_byte]
        # This is used to ensure paths in generated ZIP files always use
        # forward slashes as the directory separator, as required by the
        # ZIP format specification.
        if os.sep != "/" and os.sep in filename:
            filename = filename.replace(os.sep, "/")

        self.filename = filename        # Normalized file name
        self.date_time = date_time      # year, month, day, hour, min, sec

        if date_time[0] < 1980:
            raise ValueError('ZIP does not support timestamps before 1980')

        # Standard values:
        self.compress_type = ZIP_STORED # Type of compression for the file
        self.comment = ""               # Comment for each file
        self.extra = ""                 # ZIP extra data
        if sys.platform == 'win32':
            self.create_system = 0          # System which created ZIP archive
        else:
            # Assume everything else is unix-y
            self.create_system = 3          # System which created ZIP archive
        self.create_version = 20        # Version which created ZIP archive
        self.extract_version = 20       # Version needed to extract archive
        self.reserved = 0               # Must be zero
        self.flag_bits = 0              # ZIP flag bits
        self.volume = 0                 # Volume number of file header
        self.internal_attr = 0          # Internal attributes
        self.external_attr = 0          # External file attributes
        # Other attributes are set by class ZipFile:
        # header_offset         Byte offset to the file header
        # CRC                   CRC-32 of the uncompressed file
        # compress_size         Size of the compressed file
        # file_size             Size of the uncompressed file

    def FileHeader(self, zip64=None):
        """Return the per-file header as a string."""
        dt = self.date_time
        dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
        dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
        if self.flag_bits & 0x08:
            # Set these to zero because we write them after the file data
            CRC = compress_size = file_size = 0
        else:
            CRC = self.CRC
            compress_size = self.compress_size
            file_size = self.file_size

        extra = self.extra

        if zip64 is None:
            zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT
        if zip64:
            fmt = '<HHQQ'
            extra = extra + struct.pack(fmt,
                    1, struct.calcsize(fmt)-4, file_size, compress_size)
        if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT:
            if not zip64:
                raise LargeZipFile("Filesize would require ZIP64 extensions")
            # File is larger than what fits into a 4 byte integer,
            # fall back to the ZIP64 extension
            file_size = 0xffffffff
            compress_size = 0xffffffff
            self.extract_version = max(45, self.extract_version)
            self.create_version = max(45, self.extract_version)

        filename, flag_bits = self._encodeFilenameFlags()
        header = struct.pack(structFileHeader, stringFileHeader,
                 self.extract_version, self.reserved, flag_bits,
                 self.compress_type, dostime, dosdate, CRC,
                 compress_size, file_size,
                 len(filename), len(extra))
        return header + filename + extra

    def _encodeFilenameFlags(self):
        if isinstance(self.filename, unicode):
            try:
                return self.filename.encode('ascii'), self.flag_bits
            except UnicodeEncodeError:
                return self.filename.encode('utf-8'), self.flag_bits | 0x800
        else:
            return self.filename, self.flag_bits

    def _decodeFilename(self):
        if self.flag_bits & 0x800:
            return self.filename.decode('utf-8')
        else:
            return self.filename

    def _decodeExtra(self):
        # Try to decode the extra field.
        extra = self.extra
        unpack = struct.unpack
        while extra:
            tp, ln = unpack('<HH', extra[:4])
            if tp == 1:
                if ln >= 24:
                    counts = unpack('<QQQ', extra[4:28])
                elif ln == 16:
                    counts = unpack('<QQ', extra[4:20])
                elif ln == 8:
                    counts = unpack('<Q', extra[4:12])
                elif ln == 0:
                    counts = ()
                else:
                    raise RuntimeError, "Corrupt extra field %s"%(ln,)

                idx = 0

                # ZIP64 extension (large files and/or large archives)
                if self.file_size in (0xffffffffffffffffL, 0xffffffffL):
                    self.file_size = counts[idx]
                    idx += 1

                if self.compress_size == 0xFFFFFFFFL:
                    self.compress_size = counts[idx]
                    idx += 1

                if self.header_offset == 0xffffffffL:
                    old = self.header_offset
                    self.header_offset = counts[idx]
                    idx+=1

            extra = extra[ln+4:]


class _ZipDecrypter:
    """Class to handle decryption of files stored within a ZIP archive.

    ZIP supports a password-based form of encryption. Even though known
    plaintext attacks have been found against it, it is still useful
    to be able to get data out of such a file.

    Usage:
        zd = _ZipDecrypter(mypwd)
        plain_char = zd(cypher_char)
        plain_text = map(zd, cypher_text)
    """

    def _GenerateCRCTable():
        """Generate a CRC-32 table.

        ZIP encryption uses the CRC32 one-byte primitive for scrambling some
        internal keys. We noticed that a direct implementation is faster than
        relying on binascii.crc32().
        """
        poly = 0xedb88320
        table = [0] * 256
        for i in range(256):
            crc = i
            for j in range(8):
                if crc & 1:
                    crc = ((crc >> 1) & 0x7FFFFFFF) ^ poly
                else:
                    crc = ((crc >> 1) & 0x7FFFFFFF)
            table[i] = crc
        return table
    crctable = _GenerateCRCTable()

    def _crc32(self, ch, crc):
        """Compute the CRC32 primitive on one byte."""
        return ((crc >> 8) & 0xffffff) ^ self.crctable[(crc ^ ord(ch)) & 0xff]

    def __init__(self, pwd):
        self.key0 = 305419896
        self.key1 = 591751049
        self.key2 = 878082192
        for p in pwd:
            self._UpdateKeys(p)

    def _UpdateKeys(self, c):
        self.key0 = self._crc32(c, self.key0)
        self.key1 = (self.key1 + (self.key0 & 255)) & 4294967295
        self.key1 = (self.key1 * 134775813 + 1) & 4294967295
        self.key2 = self._crc32(chr((self.key1 >> 24) & 255), self.key2)

    def __call__(self, c):
        """Decrypt a single character."""
        c = ord(c)
        k = self.key2 | 2
        c = c ^ (((k * (k^1)) >> 8) & 255)
        c = chr(c)
        self._UpdateKeys(c)
        return c


compressor_names = {
    0: 'store',
    1: 'shrink',
    2: 'reduce',
    3: 'reduce',
    4: 'reduce',
    5: 'reduce',
    6: 'implode',
    7: 'tokenize',
    8: 'deflate',
    9: 'deflate64',
    10: 'implode',
    12: 'bzip2',
    14: 'lzma',
    18: 'terse',
    19: 'lz77',
    97: 'wavpack',
    98: 'ppmd',
}


class ZipExtFile(io.BufferedIOBase):
    """File-like object for reading an archive member.
       Is returned by ZipFile.open().
    """

    # Max size supported by decompressor.
    MAX_N = 1 << 31 - 1

    # Read from compressed files in 4k blocks.
    MIN_READ_SIZE = 4096

    # Search for universal newlines or line chunks.
    PATTERN = re.compile(r'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)')

    def __init__(self, fileobj, mode, zipinfo, decrypter=None,
            close_fileobj=False):
        self._fileobj = fileobj
        self._decrypter = decrypter
        self._close_fileobj = close_fileobj

        self._compress_type = zipinfo.compress_type
        self._compress_size = zipinfo.compress_size
        self._compress_left = zipinfo.compress_size

        if self._compress_type == ZIP_DEFLATED:
            self._decompressor = zlib.decompressobj(-15)
        elif self._compress_type != ZIP_STORED:
            descr = compressor_names.get(self._compress_type)
            if descr:
                raise NotImplementedError("compression type %d (%s)" % (self._compress_type, descr))
            else:
                raise NotImplementedError("compression type %d" % (self._compress_type,))
        self._unconsumed = ''

        self._readbuffer = ''
        self._offset = 0

        self._universal = 'U' in mode
        self.newlines = None

        # Adjust read size for encrypted files since the first 12 bytes
        # are for the encryption/password information.
        if self._decrypter is not None:
            self._compress_left -= 12

        self.mode = mode
        self.name = zipinfo.filename

        if hasattr(zipinfo, 'CRC'):
            self._expected_crc = zipinfo.CRC
            self._running_crc = crc32(b'') & 0xffffffff
        else:
            self._expected_crc = None

    def readline(self, limit=-1):
        """Read and return a line from the stream.

        If limit is specified, at most limit bytes will be read.
        """

        if not self._universal and limit < 0:
            # Shortcut common case - newline found in buffer.
            i = self._readbuffer.find('\n', self._offset) + 1
            if i > 0:
                line = self._readbuffer[self._offset: i]
                self._offset = i
                return line

        if not self._universal:
            return io.BufferedIOBase.readline(self, limit)

        line = ''
        while limit < 0 or len(line) < limit:
            readahead = self.peek(2)
            if readahead == '':
                return line

            #
            # Search for universal newlines or line chunks.
            #
            # The pattern returns either a line chunk or a newline, but not
            # both. Combined with peek(2), we are assured that the sequence
            # '\r\n' is always retrieved completely and never split into
            # separate newlines - '\r', '\n' due to coincidental readaheads.
            #
            match = self.PATTERN.search(readahead)
            newline = match.group('newline')
            if newline is not None:
                if self.newlines is None:
                    self.newlines = []
                if newline not in self.newlines:
                    self.newlines.append(newline)
                self._offset += len(newline)
                return line + '\n'

            chunk = match.group('chunk')
            if limit >= 0:
                chunk = chunk[: limit - len(line)]

            self._offset += len(chunk)
            line += chunk

        return line

    def peek(self, n=1):
        """Returns buffered bytes without advancing the position."""
        if n > len(self._readbuffer) - self._offset:
            chunk = self.read(n)
            self._offset -= len(chunk)

        # Return up to 512 bytes to reduce allocation overhead for tight loops.
        return self._readbuffer[self._offset: self._offset + 512]

    def readable(self):
        return True

    def read(self, n=-1):
        """Read and return up to n bytes.
        If the argument is omitted, None, or negative, data is read and returned until EOF is reached..
        """
        buf = ''
        if n is None:
            n = -1
        while True:
            if n < 0:
                data = self.read1(n)
            elif n > len(buf):
                data = self.read1(n - len(buf))
            else:
                return buf
            if len(data) == 0:
                return buf
            buf += data

    def _update_crc(self, newdata, eof):
        # Update the CRC using the given data.
        if self._expected_crc is None:
            # No need to compute the CRC if we don't have a reference value
            return
        self._running_crc = crc32(newdata, self._running_crc) & 0xffffffff
        # Check the CRC if we're at the end of the file
        if eof and self._running_crc != self._expected_crc:
            raise BadZipfile("Bad CRC-32 for file %r" % self.name)

    def read1(self, n):
        """Read up to n bytes with at most one read() system call."""

        # Simplify algorithm (branching) by transforming negative n to large n.
        if n < 0 or n is None:
            n = self.MAX_N

        # Bytes available in read buffer.
        len_readbuffer = len(self._readbuffer) - self._offset

        # Read from file.
        if self._compress_left > 0 and n > len_readbuffer + len(self._unconsumed):
            nbytes = n - len_readbuffer - len(self._unconsumed)
            nbytes = max(nbytes, self.MIN_READ_SIZE)
            nbytes = min(nbytes, self._compress_left)

            data = self._fileobj.read(nbytes)
            self._compress_left -= len(data)

            if data and self._decrypter is not None:
                data = ''.join(map(self._decrypter, data))

            if self._compress_type == ZIP_STORED:
                self._update_crc(data, eof=(self._compress_left==0))
                self._readbuffer = self._readbuffer[self._offset:] + data
                self._offset = 0
            else:
                # Prepare deflated bytes for decompression.
                self._unconsumed += data

        # Handle unconsumed data.
        if (len(self._unconsumed) > 0 and n > len_readbuffer and
            self._compress_type == ZIP_DEFLATED):
            data = self._decompressor.decompress(
                self._unconsumed,
                max(n - len_readbuffer, self.MIN_READ_SIZE)
            )

            self._unconsumed = self._decompressor.unconsumed_tail
            eof = len(self._unconsumed) == 0 and self._compress_left == 0
            if eof:
                data += self._decompressor.flush()

            self._update_crc(data, eof=eof)
            self._readbuffer = self._readbuffer[self._offset:] + data
            self._offset = 0

        # Read from buffer.
        data = self._readbuffer[self._offset: self._offset + n]
        self._offset += len(data)
        return data

    def close(self):
        try :
            if self._close_fileobj:
                self._fileobj.close()
        finally:
            super(ZipExtFile, self).close()


class ZipFile(object):
    """ Class with methods to open, read, write, close, list zip files.

    z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)

    file: Either the path to the file, or a file-like object.
          If it is a path, the file will be opened and closed by ZipFile.
    mode: The mode can be either read "r", write "w" or append "a".
    compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
    allowZip64: if True ZipFile will create files with ZIP64 extensions when
                needed, otherwise it will raise an exception when this would
                be necessary.

    """

    fp = None                   # Set here since __del__ checks it

    def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
        """Open the ZIP file with mode read "r", write "w" or append "a"."""
        if mode not in ("r", "w", "a"):
            raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')

        if compression == ZIP_STORED:
            pass
        elif compression == ZIP_DEFLATED:
            if not zlib:
                raise RuntimeError,\
                      "Compression requires the (missing) zlib module"
        else:
            raise RuntimeError, "That compression method is not supported"

        self._allowZip64 = allowZip64
        self._didModify = False
        self.debug = 0  # Level of printing: 0 through 3
        self.NameToInfo = {}    # Find file info given name
        self.filelist = []      # List of ZipInfo instances for archive
        self.compression = compression  # Method of compression
        self.mode = key = mode.replace('b', '')[0]
        self.pwd = None
        self._comment = ''

        # Check if we were passed a file-like object
        if isinstance(file, basestring):
            self._filePassed = 0
            self.filename = file
            modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
            try:
                self.fp = open(file, modeDict[mode])
            except IOError:
                if mode == 'a':
                    mode = key = 'w'
                    self.fp = open(file, modeDict[mode])
                else:
                    raise
        else:
            self._filePassed = 1
            self.fp = file
            self.filename = getattr(file, 'name', None)

        try:
            if key == 'r':
                self._RealGetContents()
            elif key == 'w':
                # set the modified flag so central directory gets written
                # even if no files are added to the archive
                self._didModify = True
            elif key == 'a':
                try:
                    # See if file is a zip file
                    self._RealGetContents()
                    # seek to start of directory and overwrite
                    self.fp.seek(self.start_dir, 0)
                except BadZipfile:
                    # file is not a zip file, just append
                    self.fp.seek(0, 2)

                    # set the modified flag so central directory gets written
                    # even if no files are added to the archive
                    self._didModify = True
            else:
                raise RuntimeError('Mode must be "r", "w" or "a"')
        except:
            fp = self.fp
            self.fp = None
            if not self._filePassed:
                fp.close()
            raise

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.close()

    def _RealGetContents(self):
        """Read in the table of contents for the ZIP file."""
        fp = self.fp
        try:
            endrec = _EndRecData(fp)
        except IOError:
            raise BadZipfile("File is not a zip file")
        if not endrec:
            raise BadZipfile, "File is not a zip file"
        if self.debug > 1:
            print endrec
        size_cd = endrec[_ECD_SIZE]             # bytes in central directory
        offset_cd = endrec[_ECD_OFFSET]         # offset of central directory
        self._comment = endrec[_ECD_COMMENT]    # archive comment

        # "concat" is zero, unless zip was concatenated to another file
        concat = endrec[_ECD_LOCATION] - size_cd - offset_cd
        if endrec[_ECD_SIGNATURE] == stringEndArchive64:
            # If Zip64 extension structures are present, account for them
            concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator)

        if self.debug > 2:
            inferred = concat + offset_cd
            print "given, inferred, offset", offset_cd, inferred, concat
        # self.start_dir:  Position of start of central directory
        self.start_dir = offset_cd + concat
        fp.seek(self.start_dir, 0)
        data = fp.read(size_cd)
        fp = cStringIO.StringIO(data)
        total = 0
        while total < size_cd:
            centdir = fp.read(sizeCentralDir)
            if len(centdir) != sizeCentralDir:
                raise BadZipfile("Truncated central directory")
            centdir = struct.unpack(structCentralDir, centdir)
            if centdir[_CD_SIGNATURE] != stringCentralDir:
                raise BadZipfile("Bad magic number for central directory")
            if self.debug > 2:
                print centdir
            filename = fp.read(centdir[_CD_FILENAME_LENGTH])
            # Create ZipInfo instance to store file information
            x = ZipInfo(filename)
            x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
            x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
            x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
            (x.create_version, x.create_system, x.extract_version, x.reserved,
                x.flag_bits, x.compress_type, t, d,
                x.CRC, x.compress_size, x.file_size) = centdir[1:12]
            x.volume, x.internal_attr, x.external_attr = centdir[15:18]
            # Convert date/time code to (year, month, day, hour, min, sec)
            x._raw_time = t
            x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
                                     t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )

            x._decodeExtra()
            x.header_offset = x.header_offset + concat
            x.filename = x._decodeFilename()
            self.filelist.append(x)
            self.NameToInfo[x.filename] = x

            # update total bytes read from central directory
            total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
                     + centdir[_CD_EXTRA_FIELD_LENGTH]
                     + centdir[_CD_COMMENT_LENGTH])

            if self.debug > 2:
                print "total", total


    def namelist(self):
        """Return a list of file names in the archive."""
        l = []
        for data in self.filelist:
            l.append(data.filename)
        return l

    def infolist(self):
        """Return a list of class ZipInfo instances for files in the
        archive."""
        return self.filelist

    def printdir(self):
        """Print a table of contents for the zip file."""
        print "%-46s %19s %12s" % ("File Name", "Modified    ", "Size")
        for zinfo in self.filelist:
            date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time[:6]
            print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)

    def testzip(self):
        """Read all the files and check the CRC."""
        chunk_size = 2 ** 20
        for zinfo in self.filelist:
            try:
                # Read by chunks, to avoid an OverflowError or a
                # MemoryError with very large embedded files.
                with self.open(zinfo.filename, "r") as f:
                    while f.read(chunk_size):     # Check CRC-32
                        pass
            except BadZipfile:
                return zinfo.filename

    def getinfo(self, name):
        """Return the instance of ZipInfo given 'name'."""
        info = self.NameToInfo.get(name)
        if info is None:
            raise KeyError(
                'There is no item named %r in the archive' % name)

        return info

    def setpassword(self, pwd):
        """Set default password for encrypted files."""
        self.pwd = pwd

    @property
    def comment(self):
        """The comment text associated with the ZIP file."""
        return self._comment

    @comment.setter
    def comment(self, comment):
        # check for valid comment length
        if len(comment) >= ZIP_MAX_COMMENT:
            if self.debug:
                print('Archive comment is too long; truncating to %d bytes'
                        % ZIP_MAX_COMMENT)
            comment = comment[:ZIP_MAX_COMMENT]
        self._comment = comment
        self._didModify = True

    def read(self, name, pwd=None):
        """Return file bytes (as a string) for name."""
        return self.open(name, "r", pwd).read()

    def open(self, name, mode="r", pwd=None):
        """Return file-like object for 'name'."""
        if mode not in ("r", "U", "rU"):
            raise RuntimeError, 'open() requires mode "r", "U", or "rU"'
        if not self.fp:
            raise RuntimeError, \
                  "Attempt to read ZIP archive that was already closed"

        # Only open a new file for instances where we were not
        # given a file object in the constructor
        if self._filePassed:
            zef_file = self.fp
            should_close = False
        else:
            zef_file = open(self.filename, 'rb')
            should_close = True

        try:
            # Make sure we have an info object
            if isinstance(name, ZipInfo):
                # 'name' is already an info object
                zinfo = name
            else:
                # Get info object for name
                zinfo = self.getinfo(name)

            zef_file.seek(zinfo.header_offset, 0)

            # Skip the file header:
            fheader = zef_file.read(sizeFileHeader)
            if len(fheader) != sizeFileHeader:
                raise BadZipfile("Truncated file header")
            fheader = struct.unpack(structFileHeader, fheader)
            if fheader[_FH_SIGNATURE] != stringFileHeader:
                raise BadZipfile("Bad magic number for file header")

            fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
            if fheader[_FH_EXTRA_FIELD_LENGTH]:
                zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])

            if fname != zinfo.orig_filename:
                raise BadZipfile, \
                        'File name in directory "%s" and header "%s" differ.' % (
                            zinfo.orig_filename, fname)

            # check for encrypted flag & handle password
            is_encrypted = zinfo.flag_bits & 0x1
            zd = None
            if is_encrypted:
                if not pwd:
                    pwd = self.pwd
                if not pwd:
                    raise RuntimeError, "File %s is encrypted, " \
                        "password required for extraction" % name

                zd = _ZipDecrypter(pwd)
                # The first 12 bytes in the cypher stream is an encryption header
                #  used to strengthen the algorithm. The first 11 bytes are
                #  completely random, while the 12th contains the MSB of the CRC,
                #  or the MSB of the file time depending on the header type
                #  and is used to check the correctness of the password.
                bytes = zef_file.read(12)
                h = map(zd, bytes[0:12])
                if zinfo.flag_bits & 0x8:
                    # compare against the file type from extended local headers
                    check_byte = (zinfo._raw_time >> 8) & 0xff
                else:
                    # compare against the CRC otherwise
                    check_byte = (zinfo.CRC >> 24) & 0xff
                if ord(h[11]) != check_byte:
                    raise RuntimeError("Bad password for file", name)

            return ZipExtFile(zef_file, mode, zinfo, zd,
                    close_fileobj=should_close)
        except:
            if should_close:
                zef_file.close()
            raise

    def extract(self, member, path=None, pwd=None):
        """Extract a member from the archive to the current working directory,
           using its full name. Its file information is extracted as accurately
           as possible. `member' may be a filename or a ZipInfo object. You can
           specify a different directory using `path'.
        """
        if not isinstance(member, ZipInfo):
            member = self.getinfo(member)

        if path is None:
            path = os.getcwd()

        return self._extract_member(member, path, pwd)

    def extractall(self, path=None, members=None, pwd=None):
        """Extract all members from the archive to the current working
           directory. `path' specifies a different directory to extract to.
           `members' is optional and must be a subset of the list returned
           by namelist().
        """
        if members is None:
            members = self.namelist()

        for zipinfo in members:
            self.extract(zipinfo, path, pwd)

    def _extract_member(self, member, targetpath, pwd):
        """Extract the ZipInfo object 'member' to a physical
           file on the path targetpath.
        """
        # build the destination pathname, replacing
        # forward slashes to platform specific separators.
        arcname = member.filename.replace('/', os.path.sep)

        if os.path.altsep:
            arcname = arcname.replace(os.path.altsep, os.path.sep)
        # interpret absolute pathname as relative, remove drive letter or
        # UNC path, redundant separators, "." and ".." components.
        arcname = os.path.splitdrive(arcname)[1]
        arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
                    if x not in ('', os.path.curdir, os.path.pardir))
        if os.path.sep == '\\':
            # filter illegal characters on Windows
            illegal = ':<>|"?*'
            if isinstance(arcname, unicode):
                table = {ord(c): ord('_') for c in illegal}
            else:
                table = string.maketrans(illegal, '_' * len(illegal))
            arcname = arcname.translate(table)
            # remove trailing dots
            arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
            arcname = os.path.sep.join(x for x in arcname if x)

        targetpath = os.path.join(targetpath, arcname)
        targetpath = os.path.normpath(targetpath)

        # Create all upper directories if necessary.
        upperdirs = os.path.dirname(targetpath)
        if upperdirs and not os.path.exists(upperdirs):
            os.makedirs(upperdirs)

        if member.filename[-1] == '/':
            if not os.path.isdir(targetpath):
                os.mkdir(targetpath)
            return targetpath

        with self.open(member, pwd=pwd) as source, \
             file(targetpath, "wb") as target:
            shutil.copyfileobj(source, target)

        return targetpath

    def _writecheck(self, zinfo):
        """Check for errors before writing a file to the archive."""
        if zinfo.filename in self.NameToInfo:
            if self.debug:      # Warning for duplicate names
                print "Duplicate name:", zinfo.filename
        if self.mode not in ("w", "a"):
            raise RuntimeError, 'write() requires mode "w" or "a"'
        if not self.fp:
            raise RuntimeError, \
                  "Attempt to write ZIP archive that was already closed"
        if zinfo.compress_type == ZIP_DEFLATED and not zlib:
            raise RuntimeError, \
                  "Compression requires the (missing) zlib module"
        if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
            raise RuntimeError, \
                  "That compression method is not supported"
        if zinfo.file_size > ZIP64_LIMIT:
            if not self._allowZip64:
                raise LargeZipFile("Filesize would require ZIP64 extensions")
        if zinfo.header_offset > ZIP64_LIMIT:
            if not self._allowZip64:
                raise LargeZipFile("Zipfile size would require ZIP64 extensions")

    def write(self, filename, arcname=None, compress_type=None):
        """Put the bytes from filename into the archive under the name
        arcname."""
        if not self.fp:
            raise RuntimeError(
                  "Attempt to write to ZIP archive that was already closed")

        st = os.stat(filename)
        isdir = stat.S_ISDIR(st.st_mode)
        mtime = time.localtime(st.st_mtime)
        date_time = mtime[0:6]
        # Create ZipInfo instance to store file information
        if arcname is None:
            arcname = filename
        arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
        while arcname[0] in (os.sep, os.altsep):
            arcname = arcname[1:]
        if isdir:
            arcname += '/'
        zinfo = ZipInfo(arcname, date_time)
        zinfo.external_attr = (st[0] & 0xFFFF) << 16L      # Unix attributes
        if compress_type is None:
            zinfo.compress_type = self.compression
        else:
            zinfo.compress_type = compress_type

        zinfo.file_size = st.st_size
        zinfo.flag_bits = 0x00
        zinfo.header_offset = self.fp.tell()    # Start of header bytes

        self._writecheck(zinfo)
        self._didModify = True

        if isdir:
            zinfo.file_size = 0
            zinfo.compress_size = 0
            zinfo.CRC = 0
            self.filelist.append(zinfo)
            self.NameToInfo[zinfo.filename] = zinfo
            self.fp.write(zinfo.FileHeader(False))
            return

        with open(filename, "rb") as fp:
            # Must overwrite CRC and sizes with correct data later
            zinfo.CRC = CRC = 0
            zinfo.compress_size = compress_size = 0
            # Compressed size can be larger than uncompressed size
            zip64 = self._allowZip64 and \
                    zinfo.file_size * 1.05 > ZIP64_LIMIT
            self.fp.write(zinfo.FileHeader(zip64))
            if zinfo.compress_type == ZIP_DEFLATED:
                cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
                     zlib.DEFLATED, -15)
            else:
                cmpr = None
            file_size = 0
            while 1:
                buf = fp.read(1024 * 8)
                if not buf:
                    break
                file_size = file_size + len(buf)
                CRC = crc32(buf, CRC) & 0xffffffff
                if cmpr:
                    buf = cmpr.compress(buf)
                    compress_size = compress_size + len(buf)
                self.fp.write(buf)
        if cmpr:
            buf = cmpr.flush()
            compress_size = compress_size + len(buf)
            self.fp.write(buf)
            zinfo.compress_size = compress_size
        else:
            zinfo.compress_size = file_size
        zinfo.CRC = CRC
        zinfo.file_size = file_size
        if not zip64 and self._allowZip64:
            if file_size > ZIP64_LIMIT:
                raise RuntimeError('File size has increased during compressing')
            if compress_size > ZIP64_LIMIT:
                raise RuntimeError('Compressed size larger than uncompressed size')
        # Seek backwards and write file header (which will now include
        # correct CRC and file sizes)
        position = self.fp.tell()       # Preserve current position in file
        self.fp.seek(zinfo.header_offset, 0)
        self.fp.write(zinfo.FileHeader(zip64))
        self.fp.seek(position, 0)
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo

    def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
        """Write a file into the archive.  The contents is the string
        'bytes'.  'zinfo_or_arcname' is either a ZipInfo instance or
        the name of the file in the archive."""
        if not isinstance(zinfo_or_arcname, ZipInfo):
            zinfo = ZipInfo(filename=zinfo_or_arcname,
                            date_time=time.localtime(time.time())[:6])

            zinfo.compress_type = self.compression
            zinfo.external_attr = 0600 << 16
        else:
            zinfo = zinfo_or_arcname

        if not self.fp:
            raise RuntimeError(
                  "Attempt to write to ZIP archive that was already closed")

        if compress_type is not None:
            zinfo.compress_type = compress_type

        zinfo.file_size = len(bytes)            # Uncompressed size
        zinfo.header_offset = self.fp.tell()    # Start of header bytes
        self._writecheck(zinfo)
        self._didModify = True
        zinfo.CRC = crc32(bytes) & 0xffffffff       # CRC-32 checksum
        if zinfo.compress_type == ZIP_DEFLATED:
            co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
                 zlib.DEFLATED, -15)
            bytes = co.compress(bytes) + co.flush()
            zinfo.compress_size = len(bytes)    # Compressed size
        else:
            zinfo.compress_size = zinfo.file_size
        zip64 = zinfo.file_size > ZIP64_LIMIT or \
                zinfo.compress_size > ZIP64_LIMIT
        if zip64 and not self._allowZip64:
            raise LargeZipFile("Filesize would require ZIP64 extensions")
        self.fp.write(zinfo.FileHeader(zip64))
        self.fp.write(bytes)
        if zinfo.flag_bits & 0x08:
            # Write CRC and file sizes after the file data
            fmt = '<LQQ' if zip64 else '<LLL'
            self.fp.write(struct.pack(fmt, zinfo.CRC, zinfo.compress_size,
                  zinfo.file_size))
        self.fp.flush()
        self.filelist.append(zinfo)
        self.NameToInfo[zinfo.filename] = zinfo

    def __del__(self):
        """Call the "close()" method in case the user forgot."""
        self.close()

    def close(self):
        """Close the file, and for mode "w" and "a" write the ending
        records."""
        if self.fp is None:
            return

        try:
            if self.mode in ("w", "a") and self._didModify: # write ending records
                count = 0
                pos1 = self.fp.tell()
                for zinfo in self.filelist:         # write central directory
                    count = count + 1
                    dt = zinfo.date_time
                    dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
                    dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
                    extra = []
                    if zinfo.file_size > ZIP64_LIMIT \
                            or zinfo.compress_size > ZIP64_LIMIT:
                        extra.append(zinfo.file_size)
                        extra.append(zinfo.compress_size)
                        file_size = 0xffffffff
                        compress_size = 0xffffffff
                    else:
                        file_size = zinfo.file_size
                        compress_size = zinfo.compress_size

                    if zinfo.header_offset > ZIP64_LIMIT:
                        extra.append(zinfo.header_offset)
                        header_offset = 0xffffffffL
                    else:
                        header_offset = zinfo.header_offset

                    extra_data = zinfo.extra
                    if extra:
                        # Append a ZIP64 field to the extra's
                        extra_data = struct.pack(
                                '<HH' + 'Q'*len(extra),
                                1, 8*len(extra), *extra) + extra_data

                        extract_version = max(45, zinfo.extract_version)
                        create_version = max(45, zinfo.create_version)
                    else:
                        extract_version = zinfo.extract_version
                        create_version = zinfo.create_version

                    try:
                        filename, flag_bits = zinfo._encodeFilenameFlags()
                        centdir = struct.pack(structCentralDir,
                        stringCentralDir, create_version,
                        zinfo.create_system, extract_version, zinfo.reserved,
                        flag_bits, zinfo.compress_type, dostime, dosdate,
                        zinfo.CRC, compress_size, file_size,
                        len(filename), len(extra_data), len(zinfo.comment),
                        0, zinfo.internal_attr, zinfo.external_attr,
                        header_offset)
                    except DeprecationWarning:
                        print >>sys.stderr, (structCentralDir,
                        stringCentralDir, create_version,
                        zinfo.create_system, extract_version, zinfo.reserved,
                        zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
                        zinfo.CRC, compress_size, file_size,
                        len(zinfo.filename), len(extra_data), len(zinfo.comment),
                        0, zinfo.internal_attr, zinfo.external_attr,
                        header_offset)
                        raise
                    self.fp.write(centdir)
                    self.fp.write(filename)
                    self.fp.write(extra_data)
                    self.fp.write(zinfo.comment)

                pos2 = self.fp.tell()
                # Write end-of-zip-archive record
                centDirCount = count
                centDirSize = pos2 - pos1
                centDirOffset = pos1
                if (centDirCount >= ZIP_FILECOUNT_LIMIT or
                    centDirOffset > ZIP64_LIMIT or
                    centDirSize > ZIP64_LIMIT):
                    # Need to write the ZIP64 end-of-archive records
                    zip64endrec = struct.pack(
                            structEndArchive64, stringEndArchive64,
                            44, 45, 45, 0, 0, centDirCount, centDirCount,
                            centDirSize, centDirOffset)
                    self.fp.write(zip64endrec)

                    zip64locrec = struct.pack(
                            structEndArchive64Locator,
                            stringEndArchive64Locator, 0, pos2, 1)
                    self.fp.write(zip64locrec)
                    centDirCount = min(centDirCount, 0xFFFF)
                    centDirSize = min(centDirSize, 0xFFFFFFFF)
                    centDirOffset = min(centDirOffset, 0xFFFFFFFF)

                endrec = struct.pack(structEndArchive, stringEndArchive,
                                    0, 0, centDirCount, centDirCount,
                                    centDirSize, centDirOffset, len(self._comment))
                self.fp.write(endrec)
                self.fp.write(self._comment)
                self.fp.flush()
        finally:
            fp = self.fp
            self.fp = None
            if not self._filePassed:
                fp.close()


class PyZipFile(ZipFile):
    """Class to create ZIP archives with Python library files and packages."""

    def writepy(self, pathname, basename = ""):
        """Add all files from "pathname" to the ZIP archive.

        If pathname is a package directory, search the directory and
        all package subdirectories recursively for all *.py and enter
        the modules into the archive.  If pathname is a plain
        directory, listdir *.py and enter all modules.  Else, pathname
        must be a Python *.py file and the module will be put into the
        archive.  Added modules are always module.pyo or module.pyc.
        This method will compile the module.py into module.pyc if
        necessary.
        """
        dir, name = os.path.split(pathname)
        if os.path.isdir(pathname):
            initname = os.path.join(pathname, "__init__.py")
            if os.path.isfile(initname):
                # This is a package directory, add it
                if basename:
                    basename = "%s/%s" % (basename, name)
                else:
                    basename = name
                if self.debug:
                    print "Adding package in", pathname, "as", basename
                fname, arcname = self._get_codename(initname[0:-3], basename)
                if self.debug:
                    print "Adding", arcname
                self.write(fname, arcname)
                dirlist = os.listdir(pathname)
                dirlist.remove("__init__.py")
                # Add all *.py files and package subdirectories
                for filename in dirlist:
                    path = os.path.join(pathname, filename)
                    root, ext = os.path.splitext(filename)
                    if os.path.isdir(path):
                        if os.path.isfile(os.path.join(path, "__init__.py")):
                            # This is a package directory, add it
                            self.writepy(path, basename)  # Recursive call
                    elif ext == ".py":
                        fname, arcname = self._get_codename(path[0:-3],
                                         basename)
                        if self.debug:
                            print "Adding", arcname
                        self.write(fname, arcname)
            else:
                # This is NOT a package directory, add its files at top level
                if self.debug:
                    print "Adding files from directory", pathname
                for filename in os.listdir(pathname):
                    path = os.path.join(pathname, filename)
                    root, ext = os.path.splitext(filename)
                    if ext == ".py":
                        fname, arcname = self._get_codename(path[0:-3],
                                         basename)
                        if self.debug:
                            print "Adding", arcname
                        self.write(fname, arcname)
        else:
            if pathname[-3:] != ".py":
                raise RuntimeError, \
                      'Files added with writepy() must end with ".py"'
            fname, arcname = self._get_codename(pathname[0:-3], basename)
            if self.debug:
                print "Adding file", arcname
            self.write(fname, arcname)

    def _get_codename(self, pathname, basename):
        """Return (filename, archivename) for the path.

        Given a module name path, return the correct file path and
        archive name, compiling if necessary.  For example, given
        /python/lib/string, return (/python/lib/string.pyc, string).
        """
        file_py  = pathname + ".py"
        file_pyc = pathname + ".pyc"
        file_pyo = pathname + ".pyo"
        if os.path.isfile(file_pyo) and \
                            os.stat(file_pyo).st_mtime >= os.stat(file_py).st_mtime:
            fname = file_pyo    # Use .pyo file
        elif not os.path.isfile(file_pyc) or \
             os.stat(file_pyc).st_mtime < os.stat(file_py).st_mtime:
            import py_compile
            if self.debug:
                print "Compiling", file_py
            try:
                py_compile.compile(file_py, file_pyc, None, True)
            except py_compile.PyCompileError,err:
                print err.msg
            fname = file_pyc
        else:
            fname = file_pyc
        archivename = os.path.split(fname)[1]
        if basename:
            archivename = "%s/%s" % (basename, archivename)
        return (fname, archivename)


def main(args = None):
    import textwrap
    USAGE=textwrap.dedent("""\
        Usage:
            zipfile.py -l zipfile.zip        # Show listing of a zipfile
            zipfile.py -t zipfile.zip        # Test if a zipfile is valid
            zipfile.py -e zipfile.zip target # Extract zipfile into target dir
            zipfile.py -c zipfile.zip src ... # Create zipfile from sources
        """)
    if args is None:
        args = sys.argv[1:]

    if not args or args[0] not in ('-l', '-c', '-e', '-t'):
        print USAGE
        sys.exit(1)

    if args[0] == '-l':
        if len(args) != 2:
            print USAGE
            sys.exit(1)
        with ZipFile(args[1], 'r') as zf:
            zf.printdir()

    elif args[0] == '-t':
        if len(args) != 2:
            print USAGE
            sys.exit(1)
        with ZipFile(args[1], 'r') as zf:
            badfile = zf.testzip()
        if badfile:
            print("The following enclosed file is corrupted: {!r}".format(badfile))
        print "Done testing"

    elif args[0] == '-e':
        if len(args) != 3:
            print USAGE
            sys.exit(1)

        with ZipFile(args[1], 'r') as zf:
            out = args[2]
            for path in zf.namelist():
                if path.startswith('./'):
                    tgt = os.path.join(out, path[2:])
                else:
                    tgt = os.path.join(out, path)

                tgtdir = os.path.dirname(tgt)
                if not os.path.exists(tgtdir):
                    os.makedirs(tgtdir)
                with open(tgt, 'wb') as fp:
                    fp.write(zf.read(path))

    elif args[0] == '-c':
        if len(args) < 3:
            print USAGE
            sys.exit(1)

        def addToZip(zf, path, zippath):
            if os.path.isfile(path):
                zf.write(path, zippath, ZIP_DEFLATED)
            elif os.path.isdir(path):
                for nm in os.listdir(path):
                    addToZip(zf,
                            os.path.join(path, nm), os.path.join(zippath, nm))
            # else: ignore

        with ZipFile(args[1], 'w', allowZip64=True) as zf:
            for src in args[2:]:
                addToZip(zf, src, os.path.basename(src))

if __name__ == "__main__":
    main()

Filemanager

Name Type Size Permission Actions
Demo Folder 0755
Doc Folder 0755
Tools Folder 0755
bsddb Folder 0755
compiler Folder 0755
config Folder 0755
ctypes Folder 0755
curses Folder 0755
distutils Folder 0755
email Folder 0755
encodings Folder 0755
hotshot Folder 0755
idlelib Folder 0755
importlib Folder 0755
json Folder 0755
lib-dynload Folder 0755
lib-tk Folder 0755
lib2to3 Folder 0755
logging Folder 0755
multiprocessing Folder 0755
plat-linux2 Folder 0755
pydoc_data Folder 0755
site-packages Folder 0755
sqlite3 Folder 0755
test Folder 0755
unittest Folder 0755
wsgiref Folder 0755
xml Folder 0755
.BaseHTTPServer.pyo.40009 File 21.18 KB 0644
.Bastion.pyo.40009 File 6.5 KB 0644
.CGIHTTPServer.pyo.40009 File 10.84 KB 0644
.ConfigParser.pyo.40009 File 24.62 KB 0644
.Cookie.pyo.40009 File 21.89 KB 0644
.MimeWriter.pyo.40009 File 7.19 KB 0644
.Queue.pyo.40009 File 9.19 KB 0644
.SimpleHTTPServer.pyo.40009 File 7.55 KB 0644
.SimpleXMLRPCServer.pyo.40009 File 22.31 KB 0644
.SocketServer.pyo.40009 File 23.49 KB 0644
.StringIO.pyo.40009 File 11.21 KB 0644
.UserDict.pyo.40009 File 8.61 KB 0644
.UserList.pyo.40009 File 6.42 KB 0644
.UserString.pyo.40009 File 14.52 KB 0644
._LWPCookieJar.pyo.40009 File 5.4 KB 0644
.__future__.pyo.40009 File 4.13 KB 0644
.__phello__.foo.pyo.40009 File 125 B 0644
._abcoll.pyo.40009 File 24.4 KB 0644
._osx_support.pyo.40009 File 11.28 KB 0644
._pyio.pyo.40009 File 62.71 KB 0644
._strptime.pyo.40009 File 14.53 KB 0644
._sysconfigdata.pyo.40009 File 20.72 KB 0644
._threading_local.pyo.40009 File 6.45 KB 0644
._weakrefset.pyo.40009 File 9.25 KB 0644
.aifc.pyo.40009 File 29.31 KB 0644
.antigravity.pyo.40009 File 203 B 0644
.anydbm.pyo.40009 File 2.73 KB 0644
.ast.pyo.40009 File 12.65 KB 0644
.asynchat.pyo.40009 File 8.44 KB 0644
.asyncore.pyo.40009 File 18.4 KB 0644
.atexit.pyo.40009 File 2.15 KB 0644
.audiodev.pyo.40009 File 8.27 KB 0644
.base64.pyo.40009 File 10.63 KB 0644
.bdb.pyo.40009 File 18.65 KB 0644
.binhex.pyo.40009 File 15.04 KB 0644
.bisect.pyo.40009 File 3 KB 0644
.cProfile.pyo.40009 File 6.25 KB 0644
.calendar.pyo.40009 File 27.13 KB 0644
.cgi.pyo.40009 File 31.71 KB 0644
.cgitb.pyo.40009 File 11.9 KB 0644
.chunk.pyo.40009 File 5.46 KB 0644
.cmd.pyo.40009 File 13.71 KB 0644
.code.pyo.40009 File 10.09 KB 0644
.codecs.pyo.40009 File 35.74 KB 0644
.codeop.pyo.40009 File 6.44 KB 0644
.colorsys.pyo.40009 File 3.9 KB 0644
.commands.pyo.40009 File 2.41 KB 0644
.compileall.pyo.40009 File 6.85 KB 0644
.contextlib.pyo.40009 File 4.35 KB 0644
.crypt.pyo.40009 File 2.89 KB 0644
.csv.pyo.40009 File 13.14 KB 0644
.dbhash.pyo.40009 File 718 B 0644
.decimal.pyo.40009 File 167.33 KB 0644
.dircache.pyo.40009 File 1.54 KB 0644
.dis.pyo.40009 File 6.08 KB 0644
.dumbdbm.pyo.40009 File 6.41 KB 0644
.dummy_thread.pyo.40009 File 5.27 KB 0644
.dummy_threading.pyo.40009 File 1.25 KB 0644
.filecmp.pyo.40009 File 9.4 KB 0644
.fileinput.pyo.40009 File 14.48 KB 0644
.fnmatch.pyo.40009 File 3.45 KB 0644
.formatter.pyo.40009 File 18.73 KB 0644
.fpformat.pyo.40009 File 4.56 KB 0644
.fractions.pyo.40009 File 19.27 KB 0644
.ftplib.pyo.40009 File 33.38 KB 0644
.functools.pyo.40009 File 5.95 KB 0644
.genericpath.pyo.40009 File 3.19 KB 0644
.getpass.pyo.40009 File 4.63 KB 0644
.gettext.pyo.40009 File 15.19 KB 0644
.glob.pyo.40009 File 2.83 KB 0644
.gzip.pyo.40009 File 14.72 KB 0644
.hashlib.pyo.40009 File 6.74 KB 0644
.heapq.pyo.40009 File 14.13 KB 0644
.hmac.pyo.40009 File 4.44 KB 0644
.htmlentitydefs.pyo.40009 File 6.22 KB 0644
.htmllib.pyo.40009 File 19.83 KB 0644
.ihooks.pyo.40009 File 20.87 KB 0644
.imghdr.pyo.40009 File 4.73 KB 0644
.inspect.pyo.40009 File 39.04 KB 0644
.io.pyo.40009 File 3.4 KB 0644
.keyword.pyo.40009 File 2.06 KB 0644
.linecache.pyo.40009 File 3.14 KB 0644
.locale.pyo.40009 File 48.77 KB 0644
.macpath.pyo.40009 File 7.47 KB 0644
.macurl2path.pyo.40009 File 2.71 KB 0644
.mailcap.pyo.40009 File 6.92 KB 0644
.md5.pyo.40009 File 378 B 0644
.mhlib.pyo.40009 File 33.01 KB 0644
.mimetools.pyo.40009 File 8.03 KB 0644
.mimetypes.pyo.40009 File 17.86 KB 0644
.mimify.pyo.40009 File 11.71 KB 0644
.mutex.pyo.40009 File 2.46 KB 0644
.netrc.pyo.40009 File 3.83 KB 0644
.new.pyo.40009 File 862 B 0644
.nntplib.pyo.40009 File 20.55 KB 0644
.nturl2path.pyo.40009 File 1.77 KB 0644
.numbers.pyo.40009 File 13.68 KB 0644
.opcode.pyo.40009 File 6 KB 0644
.os.pyo.40009 File 24.96 KB 0644
.os2emxpath.pyo.40009 File 4.39 KB 0644
.pdb.pyo.40009 File 42.59 KB 0644
.pipes.pyo.40009 File 9.09 KB 0644
.pkgutil.pyo.40009 File 18.49 KB 0644
.platform.pyo.40009 File 36.04 KB 0644
.poplib.pyo.40009 File 13.03 KB 0644
.posixfile.pyo.40009 File 7.47 KB 0644
.posixpath.pyo.40009 File 11.03 KB 0644
.pstats.pyo.40009 File 24.43 KB 0644
.pty.pyo.40009 File 4.85 KB 0644
.py_compile.pyo.40009 File 6.27 KB 0644
.pyclbr.pyo.40009 File 9.42 KB 0644
.quopri.pyo.40009 File 6.42 KB 0644
.random.pyo.40009 File 24.99 KB 0644
.re.pyo.40009 File 12.79 KB 0644
.repr.pyo.40009 File 5.26 KB 0644
.rexec.pyo.40009 File 23.58 KB 0644
.rfc822.pyo.40009 File 31.05 KB 0644
.rlcompleter.pyo.40009 File 5.84 KB 0644
.robotparser.pyo.40009 File 7.7 KB 0644
.runpy.pyo.40009 File 8.21 KB 0644
.sched.pyo.40009 File 4.88 KB 0644
.sets.pyo.40009 File 16.5 KB 0644
.sgmllib.pyo.40009 File 15.07 KB 0644
.sha.pyo.40009 File 421 B 0644
.shelve.pyo.40009 File 10.03 KB 0644
.shlex.pyo.40009 File 7.37 KB 0644
.shutil.pyo.40009 File 18.1 KB 0644
.site.pyo.40009 File 19.11 KB 0644
.smtpd.pyo.40009 File 15.52 KB 0644
.smtplib.pyo.40009 File 29.29 KB 0644
.sndhdr.pyo.40009 File 7.18 KB 0644
.sre.pyo.40009 File 519 B 0644
.sre_constants.pyo.40009 File 5.97 KB 0644
.sre_parse.pyo.40009 File 18.98 KB 0644
.ssl.pyo.40009 File 31.51 KB 0644
.stat.pyo.40009 File 2.69 KB 0644
.statvfs.pyo.40009 File 620 B 0644
.string.pyo.40009 File 19.54 KB 0644
.stringold.pyo.40009 File 12.25 KB 0644
.struct.pyo.40009 File 239 B 0644
.subprocess.pyo.40009 File 40.93 KB 0644
.sunau.pyo.40009 File 17.53 KB 0644
.sunaudio.pyo.40009 File 1.94 KB 0644
.symbol.pyo.40009 File 2.96 KB 0644
.sysconfig.pyo.40009 File 17.23 KB 0644
.tabnanny.pyo.40009 File 8.05 KB 0644
.tarfile.pyo.40009 File 73.44 KB 0644
.telnetlib.pyo.40009 File 22.53 KB 0644
.tempfile.pyo.40009 File 19.35 KB 0644
.this.pyo.40009 File 1.19 KB 0644
.timeit.pyo.40009 File 11.5 KB 0644
.toaiff.pyo.40009 File 3.03 KB 0644
.token.pyo.40009 File 3.73 KB 0644
.traceback.pyo.40009 File 11.35 KB 0644
.tty.pyo.40009 File 1.29 KB 0644
.types.pyo.40009 File 2.45 KB 0644
.urlparse.pyo.40009 File 14.73 KB 0644
.user.pyo.40009 File 1.68 KB 0644
.uu.pyo.40009 File 4.21 KB 0644
.uuid.pyo.40009 File 20.68 KB 0644
.weakref.pyo.40009 File 13.72 KB 0644
.whichdb.pyo.40009 File 2.19 KB 0644
.xdrlib.pyo.40009 File 9.07 KB 0644
.xmllib.pyo.40009 File 26.22 KB 0644
.zipfile.pyo.40009 File 40.33 KB 0644
BaseHTTPServer.py File 21.93 KB 0644
BaseHTTPServer.pyc File 21.18 KB 0644
BaseHTTPServer.pyo File 21.18 KB 0644
Bastion.py File 5.61 KB 0644
Bastion.pyc File 6.5 KB 0644
Bastion.pyo File 6.5 KB 0644
CGIHTTPServer.py File 12.84 KB 0644
CGIHTTPServer.pyc File 10.84 KB 0644
CGIHTTPServer.pyo File 10.84 KB 0644
ConfigParser.py File 27.1 KB 0644
ConfigParser.pyc File 24.62 KB 0644
ConfigParser.pyo File 24.62 KB 0644
Cookie.py File 24.66 KB 0644
Cookie.pyc File 21.64 KB 0644
Cookie.pyo File 21.64 KB 0644
DocXMLRPCServer.py File 10.52 KB 0644
DocXMLRPCServer.pyc File 9.96 KB 0644
DocXMLRPCServer.pyo File 9.85 KB 0644
HTMLParser.py File 16.58 KB 0644
HTMLParser.pyc File 13.39 KB 0644
HTMLParser.pyo File 13.1 KB 0644
MimeWriter.py File 6.33 KB 0644
MimeWriter.pyc File 7.19 KB 0644
MimeWriter.pyo File 7.19 KB 0644
Queue.py File 8.36 KB 0644
Queue.pyc File 9.19 KB 0644
Queue.pyo File 9.19 KB 0644
SimpleHTTPServer.py File 7.25 KB 0644
SimpleHTTPServer.pyc File 7.55 KB 0644
SimpleHTTPServer.pyo File 7.55 KB 0644
SimpleXMLRPCServer.py File 25.17 KB 0644
SimpleXMLRPCServer.pyc File 22.31 KB 0644
SimpleXMLRPCServer.pyo File 22.31 KB 0644
SocketServer.py File 23.29 KB 0644
SocketServer.pyc File 23.49 KB 0644
SocketServer.pyo File 23.49 KB 0644
StringIO.py File 10.41 KB 0644
StringIO.pyc File 11.21 KB 0644
StringIO.pyo File 11.21 KB 0644
UserDict.py File 5.67 KB 0644
UserDict.pyc File 8.61 KB 0644
UserDict.pyo File 8.61 KB 0644
UserList.py File 3.56 KB 0644
UserList.pyc File 6.42 KB 0644
UserList.pyo File 6.42 KB 0644
UserString.py File 9.46 KB 0755
UserString.pyc File 14.52 KB 0644
UserString.pyo File 14.52 KB 0644
_LWPCookieJar.py File 6.4 KB 0644
_LWPCookieJar.pyc File 5.4 KB 0644
_LWPCookieJar.pyo File 5.4 KB 0644
_MozillaCookieJar.py File 5.67 KB 0644
_MozillaCookieJar.pyc File 4.37 KB 0644
_MozillaCookieJar.pyo File 4.33 KB 0644
__future__.py File 4.28 KB 0644
__future__.pyc File 4.13 KB 0644
__future__.pyo File 4.13 KB 0644
__phello__.foo.py File 64 B 0644
__phello__.foo.pyc File 125 B 0644
__phello__.foo.pyo File 125 B 0644
_abcoll.py File 17.45 KB 0644
_abcoll.pyc File 24.4 KB 0644
_abcoll.pyo File 24.4 KB 0644
_osx_support.py File 18.03 KB 0644
_osx_support.pyc File 11.28 KB 0644
_osx_support.pyo File 11.28 KB 0644
_pyio.py File 67.24 KB 0644
_pyio.pyc File 62.71 KB 0644
_pyio.pyo File 62.71 KB 0644
_strptime.py File 19.75 KB 0644
_strptime.pyc File 14.53 KB 0644
_strptime.pyo File 14.53 KB 0644
_sysconfigdata.py File 17.56 KB 0644
_sysconfigdata.pyc File 20.72 KB 0644
_sysconfigdata.pyo File 20.72 KB 0644
_threading_local.py File 7.28 KB 0644
_threading_local.pyc File 6.45 KB 0644
_threading_local.pyo File 6.45 KB 0644
_weakrefset.py File 5.48 KB 0644
_weakrefset.pyc File 9.25 KB 0644
_weakrefset.pyo File 9.25 KB 0644
abc.py File 6.98 KB 0644
abc.pyc File 6 KB 0644
abc.pyo File 5.94 KB 0644
aifc.py File 32.94 KB 0644
aifc.pyc File 29.31 KB 0644
aifc.pyo File 29.31 KB 0644
antigravity.py File 60 B 0644
antigravity.pyc File 203 B 0644
antigravity.pyo File 203 B 0644
anydbm.py File 2.6 KB 0644
anydbm.pyc File 2.73 KB 0644
anydbm.pyo File 2.73 KB 0644
argparse.py File 86.46 KB 0644
argparse.pyc File 62.57 KB 0644
argparse.pyo File 62.41 KB 0644
ast.py File 11.53 KB 0644
ast.pyc File 12.65 KB 0644
ast.pyo File 12.65 KB 0644
asynchat.py File 11.13 KB 0644
asynchat.pyc File 8.44 KB 0644
asynchat.pyo File 8.44 KB 0644
asyncore.py File 20.36 KB 0644
asyncore.pyc File 18.4 KB 0644
asyncore.pyo File 18.4 KB 0644
atexit.py File 1.67 KB 0644
atexit.pyc File 2.15 KB 0644
atexit.pyo File 2.15 KB 0644
audiodev.py File 7.42 KB 0644
audiodev.pyc File 8.27 KB 0644
audiodev.pyo File 8.27 KB 0644
base64.py File 11.09 KB 0755
base64.pyc File 10.63 KB 0644
base64.pyo File 10.63 KB 0644
bdb.py File 21.21 KB 0644
bdb.pyc File 18.65 KB 0644
bdb.pyo File 18.65 KB 0644
binhex.py File 14.14 KB 0644
binhex.pyc File 15.04 KB 0644
binhex.pyo File 15.04 KB 0644
bisect.py File 2.53 KB 0644
bisect.pyc File 3 KB 0644
bisect.pyo File 3 KB 0644
cProfile.py File 6.43 KB 0755
cProfile.pyc File 6.25 KB 0644
cProfile.pyo File 6.25 KB 0644
calendar.py File 22.76 KB 0644
calendar.pyc File 27.13 KB 0644
calendar.pyo File 27.13 KB 0644
cgi.py File 33.68 KB 0755
cgi.pyc File 31.71 KB 0644
cgi.pyo File 31.71 KB 0644
cgitb.py File 11.89 KB 0644
cgitb.pyc File 11.9 KB 0644
cgitb.pyo File 11.9 KB 0644
chunk.py File 5.25 KB 0644
chunk.pyc File 5.46 KB 0644
chunk.pyo File 5.46 KB 0644
cmd.py File 14.67 KB 0644
cmd.pyc File 13.71 KB 0644
cmd.pyo File 13.71 KB 0644
code.py File 9.95 KB 0644
code.pyc File 10.09 KB 0644
code.pyo File 10.09 KB 0644
codecs.py File 34.44 KB 0644
codecs.pyc File 35.74 KB 0644
codecs.pyo File 35.74 KB 0644
codeop.py File 5.86 KB 0644
codeop.pyc File 6.44 KB 0644
codeop.pyo File 6.44 KB 0644
collections.py File 25.28 KB 0644
collections.pyc File 23.99 KB 0644
collections.pyo File 23.94 KB 0644
colorsys.py File 3.6 KB 0644
colorsys.pyc File 3.9 KB 0644
colorsys.pyo File 3.9 KB 0644
commands.py File 2.49 KB 0644
commands.pyc File 2.41 KB 0644
commands.pyo File 2.41 KB 0644
compileall.py File 7.58 KB 0644
compileall.pyc File 6.85 KB 0644
compileall.pyo File 6.85 KB 0644
contextlib.py File 4.32 KB 0644
contextlib.pyc File 4.35 KB 0644
contextlib.pyo File 4.35 KB 0644
cookielib.py File 63.21 KB 0644
cookielib.pyc File 53.55 KB 0644
cookielib.pyo File 53.37 KB 0644
copy.py File 11.25 KB 0644
copy.pyc File 11.91 KB 0644
copy.pyo File 11.82 KB 0644
copy_reg.py File 6.64 KB 0644
copy_reg.pyc File 4.99 KB 0644
copy_reg.pyo File 4.95 KB 0644
crypt.py File 2.24 KB 0644
crypt.pyc File 2.89 KB 0644
crypt.pyo File 2.89 KB 0644
csv.py File 15.96 KB 0644
csv.pyc File 13.14 KB 0644
csv.pyo File 13.14 KB 0644
dbhash.py File 498 B 0644
dbhash.pyc File 718 B 0644
dbhash.pyo File 718 B 0644
decimal.py File 215.84 KB 0644
decimal.pyc File 167.33 KB 0644
decimal.pyo File 167.33 KB 0644
difflib.py File 80.42 KB 0644
difflib.pyc File 60.5 KB 0644
difflib.pyo File 60.45 KB 0644
dircache.py File 1.1 KB 0644
dircache.pyc File 1.54 KB 0644
dircache.pyo File 1.54 KB 0644
dis.py File 6.35 KB 0644
dis.pyc File 6.08 KB 0644
dis.pyo File 6.08 KB 0644
doctest.py File 102.01 KB 0644
doctest.pyc File 81.45 KB 0644
doctest.pyo File 81.17 KB 0644
dumbdbm.py File 8.61 KB 0644
dumbdbm.pyc File 6.41 KB 0644
dumbdbm.pyo File 6.41 KB 0644
dummy_thread.py File 4.31 KB 0644
dummy_thread.pyc File 5.27 KB 0644
dummy_thread.pyo File 5.27 KB 0644
dummy_threading.py File 2.74 KB 0644
dummy_threading.pyc File 1.25 KB 0644
dummy_threading.pyo File 1.25 KB 0644
filecmp.py File 9.36 KB 0644
filecmp.pyc File 9.4 KB 0644
filecmp.pyo File 9.4 KB 0644
fileinput.py File 13.81 KB 0644
fileinput.pyc File 14.48 KB 0644
fileinput.pyo File 14.48 KB 0644
fnmatch.py File 3.16 KB 0644
fnmatch.pyc File 3.45 KB 0644
fnmatch.pyo File 3.45 KB 0644
formatter.py File 14.56 KB 0644
formatter.pyc File 18.73 KB 0644
formatter.pyo File 18.73 KB 0644
fpformat.py File 4.59 KB 0644
fpformat.pyc File 4.56 KB 0644
fpformat.pyo File 4.56 KB 0644
fractions.py File 21.87 KB 0644
fractions.pyc File 19.27 KB 0644
fractions.pyo File 19.27 KB 0644
ftplib.py File 36.1 KB 0644
ftplib.pyc File 33.38 KB 0644
ftplib.pyo File 33.38 KB 0644
functools.py File 4.37 KB 0644
functools.pyc File 5.95 KB 0644
functools.pyo File 5.95 KB 0644
genericpath.py File 2.94 KB 0644
genericpath.pyc File 3.19 KB 0644
genericpath.pyo File 3.19 KB 0644
getopt.py File 7.15 KB 0644
getopt.pyc File 6.5 KB 0644
getopt.pyo File 6.45 KB 0644
getpass.py File 5.43 KB 0644
getpass.pyc File 4.63 KB 0644
getpass.pyo File 4.63 KB 0644
gettext.py File 19.47 KB 0644
gettext.pyc File 15.19 KB 0644
gettext.pyo File 15.19 KB 0644
glob.py File 2.86 KB 0644
glob.pyc File 2.83 KB 0644
glob.pyo File 2.83 KB 0644
gzip.py File 18.26 KB 0644
gzip.pyc File 14.72 KB 0644
gzip.pyo File 14.72 KB 0644
hashlib.py File 7.48 KB 0644
hashlib.pyc File 6.74 KB 0644
hashlib.pyo File 6.74 KB 0644
heapq.py File 17.76 KB 0644
heapq.pyc File 14.13 KB 0644
heapq.pyo File 14.13 KB 0644
hmac.py File 4.48 KB 0644
hmac.pyc File 4.44 KB 0644
hmac.pyo File 4.44 KB 0644
htmlentitydefs.py File 17.63 KB 0644
htmlentitydefs.pyc File 6.22 KB 0644
htmlentitydefs.pyo File 6.22 KB 0644
htmllib.py File 12.57 KB 0644
htmllib.pyc File 19.83 KB 0644
htmllib.pyo File 19.83 KB 0644
httplib.py File 51.37 KB 0644
httplib.pyc File 37.54 KB 0644
httplib.pyo File 37.37 KB 0644
ihooks.py File 18.54 KB 0644
ihooks.pyc File 20.87 KB 0644
ihooks.pyo File 20.87 KB 0644
imaplib.py File 47.14 KB 0644
imaplib.pyc File 44.28 KB 0644
imaplib.pyo File 41.63 KB 0644
imghdr.py File 3.46 KB 0644
imghdr.pyc File 4.73 KB 0644
imghdr.pyo File 4.73 KB 0644
imputil.py File 25.16 KB 0644
imputil.pyc File 15.26 KB 0644
imputil.pyo File 15.08 KB 0644
inspect.py File 41.47 KB 0644
inspect.pyc File 39.04 KB 0644
inspect.pyo File 39.04 KB 0644
io.py File 3.12 KB 0644
io.pyc File 3.4 KB 0644
io.pyo File 3.4 KB 0644
keyword.py File 1.95 KB 0755
keyword.pyc File 2.06 KB 0644
keyword.pyo File 2.06 KB 0644
linecache.py File 3.87 KB 0644
linecache.pyc File 3.14 KB 0644
linecache.pyo File 3.14 KB 0644
locale.py File 87.33 KB 0644
locale.pyc File 48.77 KB 0644
locale.pyo File 48.77 KB 0644
macpath.py File 6.11 KB 0644
macpath.pyc File 7.47 KB 0644
macpath.pyo File 7.47 KB 0644
macurl2path.py File 3.2 KB 0644
macurl2path.pyc File 2.71 KB 0644
macurl2path.pyo File 2.71 KB 0644
mailbox.py File 78.86 KB 0644
mailbox.pyc File 74.87 KB 0644
mailbox.pyo File 74.82 KB 0644
mailcap.py File 7.25 KB 0644
mailcap.pyc File 6.92 KB 0644
mailcap.pyo File 6.92 KB 0644
markupbase.py File 14.3 KB 0644
markupbase.pyc File 9.08 KB 0644
markupbase.pyo File 8.89 KB 0644
md5.py File 358 B 0644
md5.pyc File 378 B 0644
md5.pyo File 378 B 0644
mhlib.py File 32.65 KB 0644
mhlib.pyc File 33.01 KB 0644
mhlib.pyo File 33.01 KB 0644
mimetools.py File 7 KB 0644
mimetools.pyc File 8.03 KB 0644
mimetools.pyo File 8.03 KB 0644
mimetypes.py File 20.22 KB 0644
mimetypes.pyc File 17.86 KB 0644
mimetypes.pyo File 17.86 KB 0644
mimify.py File 14.67 KB 0755
mimify.pyc File 11.71 KB 0644
mimify.pyo File 11.71 KB 0644
modulefinder.py File 23.71 KB 0644
modulefinder.pyc File 18.27 KB 0644
modulefinder.pyo File 18.19 KB 0644
multifile.py File 4.71 KB 0644
multifile.pyc File 5.29 KB 0644
multifile.pyo File 5.25 KB 0644
mutex.py File 1.83 KB 0644
mutex.pyc File 2.46 KB 0644
mutex.pyo File 2.46 KB 0644
netrc.py File 4.47 KB 0644
netrc.pyc File 3.83 KB 0644
netrc.pyo File 3.83 KB 0644
new.py File 610 B 0644
new.pyc File 862 B 0644
new.pyo File 862 B 0644
nntplib.py File 20.97 KB 0644
nntplib.pyc File 20.55 KB 0644
nntplib.pyo File 20.55 KB 0644
ntpath.py File 18.02 KB 0644
ntpath.pyc File 11.6 KB 0644
ntpath.pyo File 11.56 KB 0644
nturl2path.py File 2.32 KB 0644
nturl2path.pyc File 1.77 KB 0644
nturl2path.pyo File 1.77 KB 0644
numbers.py File 10.08 KB 0644
numbers.pyc File 13.68 KB 0644
numbers.pyo File 13.68 KB 0644
opcode.py File 5.35 KB 0644
opcode.pyc File 6 KB 0644
opcode.pyo File 6 KB 0644
optparse.py File 59.69 KB 0644
optparse.pyc File 52.78 KB 0644
optparse.pyo File 52.7 KB 0644
os.py File 25.17 KB 0644
os.pyc File 24.96 KB 0644
os.pyo File 24.96 KB 0644
os2emxpath.py File 4.5 KB 0644
os2emxpath.pyc File 4.39 KB 0644
os2emxpath.pyo File 4.39 KB 0644
pdb.doc File 7.73 KB 0644
pdb.py File 44.94 KB 0755
pdb.pyc File 42.59 KB 0644
pdb.pyo File 42.59 KB 0644
pickle.py File 44.09 KB 0644
pickle.pyc File 37.56 KB 0644
pickle.pyo File 37.37 KB 0644
pickletools.py File 72.79 KB 0644
pickletools.pyc File 55.77 KB 0644
pickletools.pyo File 54.95 KB 0644
pipes.py File 9.36 KB 0644
pipes.pyc File 9.09 KB 0644
pipes.pyo File 9.09 KB 0644
pkgutil.py File 19.87 KB 0644
pkgutil.pyc File 18.49 KB 0644
pkgutil.pyo File 18.49 KB 0644
platform.py File 51.97 KB 0755
platform.pyc File 36.04 KB 0644
platform.pyo File 36.04 KB 0644
plistlib.py File 15.44 KB 0644
plistlib.pyc File 19.52 KB 0644
plistlib.pyo File 19.44 KB 0644
popen2.py File 8.22 KB 0644
popen2.pyc File 8.81 KB 0644
popen2.pyo File 8.77 KB 0644
poplib.py File 12.52 KB 0644
poplib.pyc File 13.03 KB 0644
poplib.pyo File 13.03 KB 0644
posixfile.py File 7.82 KB 0644
posixfile.pyc File 7.47 KB 0644
posixfile.pyo File 7.47 KB 0644
posixpath.py File 13.27 KB 0644
posixpath.pyc File 11.03 KB 0644
posixpath.pyo File 11.03 KB 0644
pprint.py File 11.73 KB 0644
pprint.pyc File 10.06 KB 0644
pprint.pyo File 9.89 KB 0644
profile.py File 22.25 KB 0755
profile.pyc File 16.07 KB 0644
profile.pyo File 15.83 KB 0644
pstats.py File 26.08 KB 0644
pstats.pyc File 24.43 KB 0644
pstats.pyo File 24.43 KB 0644
pty.py File 4.94 KB 0644
pty.pyc File 4.85 KB 0644
pty.pyo File 4.85 KB 0644
py_compile.py File 5.79 KB 0644
py_compile.pyc File 6.27 KB 0644
py_compile.pyo File 6.27 KB 0644
pyclbr.py File 13.07 KB 0644
pyclbr.pyc File 9.42 KB 0644
pyclbr.pyo File 9.42 KB 0644
pydoc.py File 91.12 KB 0755
pydoc.pyc File 88.35 KB 0644
pydoc.pyo File 88.29 KB 0644
quopri.py File 6.81 KB 0755
quopri.pyc File 6.42 KB 0644
quopri.pyo File 6.42 KB 0644
random.py File 31.45 KB 0644
random.pyc File 24.99 KB 0644
random.pyo File 24.99 KB 0644
re.py File 12.66 KB 0644
re.pyc File 12.79 KB 0644
re.pyo File 12.79 KB 0644
repr.py File 4.2 KB 0644
repr.pyc File 5.26 KB 0644
repr.pyo File 5.26 KB 0644
rexec.py File 19.68 KB 0644
rexec.pyc File 23.58 KB 0644
rexec.pyo File 23.58 KB 0644
rfc822.py File 32.51 KB 0644
rfc822.pyc File 31.05 KB 0644
rfc822.pyo File 31.05 KB 0644
rlcompleter.py File 5.68 KB 0644
rlcompleter.pyc File 5.84 KB 0644
rlcompleter.pyo File 5.84 KB 0644
robotparser.py File 7.03 KB 0644
robotparser.pyc File 7.7 KB 0644
robotparser.pyo File 7.7 KB 0644
runpy.py File 10.45 KB 0644
runpy.pyc File 8.21 KB 0644
runpy.pyo File 8.21 KB 0644
sched.py File 4.97 KB 0644
sched.pyc File 4.88 KB 0644
sched.pyo File 4.88 KB 0644
sets.py File 18.6 KB 0644
sets.pyc File 16.5 KB 0644
sets.pyo File 16.5 KB 0644
sgmllib.py File 17.46 KB 0644
sgmllib.pyc File 15.07 KB 0644
sgmllib.pyo File 15.07 KB 0644
sha.py File 393 B 0644
sha.pyc File 421 B 0644
sha.pyo File 421 B 0644
shelve.py File 7.89 KB 0644
shelve.pyc File 10.03 KB 0644
shelve.pyo File 10.03 KB 0644
shlex.py File 10.88 KB 0644
shlex.pyc File 7.37 KB 0644
shlex.pyo File 7.37 KB 0644
shutil.py File 18.46 KB 0644
shutil.pyc File 18.1 KB 0644
shutil.pyo File 18.1 KB 0644
site.py File 19.61 KB 0644
site.pyc File 19.11 KB 0644
site.pyo File 19.11 KB 0644
smtpd.py File 18.11 KB 0755
smtpd.pyc File 15.52 KB 0644
smtpd.pyo File 15.52 KB 0644
smtplib.py File 30.9 KB 0755
smtplib.pyc File 29.29 KB 0644
smtplib.pyo File 29.29 KB 0644
sndhdr.py File 5.83 KB 0644
sndhdr.pyc File 7.18 KB 0644
sndhdr.pyo File 7.18 KB 0644
socket.py File 20.03 KB 0644
socket.pyc File 15.73 KB 0644
socket.pyo File 15.64 KB 0644
sre.py File 384 B 0644
sre.pyc File 519 B 0644
sre.pyo File 519 B 0644
sre_compile.py File 15.99 KB 0644
sre_compile.pyc File 10.76 KB 0644
sre_compile.pyo File 10.65 KB 0644
sre_constants.py File 6.95 KB 0644
sre_constants.pyc File 5.97 KB 0644
sre_constants.pyo File 5.97 KB 0644
sre_parse.py File 26.84 KB 0644
sre_parse.pyc File 18.98 KB 0644
sre_parse.pyo File 18.98 KB 0644
ssl.py File 38.7 KB 0644
ssl.pyc File 32.05 KB 0644
ssl.pyo File 32.05 KB 0644
stat.py File 1.8 KB 0644
stat.pyc File 2.69 KB 0644
stat.pyo File 2.69 KB 0644
statvfs.py File 898 B 0644
statvfs.pyc File 620 B 0644
statvfs.pyo File 620 B 0644
string.py File 20.27 KB 0644
string.pyc File 19.54 KB 0644
string.pyo File 19.54 KB 0644
stringold.py File 12.16 KB 0644
stringold.pyc File 12.25 KB 0644
stringold.pyo File 12.25 KB 0644
stringprep.py File 13.21 KB 0644
stringprep.pyc File 14.15 KB 0644
stringprep.pyo File 14.08 KB 0644
struct.py File 82 B 0644
struct.pyc File 239 B 0644
struct.pyo File 239 B 0644
subprocess.py File 57.68 KB 0644
subprocess.pyc File 40.93 KB 0644
subprocess.pyo File 40.93 KB 0644
sunau.py File 16.15 KB 0644
sunau.pyc File 17.53 KB 0644
sunau.pyo File 17.53 KB 0644
sunaudio.py File 1.37 KB 0644
sunaudio.pyc File 1.94 KB 0644
sunaudio.pyo File 1.94 KB 0644
symbol.py File 2.01 KB 0755
symbol.pyc File 2.96 KB 0644
symbol.pyo File 2.96 KB 0644
symtable.py File 7.34 KB 0644
symtable.pyc File 11.59 KB 0644
symtable.pyo File 11.46 KB 0644
sysconfig.py File 21.88 KB 0644
sysconfig.pyc File 17.23 KB 0644
sysconfig.pyo File 17.23 KB 0644
tabnanny.py File 11.07 KB 0755
tabnanny.pyc File 8.05 KB 0644
tabnanny.pyo File 8.05 KB 0644
tarfile.py File 88 KB 0644
tarfile.pyc File 73.78 KB 0644
tarfile.pyo File 73.78 KB 0644
telnetlib.py File 26.18 KB 0644
telnetlib.pyc File 22.53 KB 0644
telnetlib.pyo File 22.53 KB 0644
tempfile.py File 17.91 KB 0644
tempfile.pyc File 19.35 KB 0644
tempfile.pyo File 19.35 KB 0644
textwrap.py File 16.64 KB 0644
textwrap.pyc File 11.62 KB 0644
textwrap.pyo File 11.53 KB 0644
this.py File 1002 B 0644
this.pyc File 1.19 KB 0644
this.pyo File 1.19 KB 0644
threading.py File 46.28 KB 0644
threading.pyc File 41.7 KB 0644
threading.pyo File 39.58 KB 0644
timeit.py File 11.82 KB 0644
timeit.pyc File 11.5 KB 0644
timeit.pyo File 11.5 KB 0644
toaiff.py File 3.07 KB 0644
toaiff.pyc File 3.03 KB 0644
toaiff.pyo File 3.03 KB 0644
token.py File 2.88 KB 0755
token.pyc File 3.73 KB 0644
token.pyo File 3.73 KB 0644
tokenize.py File 16.15 KB 0644
tokenize.pyc File 13.61 KB 0644
tokenize.pyo File 13.52 KB 0644
trace.py File 29.19 KB 0644
trace.pyc File 22.26 KB 0644
trace.pyo File 22.2 KB 0644
traceback.py File 10.99 KB 0644
traceback.pyc File 11.35 KB 0644
traceback.pyo File 11.35 KB 0644
tty.py File 879 B 0644
tty.pyc File 1.29 KB 0644
tty.pyo File 1.29 KB 0644
types.py File 1.99 KB 0644
types.pyc File 2.45 KB 0644
types.pyo File 2.45 KB 0644
urllib.py File 57.14 KB 0644
urllib.pyc File 49.1 KB 0644
urllib.pyo File 49 KB 0644
urllib2.py File 51.87 KB 0644
urllib2.pyc File 46.61 KB 0644
urllib2.pyo File 46.52 KB 0644
urlparse.py File 16.44 KB 0644
urlparse.pyc File 15.38 KB 0644
urlparse.pyo File 15.38 KB 0644
user.py File 1.59 KB 0644
user.pyc File 1.68 KB 0644
user.pyo File 1.68 KB 0644
uu.py File 6.4 KB 0755
uu.pyc File 4.21 KB 0644
uu.pyo File 4.21 KB 0644
uuid.py File 20.6 KB 0644
uuid.pyc File 20.68 KB 0644
uuid.pyo File 20.68 KB 0644
warnings.py File 13.71 KB 0644
warnings.pyc File 12.84 KB 0644
warnings.pyo File 12.02 KB 0644
wave.py File 17.67 KB 0644
wave.pyc File 19 KB 0644
wave.pyo File 18.94 KB 0644
weakref.py File 10.44 KB 0644
weakref.pyc File 13.72 KB 0644
weakref.pyo File 13.72 KB 0644
webbrowser.py File 22.19 KB 0644
webbrowser.pyc File 19.32 KB 0644
webbrowser.pyo File 19.27 KB 0644
whichdb.py File 3.3 KB 0644
whichdb.pyc File 2.19 KB 0644
whichdb.pyo File 2.19 KB 0644
wsgiref.egg-info File 187 B 0644
xdrlib.py File 5.43 KB 0644
xdrlib.pyc File 9.07 KB 0644
xdrlib.pyo File 9.07 KB 0644
xmllib.py File 34.05 KB 0644
xmllib.pyc File 26.22 KB 0644
xmllib.pyo File 26.22 KB 0644
xmlrpclib.py File 50.78 KB 0644
xmlrpclib.pyc File 42.89 KB 0644
xmlrpclib.pyo File 42.71 KB 0644
zipfile.py File 56.45 KB 0644
zipfile.pyc File 40.33 KB 0644
zipfile.pyo File 40.33 KB 0644