404

[ Avaa Bypassed ]




Upload:

Command:

elspacio@18.217.122.248: ~ $
"""Open an arbitrary URL.

See the following document for more info on URLs:
"Names and Addresses, URIs, URLs, URNs, URCs", at
http://www.w3.org/pub/WWW/Addressing/Overview.html

See also the HTTP spec (from which the error codes are derived):
"HTTP - Hypertext Transfer Protocol", at
http://www.w3.org/pub/WWW/Protocols/

Related standards and specs:
- RFC1808: the "relative URL" spec. (authoritative status)
- RFC1738 - the "URL standard". (authoritative status)
- RFC1630 - the "URI spec". (informational status)

The object returned by URLopener().open(file) will differ per
protocol.  All you know is that is has methods read(), readline(),
readlines(), fileno(), close() and info().  The read*(), fileno()
and close() methods work like those of open files.
The info() method returns a mimetools.Message object which can be
used to query various info about the object, if available.
(mimetools.Message objects are queried with the getheader() method.)
"""

import string
import socket
import os
import time
import sys
import base64
import re

from urlparse import urljoin as basejoin

__all__ = ["urlopen", "URLopener", "FancyURLopener", "urlretrieve",
           "urlcleanup", "quote", "quote_plus", "unquote", "unquote_plus",
           "urlencode", "url2pathname", "pathname2url", "splittag",
           "localhost", "thishost", "ftperrors", "basejoin", "unwrap",
           "splittype", "splithost", "splituser", "splitpasswd", "splitport",
           "splitnport", "splitquery", "splitattr", "splitvalue",
           "getproxies"]

__version__ = '1.17'    # XXX This version is not always updated :-(

MAXFTPCACHE = 10        # Trim the ftp cache beyond this size

# Helper for non-unix systems
if os.name == 'nt':
    from nturl2path import url2pathname, pathname2url
elif os.name == 'riscos':
    from rourl2path import url2pathname, pathname2url
else:
    def url2pathname(pathname):
        """OS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use."""
        return unquote(pathname)

    def pathname2url(pathname):
        """OS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use."""
        return quote(pathname)

# This really consists of two pieces:
# (1) a class which handles opening of all sorts of URLs
#     (plus assorted utilities etc.)
# (2) a set of functions for parsing URLs
# XXX Should these be separated out into different modules?


# Shortcut for basic usage
_urlopener = None
def urlopen(url, data=None, proxies=None, context=None):
    """Create a file-like object for the specified URL to read from."""
    from warnings import warnpy3k
    warnpy3k("urllib.urlopen() has been removed in Python 3.0 in "
             "favor of urllib2.urlopen()", stacklevel=2)

    global _urlopener
    if proxies is not None or context is not None:
        opener = FancyURLopener(proxies=proxies, context=context)
    elif not _urlopener:
        opener = FancyURLopener()
        _urlopener = opener
    else:
        opener = _urlopener
    if data is None:
        return opener.open(url)
    else:
        return opener.open(url, data)
def urlretrieve(url, filename=None, reporthook=None, data=None, context=None):
    global _urlopener
    if context is not None:
        opener = FancyURLopener(context=context)
    elif not _urlopener:
        _urlopener = opener = FancyURLopener()
    else:
        opener = _urlopener
    return opener.retrieve(url, filename, reporthook, data)
def urlcleanup():
    if _urlopener:
        _urlopener.cleanup()
    _safe_quoters.clear()
    ftpcache.clear()

# check for SSL
try:
    import ssl
except:
    _have_ssl = False
else:
    _have_ssl = True

# exception raised when downloaded size does not match content-length
class ContentTooShortError(IOError):
    def __init__(self, message, content):
        IOError.__init__(self, message)
        self.content = content

ftpcache = {}
class URLopener:
    """Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed)."""

    __tempfiles = None

    version = "Python-urllib/%s" % __version__

    # Constructor
    def __init__(self, proxies=None, context=None, **x509):
        if proxies is None:
            proxies = getproxies()
        assert hasattr(proxies, 'has_key'), "proxies must be a mapping"
        self.proxies = proxies
        self.key_file = x509.get('key_file')
        self.cert_file = x509.get('cert_file')
        self.context = context
        self.addheaders = [('User-Agent', self.version), ('Accept', '*/*')]
        self.__tempfiles = []
        self.__unlink = os.unlink # See cleanup()
        self.tempcache = None
        # Undocumented feature: if you assign {} to tempcache,
        # it is used to cache files retrieved with
        # self.retrieve().  This is not enabled by default
        # since it does not work for changing documents (and I
        # haven't got the logic to check expiration headers
        # yet).
        self.ftpcache = ftpcache
        # Undocumented feature: you can use a different
        # ftp cache by assigning to the .ftpcache member;
        # in case you want logically independent URL openers
        # XXX This is not threadsafe.  Bah.

    def __del__(self):
        self.close()

    def close(self):
        self.cleanup()

    def cleanup(self):
        # This code sometimes runs when the rest of this module
        # has already been deleted, so it can't use any globals
        # or import anything.
        if self.__tempfiles:
            for file in self.__tempfiles:
                try:
                    self.__unlink(file)
                except OSError:
                    pass
            del self.__tempfiles[:]
        if self.tempcache:
            self.tempcache.clear()

    def addheader(self, *args):
        """Add a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')"""
        self.addheaders.append(args)

    # External interface
    def open(self, fullurl, data=None):
        """Use URLopener().open(file) instead of open(file, 'r')."""
        fullurl = unwrap(toBytes(fullurl))
        # percent encode url, fixing lame server errors for e.g, like space
        # within url paths.
        fullurl = quote(fullurl, safe="%/:=&?~#+!$,;'@()*[]|")
        if self.tempcache and fullurl in self.tempcache:
            filename, headers = self.tempcache[fullurl]
            fp = open(filename, 'rb')
            return addinfourl(fp, headers, fullurl)
        urltype, url = splittype(fullurl)
        if not urltype:
            urltype = 'file'
        if urltype in self.proxies:
            proxy = self.proxies[urltype]
            urltype, proxyhost = splittype(proxy)
            host, selector = splithost(proxyhost)
            url = (host, fullurl) # Signal special case to open_*()
        else:
            proxy = None
        name = 'open_' + urltype
        self.type = urltype
        name = name.replace('-', '_')

        # bpo-35907: disallow the file reading with the type not allowed
        if not hasattr(self, name) or name == 'open_local_file':
            if proxy:
                return self.open_unknown_proxy(proxy, fullurl, data)
            else:
                return self.open_unknown(fullurl, data)
        try:
            if data is None:
                return getattr(self, name)(url)
            else:
                return getattr(self, name)(url, data)
        except socket.error, msg:
            raise IOError, ('socket error', msg), sys.exc_info()[2]

    def open_unknown(self, fullurl, data=None):
        """Overridable interface to open unknown URL type."""
        type, url = splittype(fullurl)
        raise IOError, ('url error', 'unknown url type', type)

    def open_unknown_proxy(self, proxy, fullurl, data=None):
        """Overridable interface to open unknown URL type."""
        type, url = splittype(fullurl)
        raise IOError, ('url error', 'invalid proxy for %s' % type, proxy)

    # External interface
    def retrieve(self, url, filename=None, reporthook=None, data=None):
        """retrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object."""
        url = unwrap(toBytes(url))
        if self.tempcache and url in self.tempcache:
            return self.tempcache[url]
        type, url1 = splittype(url)
        if filename is None and (not type or type == 'file'):
            try:
                fp = self.open_local_file(url1)
                hdrs = fp.info()
                fp.close()
                return url2pathname(splithost(url1)[1]), hdrs
            except IOError:
                pass
        fp = self.open(url, data)
        try:
            headers = fp.info()
            if filename:
                tfp = open(filename, 'wb')
            else:
                import tempfile
                garbage, path = splittype(url)
                garbage, path = splithost(path or "")
                path, garbage = splitquery(path or "")
                path, garbage = splitattr(path or "")
                suffix = os.path.splitext(path)[1]
                (fd, filename) = tempfile.mkstemp(suffix)
                self.__tempfiles.append(filename)
                tfp = os.fdopen(fd, 'wb')
            try:
                result = filename, headers
                if self.tempcache is not None:
                    self.tempcache[url] = result
                bs = 1024*8
                size = -1
                read = 0
                blocknum = 0
                if "content-length" in headers:
                    size = int(headers["Content-Length"])
                if reporthook:
                    reporthook(blocknum, bs, size)
                while 1:
                    block = fp.read(bs)
                    if block == "":
                        break
                    read += len(block)
                    tfp.write(block)
                    blocknum += 1
                    if reporthook:
                        reporthook(blocknum, bs, size)
            finally:
                tfp.close()
        finally:
            fp.close()

        # raise exception if actual size does not match content-length header
        if size >= 0 and read < size:
            raise ContentTooShortError("retrieval incomplete: got only %i out "
                                       "of %i bytes" % (read, size), result)

        return result

    # Each method named open_<type> knows how to open that type of URL

    def open_http(self, url, data=None):
        """Use HTTP protocol."""
        import httplib
        user_passwd = None
        proxy_passwd= None
        if isinstance(url, str):
            host, selector = splithost(url)
            if host:
                user_passwd, host = splituser(host)
                host = unquote(host)
            realhost = host
        else:
            host, selector = url
            # check whether the proxy contains authorization information
            proxy_passwd, host = splituser(host)
            # now we proceed with the url we want to obtain
            urltype, rest = splittype(selector)
            url = rest
            user_passwd = None
            if urltype.lower() != 'http':
                realhost = None
            else:
                realhost, rest = splithost(rest)
                if realhost:
                    user_passwd, realhost = splituser(realhost)
                if user_passwd:
                    selector = "%s://%s%s" % (urltype, realhost, rest)
                if proxy_bypass(realhost):
                    host = realhost

            #print "proxy via http:", host, selector
        if not host: raise IOError, ('http error', 'no host given')

        if proxy_passwd:
            proxy_passwd = unquote(proxy_passwd)
            proxy_auth = base64.b64encode(proxy_passwd).strip()
        else:
            proxy_auth = None

        if user_passwd:
            user_passwd = unquote(user_passwd)
            auth = base64.b64encode(user_passwd).strip()
        else:
            auth = None
        h = httplib.HTTP(host)
        if data is not None:
            h.putrequest('POST', selector)
            h.putheader('Content-Type', 'application/x-www-form-urlencoded')
            h.putheader('Content-Length', '%d' % len(data))
        else:
            h.putrequest('GET', selector)
        if proxy_auth: h.putheader('Proxy-Authorization', 'Basic %s' % proxy_auth)
        if auth: h.putheader('Authorization', 'Basic %s' % auth)
        if realhost: h.putheader('Host', realhost)
        for args in self.addheaders: h.putheader(*args)
        h.endheaders(data)
        errcode, errmsg, headers = h.getreply()
        fp = h.getfile()
        if errcode == -1:
            if fp: fp.close()
            # something went wrong with the HTTP status line
            raise IOError, ('http protocol error', 0,
                            'got a bad status line', None)
        # According to RFC 2616, "2xx" code indicates that the client's
        # request was successfully received, understood, and accepted.
        if (200 <= errcode < 300):
            return addinfourl(fp, headers, "http:" + url, errcode)
        else:
            if data is None:
                return self.http_error(url, fp, errcode, errmsg, headers)
            else:
                return self.http_error(url, fp, errcode, errmsg, headers, data)

    def http_error(self, url, fp, errcode, errmsg, headers, data=None):
        """Handle http errors.
        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code."""
        # First check if there's a specific handler for this error
        name = 'http_error_%d' % errcode
        if hasattr(self, name):
            method = getattr(self, name)
            if data is None:
                result = method(url, fp, errcode, errmsg, headers)
            else:
                result = method(url, fp, errcode, errmsg, headers, data)
            if result: return result
        return self.http_error_default(url, fp, errcode, errmsg, headers)

    def http_error_default(self, url, fp, errcode, errmsg, headers):
        """Default error handler: close the connection and raise IOError."""
        fp.close()
        raise IOError, ('http error', errcode, errmsg, headers)

    if _have_ssl:
        def open_https(self, url, data=None):
            """Use HTTPS protocol."""

            import httplib
            user_passwd = None
            proxy_passwd = None
            if isinstance(url, str):
                host, selector = splithost(url)
                if host:
                    user_passwd, host = splituser(host)
                    host = unquote(host)
                realhost = host
            else:
                host, selector = url
                # here, we determine, whether the proxy contains authorization information
                proxy_passwd, host = splituser(host)
                urltype, rest = splittype(selector)
                url = rest
                user_passwd = None
                if urltype.lower() != 'https':
                    realhost = None
                else:
                    realhost, rest = splithost(rest)
                    if realhost:
                        user_passwd, realhost = splituser(realhost)
                    if user_passwd:
                        selector = "%s://%s%s" % (urltype, realhost, rest)
                #print "proxy via https:", host, selector
            if not host: raise IOError, ('https error', 'no host given')
            if proxy_passwd:
                proxy_passwd = unquote(proxy_passwd)
                proxy_auth = base64.b64encode(proxy_passwd).strip()
            else:
                proxy_auth = None
            if user_passwd:
                user_passwd = unquote(user_passwd)
                auth = base64.b64encode(user_passwd).strip()
            else:
                auth = None
            h = httplib.HTTPS(host, 0,
                              key_file=self.key_file,
                              cert_file=self.cert_file,
                              context=self.context)
            if data is not None:
                h.putrequest('POST', selector)
                h.putheader('Content-Type',
                            'application/x-www-form-urlencoded')
                h.putheader('Content-Length', '%d' % len(data))
            else:
                h.putrequest('GET', selector)
            if proxy_auth: h.putheader('Proxy-Authorization', 'Basic %s' % proxy_auth)
            if auth: h.putheader('Authorization', 'Basic %s' % auth)
            if realhost: h.putheader('Host', realhost)
            for args in self.addheaders: h.putheader(*args)
            h.endheaders(data)
            errcode, errmsg, headers = h.getreply()
            fp = h.getfile()
            if errcode == -1:
                if fp: fp.close()
                # something went wrong with the HTTP status line
                raise IOError, ('http protocol error', 0,
                                'got a bad status line', None)
            # According to RFC 2616, "2xx" code indicates that the client's
            # request was successfully received, understood, and accepted.
            if (200 <= errcode < 300):
                return addinfourl(fp, headers, "https:" + url, errcode)
            else:
                if data is None:
                    return self.http_error(url, fp, errcode, errmsg, headers)
                else:
                    return self.http_error(url, fp, errcode, errmsg, headers,
                                           data)

    def open_file(self, url):
        """Use local file or FTP depending on form of URL."""
        if not isinstance(url, str):
            raise IOError, ('file error', 'proxy support for file protocol currently not implemented')
        if url[:2] == '//' and url[2:3] != '/' and url[2:12].lower() != 'localhost/':
            return self.open_ftp(url)
        else:
            return self.open_local_file(url)

    def open_local_file(self, url):
        """Use local file."""
        import mimetypes, mimetools, email.utils
        try:
            from cStringIO import StringIO
        except ImportError:
            from StringIO import StringIO
        host, file = splithost(url)
        localname = url2pathname(file)
        try:
            stats = os.stat(localname)
        except OSError, e:
            raise IOError(e.errno, e.strerror, e.filename)
        size = stats.st_size
        modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
        mtype = mimetypes.guess_type(url)[0]
        headers = mimetools.Message(StringIO(
            'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' %
            (mtype or 'text/plain', size, modified)))
        if not host:
            urlfile = file
            if file[:1] == '/':
                urlfile = 'file://' + file
            elif file[:2] == './':
                raise ValueError("local file url may start with / or file:. Unknown url of type: %s" % url)
            return addinfourl(open(localname, 'rb'),
                              headers, urlfile)
        host, port = splitport(host)
        if not port \
           and socket.gethostbyname(host) in (localhost(), thishost()):
            urlfile = file
            if file[:1] == '/':
                urlfile = 'file://' + file
            return addinfourl(open(localname, 'rb'),
                              headers, urlfile)
        raise IOError, ('local file error', 'not on local host')

    def open_ftp(self, url):
        """Use FTP protocol."""
        if not isinstance(url, str):
            raise IOError, ('ftp error', 'proxy support for ftp protocol currently not implemented')
        import mimetypes, mimetools
        try:
            from cStringIO import StringIO
        except ImportError:
            from StringIO import StringIO
        host, path = splithost(url)
        if not host: raise IOError, ('ftp error', 'no host given')
        host, port = splitport(host)
        user, host = splituser(host)
        if user: user, passwd = splitpasswd(user)
        else: passwd = None
        host = unquote(host)
        user = user or ''
        passwd = passwd or ''
        host = socket.gethostbyname(host)
        if not port:
            import ftplib
            port = ftplib.FTP_PORT
        else:
            port = int(port)
        path, attrs = splitattr(path)
        path = unquote(path)
        dirs = path.split('/')
        dirs, file = dirs[:-1], dirs[-1]
        if dirs and not dirs[0]: dirs = dirs[1:]
        if dirs and not dirs[0]: dirs[0] = '/'
        key = user, host, port, '/'.join(dirs)
        # XXX thread unsafe!
        if len(self.ftpcache) > MAXFTPCACHE:
            # Prune the cache, rather arbitrarily
            for k in self.ftpcache.keys():
                if k != key:
                    v = self.ftpcache[k]
                    del self.ftpcache[k]
                    v.close()
        try:
            if not key in self.ftpcache:
                self.ftpcache[key] = \
                    ftpwrapper(user, passwd, host, port, dirs)
            if not file: type = 'D'
            else: type = 'I'
            for attr in attrs:
                attr, value = splitvalue(attr)
                if attr.lower() == 'type' and \
                   value in ('a', 'A', 'i', 'I', 'd', 'D'):
                    type = value.upper()
            (fp, retrlen) = self.ftpcache[key].retrfile(file, type)
            mtype = mimetypes.guess_type("ftp:" + url)[0]
            headers = ""
            if mtype:
                headers += "Content-Type: %s\n" % mtype
            if retrlen is not None and retrlen >= 0:
                headers += "Content-Length: %d\n" % retrlen
            headers = mimetools.Message(StringIO(headers))
            return addinfourl(fp, headers, "ftp:" + url)
        except ftperrors(), msg:
            raise IOError, ('ftp error', msg), sys.exc_info()[2]

    def open_data(self, url, data=None):
        """Use "data" URL."""
        if not isinstance(url, str):
            raise IOError, ('data error', 'proxy support for data protocol currently not implemented')
        # ignore POSTed data
        #
        # syntax of data URLs:
        # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
        # mediatype := [ type "/" subtype ] *( ";" parameter )
        # data      := *urlchar
        # parameter := attribute "=" value
        import mimetools
        try:
            from cStringIO import StringIO
        except ImportError:
            from StringIO import StringIO
        try:
            [type, data] = url.split(',', 1)
        except ValueError:
            raise IOError, ('data error', 'bad data URL')
        if not type:
            type = 'text/plain;charset=US-ASCII'
        semi = type.rfind(';')
        if semi >= 0 and '=' not in type[semi:]:
            encoding = type[semi+1:]
            type = type[:semi]
        else:
            encoding = ''
        msg = []
        msg.append('Date: %s'%time.strftime('%a, %d %b %Y %H:%M:%S GMT',
                                            time.gmtime(time.time())))
        msg.append('Content-type: %s' % type)
        if encoding == 'base64':
            data = base64.decodestring(data)
        else:
            data = unquote(data)
        msg.append('Content-Length: %d' % len(data))
        msg.append('')
        msg.append(data)
        msg = '\n'.join(msg)
        f = StringIO(msg)
        headers = mimetools.Message(f, 0)
        #f.fileno = None     # needed for addinfourl
        return addinfourl(f, headers, url)


class FancyURLopener(URLopener):
    """Derived class with handlers for errors we can handle (perhaps)."""

    def __init__(self, *args, **kwargs):
        URLopener.__init__(self, *args, **kwargs)
        self.auth_cache = {}
        self.tries = 0
        self.maxtries = 10

    def http_error_default(self, url, fp, errcode, errmsg, headers):
        """Default error handling -- don't raise an exception."""
        return addinfourl(fp, headers, "http:" + url, errcode)

    def http_error_302(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 302 -- relocated (temporarily)."""
        self.tries += 1
        try:
            if self.maxtries and self.tries >= self.maxtries:
                if hasattr(self, "http_error_500"):
                    meth = self.http_error_500
                else:
                    meth = self.http_error_default
                return meth(url, fp, 500,
                            "Internal Server Error: Redirect Recursion",
                            headers)
            result = self.redirect_internal(url, fp, errcode, errmsg,
                                            headers, data)
            return result
        finally:
            self.tries = 0

    def redirect_internal(self, url, fp, errcode, errmsg, headers, data):
        if 'location' in headers:
            newurl = headers['location']
        elif 'uri' in headers:
            newurl = headers['uri']
        else:
            return
        fp.close()
        # In case the server sent a relative URL, join with original:
        newurl = basejoin(self.type + ":" + url, newurl)

        # For security reasons we do not allow redirects to protocols
        # other than HTTP, HTTPS or FTP.
        newurl_lower = newurl.lower()
        if not (newurl_lower.startswith('http://') or
                newurl_lower.startswith('https://') or
                newurl_lower.startswith('ftp://')):
            raise IOError('redirect error', errcode,
                          errmsg + " - Redirection to url '%s' is not allowed" %
                          newurl,
                          headers)

        return self.open(newurl)

    def http_error_301(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 301 -- also relocated (permanently)."""
        return self.http_error_302(url, fp, errcode, errmsg, headers, data)

    def http_error_303(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 303 -- also relocated (essentially identical to 302)."""
        return self.http_error_302(url, fp, errcode, errmsg, headers, data)

    def http_error_307(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 307 -- relocated, but turn POST into error."""
        if data is None:
            return self.http_error_302(url, fp, errcode, errmsg, headers, data)
        else:
            return self.http_error_default(url, fp, errcode, errmsg, headers)

    def http_error_401(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 401 -- authentication required.
        This function supports Basic authentication only."""
        if not 'www-authenticate' in headers:
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        stuff = headers['www-authenticate']
        import re
        match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff)
        if not match:
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        scheme, realm = match.groups()
        if scheme.lower() != 'basic':
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        name = 'retry_' + self.type + '_basic_auth'
        if data is None:
            return getattr(self,name)(url, realm)
        else:
            return getattr(self,name)(url, realm, data)

    def http_error_407(self, url, fp, errcode, errmsg, headers, data=None):
        """Error 407 -- proxy authentication required.
        This function supports Basic authentication only."""
        if not 'proxy-authenticate' in headers:
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        stuff = headers['proxy-authenticate']
        import re
        match = re.match('[ \t]*([^ \t]+)[ \t]+realm="([^"]*)"', stuff)
        if not match:
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        scheme, realm = match.groups()
        if scheme.lower() != 'basic':
            URLopener.http_error_default(self, url, fp,
                                         errcode, errmsg, headers)
        name = 'retry_proxy_' + self.type + '_basic_auth'
        if data is None:
            return getattr(self,name)(url, realm)
        else:
            return getattr(self,name)(url, realm, data)

    def retry_proxy_http_basic_auth(self, url, realm, data=None):
        host, selector = splithost(url)
        newurl = 'http://' + host + selector
        proxy = self.proxies['http']
        urltype, proxyhost = splittype(proxy)
        proxyhost, proxyselector = splithost(proxyhost)
        i = proxyhost.find('@') + 1
        proxyhost = proxyhost[i:]
        user, passwd = self.get_user_passwd(proxyhost, realm, i)
        if not (user or passwd): return None
        proxyhost = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + proxyhost
        self.proxies['http'] = 'http://' + proxyhost + proxyselector
        if data is None:
            return self.open(newurl)
        else:
            return self.open(newurl, data)

    def retry_proxy_https_basic_auth(self, url, realm, data=None):
        host, selector = splithost(url)
        newurl = 'https://' + host + selector
        proxy = self.proxies['https']
        urltype, proxyhost = splittype(proxy)
        proxyhost, proxyselector = splithost(proxyhost)
        i = proxyhost.find('@') + 1
        proxyhost = proxyhost[i:]
        user, passwd = self.get_user_passwd(proxyhost, realm, i)
        if not (user or passwd): return None
        proxyhost = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + proxyhost
        self.proxies['https'] = 'https://' + proxyhost + proxyselector
        if data is None:
            return self.open(newurl)
        else:
            return self.open(newurl, data)

    def retry_http_basic_auth(self, url, realm, data=None):
        host, selector = splithost(url)
        i = host.find('@') + 1
        host = host[i:]
        user, passwd = self.get_user_passwd(host, realm, i)
        if not (user or passwd): return None
        host = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + host
        newurl = 'http://' + host + selector
        if data is None:
            return self.open(newurl)
        else:
            return self.open(newurl, data)

    def retry_https_basic_auth(self, url, realm, data=None):
        host, selector = splithost(url)
        i = host.find('@') + 1
        host = host[i:]
        user, passwd = self.get_user_passwd(host, realm, i)
        if not (user or passwd): return None
        host = quote(user, safe='') + ':' + quote(passwd, safe='') + '@' + host
        newurl = 'https://' + host + selector
        if data is None:
            return self.open(newurl)
        else:
            return self.open(newurl, data)

    def get_user_passwd(self, host, realm, clear_cache=0):
        key = realm + '@' + host.lower()
        if key in self.auth_cache:
            if clear_cache:
                del self.auth_cache[key]
            else:
                return self.auth_cache[key]
        user, passwd = self.prompt_user_passwd(host, realm)
        if user or passwd: self.auth_cache[key] = (user, passwd)
        return user, passwd

    def prompt_user_passwd(self, host, realm):
        """Override this in a GUI environment!"""
        import getpass
        try:
            user = raw_input("Enter username for %s at %s: " % (realm,
                                                                host))
            passwd = getpass.getpass("Enter password for %s in %s at %s: " %
                (user, realm, host))
            return user, passwd
        except KeyboardInterrupt:
            print
            return None, None


# Utility functions

_localhost = None
def localhost():
    """Return the IP address of the magic hostname 'localhost'."""
    global _localhost
    if _localhost is None:
        _localhost = socket.gethostbyname('localhost')
    return _localhost

_thishost = None
def thishost():
    """Return the IP address of the current host."""
    global _thishost
    if _thishost is None:
        try:
            _thishost = socket.gethostbyname(socket.gethostname())
        except socket.gaierror:
            _thishost = socket.gethostbyname('localhost')
    return _thishost

_ftperrors = None
def ftperrors():
    """Return the set of errors raised by the FTP class."""
    global _ftperrors
    if _ftperrors is None:
        import ftplib
        _ftperrors = ftplib.all_errors
    return _ftperrors

_noheaders = None
def noheaders():
    """Return an empty mimetools.Message object."""
    global _noheaders
    if _noheaders is None:
        import mimetools
        try:
            from cStringIO import StringIO
        except ImportError:
            from StringIO import StringIO
        _noheaders = mimetools.Message(StringIO(), 0)
        _noheaders.fp.close()   # Recycle file descriptor
    return _noheaders


# Utility classes

class ftpwrapper:
    """Class used by open_ftp() for cache of open FTP connections."""

    def __init__(self, user, passwd, host, port, dirs,
                 timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                 persistent=True):
        self.user = user
        self.passwd = passwd
        self.host = host
        self.port = port
        self.dirs = dirs
        self.timeout = timeout
        self.refcount = 0
        self.keepalive = persistent
        try:
            self.init()
        except:
            self.close()
            raise

    def init(self):
        import ftplib
        self.busy = 0
        self.ftp = ftplib.FTP()
        self.ftp.connect(self.host, self.port, self.timeout)
        self.ftp.login(self.user, self.passwd)
        _target = '/'.join(self.dirs)
        self.ftp.cwd(_target)

    def retrfile(self, file, type):
        import ftplib
        self.endtransfer()
        if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1
        else: cmd = 'TYPE ' + type; isdir = 0
        try:
            self.ftp.voidcmd(cmd)
        except ftplib.all_errors:
            self.init()
            self.ftp.voidcmd(cmd)
        conn = None
        if file and not isdir:
            # Try to retrieve as a file
            try:
                cmd = 'RETR ' + file
                conn, retrlen = self.ftp.ntransfercmd(cmd)
            except ftplib.error_perm, reason:
                if str(reason)[:3] != '550':
                    raise IOError, ('ftp error', reason), sys.exc_info()[2]
        if not conn:
            # Set transfer mode to ASCII!
            self.ftp.voidcmd('TYPE A')
            # Try a directory listing. Verify that directory exists.
            if file:
                pwd = self.ftp.pwd()
                try:
                    try:
                        self.ftp.cwd(file)
                    except ftplib.error_perm, reason:
                        raise IOError, ('ftp error', reason), sys.exc_info()[2]
                finally:
                    self.ftp.cwd(pwd)
                cmd = 'LIST ' + file
            else:
                cmd = 'LIST'
            conn, retrlen = self.ftp.ntransfercmd(cmd)
        self.busy = 1
        ftpobj = addclosehook(conn.makefile('rb'), self.file_close)
        self.refcount += 1
        conn.close()
        # Pass back both a suitably decorated object and a retrieval length
        return (ftpobj, retrlen)

    def endtransfer(self):
        if not self.busy:
            return
        self.busy = 0
        try:
            self.ftp.voidresp()
        except ftperrors():
            pass

    def close(self):
        self.keepalive = False
        if self.refcount <= 0:
            self.real_close()

    def file_close(self):
        self.endtransfer()
        self.refcount -= 1
        if self.refcount <= 0 and not self.keepalive:
            self.real_close()

    def real_close(self):
        self.endtransfer()
        try:
            self.ftp.close()
        except ftperrors():
            pass

class addbase:
    """Base class for addinfo and addclosehook."""

    def __init__(self, fp):
        self.fp = fp
        self.read = self.fp.read
        self.readline = self.fp.readline
        if hasattr(self.fp, "readlines"): self.readlines = self.fp.readlines
        if hasattr(self.fp, "fileno"):
            self.fileno = self.fp.fileno
        else:
            self.fileno = lambda: None
        if hasattr(self.fp, "__iter__"):
            self.__iter__ = self.fp.__iter__
            if hasattr(self.fp, "next"):
                self.next = self.fp.next

    def __repr__(self):
        return '<%s at %r whose fp = %r>' % (self.__class__.__name__,
                                             id(self), self.fp)

    def close(self):
        self.read = None
        self.readline = None
        self.readlines = None
        self.fileno = None
        if self.fp: self.fp.close()
        self.fp = None

class addclosehook(addbase):
    """Class to add a close hook to an open file."""

    def __init__(self, fp, closehook, *hookargs):
        addbase.__init__(self, fp)
        self.closehook = closehook
        self.hookargs = hookargs

    def close(self):
        try:
            closehook = self.closehook
            hookargs = self.hookargs
            if closehook:
                self.closehook = None
                self.hookargs = None
                closehook(*hookargs)
        finally:
            addbase.close(self)


class addinfo(addbase):
    """class to add an info() method to an open file."""

    def __init__(self, fp, headers):
        addbase.__init__(self, fp)
        self.headers = headers

    def info(self):
        return self.headers

class addinfourl(addbase):
    """class to add info() and geturl() methods to an open file."""

    def __init__(self, fp, headers, url, code=None):
        addbase.__init__(self, fp)
        self.headers = headers
        self.url = url
        self.code = code

    def info(self):
        return self.headers

    def getcode(self):
        return self.code

    def geturl(self):
        return self.url


# Utilities to parse URLs (most of these return None for missing parts):
# unwrap('<URL:type://host/path>') --> 'type://host/path'
# splittype('type:opaquestring') --> 'type', 'opaquestring'
# splithost('//host[:port]/path') --> 'host[:port]', '/path'
# splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'
# splitpasswd('user:passwd') -> 'user', 'passwd'
# splitport('host:port') --> 'host', 'port'
# splitquery('/path?query') --> '/path', 'query'
# splittag('/path#tag') --> '/path', 'tag'
# splitattr('/path;attr1=value1;attr2=value2;...') ->
#   '/path', ['attr1=value1', 'attr2=value2', ...]
# splitvalue('attr=value') --> 'attr', 'value'
# unquote('abc%20def') -> 'abc def'
# quote('abc def') -> 'abc%20def')

try:
    unicode
except NameError:
    def _is_unicode(x):
        return 0
else:
    def _is_unicode(x):
        return isinstance(x, unicode)

def toBytes(url):
    """toBytes(u"URL") --> 'URL'."""
    # Most URL schemes require ASCII. If that changes, the conversion
    # can be relaxed
    if _is_unicode(url):
        try:
            url = url.encode("ASCII")
        except UnicodeError:
            raise UnicodeError("URL " + repr(url) +
                               " contains non-ASCII characters")
    return url

def unwrap(url):
    """unwrap('<URL:type://host/path>') --> 'type://host/path'."""
    url = url.strip()
    if url[:1] == '<' and url[-1:] == '>':
        url = url[1:-1].strip()
    if url[:4] == 'URL:': url = url[4:].strip()
    return url

_typeprog = None
def splittype(url):
    """splittype('type:opaquestring') --> 'type', 'opaquestring'."""
    global _typeprog
    if _typeprog is None:
        import re
        _typeprog = re.compile('^([^/:]+):')

    match = _typeprog.match(url)
    if match:
        scheme = match.group(1)
        return scheme.lower(), url[len(scheme) + 1:]
    return None, url

_hostprog = None
def splithost(url):
    """splithost('//host[:port]/path') --> 'host[:port]', '/path'."""
    global _hostprog
    if _hostprog is None:
        _hostprog = re.compile('//([^/#?]*)(.*)', re.DOTALL)

    match = _hostprog.match(url)
    if match:
        host_port = match.group(1)
        path = match.group(2)
        if path and not path.startswith('/'):
            path = '/' + path
        return host_port, path
    return None, url

_userprog = None
def splituser(host):
    """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'."""
    global _userprog
    if _userprog is None:
        import re
        _userprog = re.compile('^(.*)@(.*)$')

    match = _userprog.match(host)
    if match: return match.group(1, 2)
    return None, host

_passwdprog = None
def splitpasswd(user):
    """splitpasswd('user:passwd') -> 'user', 'passwd'."""
    global _passwdprog
    if _passwdprog is None:
        import re
        _passwdprog = re.compile('^([^:]*):(.*)$',re.S)

    match = _passwdprog.match(user)
    if match: return match.group(1, 2)
    return user, None

# splittag('/path#tag') --> '/path', 'tag'
_portprog = None
def splitport(host):
    """splitport('host:port') --> 'host', 'port'."""
    global _portprog
    if _portprog is None:
        import re
        _portprog = re.compile('^(.*):([0-9]*)$')

    match = _portprog.match(host)
    if match:
        host, port = match.groups()
        if port:
            return host, port
    return host, None

_nportprog = None
def splitnport(host, defport=-1):
    """Split host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number."""
    global _nportprog
    if _nportprog is None:
        import re
        _nportprog = re.compile('^(.*):(.*)$')

    match = _nportprog.match(host)
    if match:
        host, port = match.group(1, 2)
        if port:
            try:
                nport = int(port)
            except ValueError:
                nport = None
            return host, nport
    return host, defport

_queryprog = None
def splitquery(url):
    """splitquery('/path?query') --> '/path', 'query'."""
    global _queryprog
    if _queryprog is None:
        import re
        _queryprog = re.compile('^(.*)\?([^?]*)$')

    match = _queryprog.match(url)
    if match: return match.group(1, 2)
    return url, None

_tagprog = None
def splittag(url):
    """splittag('/path#tag') --> '/path', 'tag'."""
    global _tagprog
    if _tagprog is None:
        import re
        _tagprog = re.compile('^(.*)#([^#]*)$')

    match = _tagprog.match(url)
    if match: return match.group(1, 2)
    return url, None

def splitattr(url):
    """splitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...]."""
    words = url.split(';')
    return words[0], words[1:]

_valueprog = None
def splitvalue(attr):
    """splitvalue('attr=value') --> 'attr', 'value'."""
    global _valueprog
    if _valueprog is None:
        import re
        _valueprog = re.compile('^([^=]*)=(.*)$')

    match = _valueprog.match(attr)
    if match: return match.group(1, 2)
    return attr, None

# urlparse contains a duplicate of this method to avoid a circular import.  If
# you update this method, also update the copy in urlparse.  This code
# duplication does not exist in Python3.

_hexdig = '0123456789ABCDEFabcdef'
_hextochr = dict((a + b, chr(int(a + b, 16)))
                 for a in _hexdig for b in _hexdig)
_asciire = re.compile('([\x00-\x7f]+)')

def unquote(s):
    """unquote('abc%20def') -> 'abc def'."""
    if _is_unicode(s):
        if '%' not in s:
            return s
        bits = _asciire.split(s)
        res = [bits[0]]
        append = res.append
        for i in range(1, len(bits), 2):
            append(unquote(str(bits[i])).decode('latin1'))
            append(bits[i + 1])
        return ''.join(res)

    bits = s.split('%')
    # fastpath
    if len(bits) == 1:
        return s
    res = [bits[0]]
    append = res.append
    for item in bits[1:]:
        try:
            append(_hextochr[item[:2]])
            append(item[2:])
        except KeyError:
            append('%')
            append(item)
    return ''.join(res)

def unquote_plus(s):
    """unquote('%7e/abc+def') -> '~/abc def'"""
    s = s.replace('+', ' ')
    return unquote(s)

always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
               'abcdefghijklmnopqrstuvwxyz'
               '0123456789' '_.-')
_safe_map = {}
for i, c in zip(xrange(256), str(bytearray(xrange(256)))):
    _safe_map[c] = c if (i < 128 and c in always_safe) else '%{:02X}'.format(i)
_safe_quoters = {}

def quote(s, safe='/'):
    """quote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted.

    RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
    the following reserved characters.

    reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                  "$" | ","

    Each of these characters is reserved in some component of a URL,
    but not necessarily in all of them.

    By default, the quote function is intended for quoting the path
    section of a URL.  Thus, it will not encode '/'.  This character
    is reserved, but in typical usage the quote function is being
    called on a path where the existing slash characters are used as
    reserved characters.
    """
    # fastpath
    if not s:
        if s is None:
            raise TypeError('None object cannot be quoted')
        return s
    cachekey = (safe, always_safe)
    try:
        (quoter, safe) = _safe_quoters[cachekey]
    except KeyError:
        safe_map = _safe_map.copy()
        safe_map.update([(c, c) for c in safe])
        quoter = safe_map.__getitem__
        safe = always_safe + safe
        _safe_quoters[cachekey] = (quoter, safe)
    if not s.rstrip(safe):
        return s
    return ''.join(map(quoter, s))

def quote_plus(s, safe=''):
    """Quote the query fragment of a URL; replacing ' ' with '+'"""
    if ' ' in s:
        s = quote(s, safe + ' ')
        return s.replace(' ', '+')
    return quote(s, safe)

def urlencode(query, doseq=0):
    """Encode a sequence of two-element tuples or dictionary into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.
    """

    if hasattr(query,"items"):
        # mapping objects
        query = query.items()
    else:
        # it's a bother at times that strings and string-like objects are
        # sequences...
        try:
            # non-sequence items should not work with len()
            # non-empty strings will fail this
            if len(query) and not isinstance(query[0], tuple):
                raise TypeError
            # zero-length sequences of all types will get here and succeed,
            # but that's a minor nit - since the original implementation
            # allowed empty dicts that type of behavior probably should be
            # preserved for consistency
        except TypeError:
            ty,va,tb = sys.exc_info()
            raise TypeError, "not a valid non-string sequence or mapping object", tb

    l = []
    if not doseq:
        # preserve old behavior
        for k, v in query:
            k = quote_plus(str(k))
            v = quote_plus(str(v))
            l.append(k + '=' + v)
    else:
        for k, v in query:
            k = quote_plus(str(k))
            if isinstance(v, str):
                v = quote_plus(v)
                l.append(k + '=' + v)
            elif _is_unicode(v):
                # is there a reasonable way to convert to ASCII?
                # encode generates a string, but "replace" or "ignore"
                # lose information and "strict" can raise UnicodeError
                v = quote_plus(v.encode("ASCII","replace"))
                l.append(k + '=' + v)
            else:
                try:
                    # is this a sufficient test for sequence-ness?
                    len(v)
                except TypeError:
                    # not a sequence
                    v = quote_plus(str(v))
                    l.append(k + '=' + v)
                else:
                    # loop over the sequence
                    for elt in v:
                        l.append(k + '=' + quote_plus(str(elt)))
    return '&'.join(l)

# Proxy handling
def getproxies_environment():
    """Return a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  In order to prefer lowercase
    variables, we process the environment in two passes, first matches any
    and second matches only lower case proxies.

    If you need a different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.
    """
    # Get all variables
    proxies = {}
    for name, value in os.environ.items():
        name = name.lower()
        if value and name[-6:] == '_proxy':
            proxies[name[:-6]] = value

    # CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY
    # (non-all-lowercase) as it may be set from the web server by a "Proxy:"
    # header from the client
    # If "proxy" is lowercase, it will still be used thanks to the next block
    if 'REQUEST_METHOD' in os.environ:
        proxies.pop('http', None)

    # Get lowercase variables
    for name, value in os.environ.items():
        if name[-6:] == '_proxy':
            name = name.lower()
            if value:
                proxies[name[:-6]] = value
            else:
                proxies.pop(name[:-6], None)

    return proxies

def proxy_bypass_environment(host, proxies=None):
    """Test if proxies should not be used for a particular host.

    Checks the proxies dict for the value of no_proxy, which should be a
    list of comma separated DNS suffixes, or '*' for all hosts.
    """
    if proxies is None:
        proxies = getproxies_environment()
    # don't bypass, if no_proxy isn't specified
    try:
        no_proxy = proxies['no']
    except KeyError:
        return 0
    # '*' is special case for always bypass
    if no_proxy == '*':
        return 1
    # strip port off host
    hostonly, port = splitport(host)
    # check if the host ends with any of the DNS suffixes
    no_proxy_list = [proxy.strip() for proxy in no_proxy.split(',')]
    for name in no_proxy_list:
        if name:
            name = name.lstrip('.')  # ignore leading dots
            name = re.escape(name)
            pattern = r'(.+\.)?%s$' % name
            if (re.match(pattern, hostonly, re.I)
                    or re.match(pattern, host, re.I)):
                return 1
    # otherwise, don't bypass
    return 0


if sys.platform == 'darwin':
    from _scproxy import _get_proxy_settings, _get_proxies

    def proxy_bypass_macosx_sysconf(host):
        """
        Return True iff this host shouldn't be accessed using a proxy

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        """
        import re
        import socket
        from fnmatch import fnmatch

        hostonly, port = splitport(host)

        def ip2num(ipAddr):
            parts = ipAddr.split('.')
            parts = map(int, parts)
            if len(parts) != 4:
                parts = (parts + [0, 0, 0, 0])[:4]
            return (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]

        proxy_settings = _get_proxy_settings()

        # Check for simple host names:
        if '.' not in host:
            if proxy_settings['exclude_simple']:
                return True

        hostIP = None

        for value in proxy_settings.get('exceptions', ()):
            # Items in the list are strings like these: *.local, 169.254/16
            if not value: continue

            m = re.match(r"(\d+(?:\.\d+)*)(/\d+)?", value)
            if m is not None:
                if hostIP is None:
                    try:
                        hostIP = socket.gethostbyname(hostonly)
                        hostIP = ip2num(hostIP)
                    except socket.error:
                        continue

                base = ip2num(m.group(1))
                mask = m.group(2)
                if mask is None:
                    mask = 8 * (m.group(1).count('.') + 1)

                else:
                    mask = int(mask[1:])
                mask = 32 - mask

                if (hostIP >> mask) == (base >> mask):
                    return True

            elif fnmatch(host, value):
                return True

        return False

    def getproxies_macosx_sysconf():
        """Return a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        """
        return _get_proxies()

    def proxy_bypass(host):
        """Return True, if a host should be bypassed.

        Checks proxy settings gathered from the environment, if specified, or
        from the MacOSX framework SystemConfiguration.
        """
        proxies = getproxies_environment()
        if proxies:
            return proxy_bypass_environment(host, proxies)
        else:
            return proxy_bypass_macosx_sysconf(host)

    def getproxies():
        return getproxies_environment() or getproxies_macosx_sysconf()

elif os.name == 'nt':
    def getproxies_registry():
        """Return a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        """
        proxies = {}
        try:
            import _winreg
        except ImportError:
            # Std module, so should be around - but you never know!
            return proxies
        try:
            internetSettings = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
                r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
            proxyEnable = _winreg.QueryValueEx(internetSettings,
                                               'ProxyEnable')[0]
            if proxyEnable:
                # Returned as Unicode but problems if not converted to ASCII
                proxyServer = str(_winreg.QueryValueEx(internetSettings,
                                                       'ProxyServer')[0])
                if '=' in proxyServer:
                    # Per-protocol settings
                    for p in proxyServer.split(';'):
                        protocol, address = p.split('=', 1)
                        # See if address has a type:// prefix
                        import re
                        if not re.match('^([^/:]+)://', address):
                            address = '%s://%s' % (protocol, address)
                        proxies[protocol] = address
                else:
                    # Use one setting for all protocols
                    if proxyServer[:5] == 'http:':
                        proxies['http'] = proxyServer
                    else:
                        proxies['http'] = 'http://%s' % proxyServer
                        proxies['https'] = 'https://%s' % proxyServer
                        proxies['ftp'] = 'ftp://%s' % proxyServer
            internetSettings.Close()
        except (WindowsError, ValueError, TypeError):
            # Either registry key not found etc, or the value in an
            # unexpected format.
            # proxies already set up to be empty so nothing to do
            pass
        return proxies

    def getproxies():
        """Return a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        """
        return getproxies_environment() or getproxies_registry()

    def proxy_bypass_registry(host):
        try:
            import _winreg
            import re
        except ImportError:
            # Std modules, so should be around - but you never know!
            return 0
        try:
            internetSettings = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
                r'Software\Microsoft\Windows\CurrentVersion\Internet Settings')
            proxyEnable = _winreg.QueryValueEx(internetSettings,
                                               'ProxyEnable')[0]
            proxyOverride = str(_winreg.QueryValueEx(internetSettings,
                                                     'ProxyOverride')[0])
            # ^^^^ Returned as Unicode but problems if not converted to ASCII
        except WindowsError:
            return 0
        if not proxyEnable or not proxyOverride:
            return 0
        # try to make a host list from name and IP address.
        rawHost, port = splitport(host)
        host = [rawHost]
        try:
            addr = socket.gethostbyname(rawHost)
            if addr != rawHost:
                host.append(addr)
        except socket.error:
            pass
        try:
            fqdn = socket.getfqdn(rawHost)
            if fqdn != rawHost:
                host.append(fqdn)
        except socket.error:
            pass
        # make a check value list from the registry entry: replace the
        # '<local>' string by the localhost entry and the corresponding
        # canonical entry.
        proxyOverride = proxyOverride.split(';')
        # now check if we match one of the registry values.
        for test in proxyOverride:
            if test == '<local>':
                if '.' not in rawHost:
                    return 1
            test = test.replace(".", r"\.")     # mask dots
            test = test.replace("*", r".*")     # change glob sequence
            test = test.replace("?", r".")      # change glob char
            for val in host:
                # print "%s <--> %s" %( test, val )
                if re.match(test, val, re.I):
                    return 1
        return 0

    def proxy_bypass(host):
        """Return True, if the host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.
        """
        proxies = getproxies_environment()
        if proxies:
            return proxy_bypass_environment(host, proxies)
        else:
            return proxy_bypass_registry(host)

else:
    # By default use environment variables
    getproxies = getproxies_environment
    proxy_bypass = proxy_bypass_environment

# Test and time quote() and unquote()
def test1():
    s = ''
    for i in range(256): s = s + chr(i)
    s = s*4
    t0 = time.time()
    qs = quote(s)
    uqs = unquote(qs)
    t1 = time.time()
    if uqs != s:
        print 'Wrong!'
    print repr(s)
    print repr(qs)
    print repr(uqs)
    print round(t1 - t0, 3), 'sec'


def reporthook(blocknum, blocksize, totalsize):
    # Report during remote transfers
    print "Block number: %d, Block size: %d, Total size: %d" % (
        blocknum, blocksize, totalsize)

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
ensurepip 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.py File 22.21 KB 0644
BaseHTTPServer.pyc File 21.21 KB 0644
BaseHTTPServer.pyo File 21.21 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.78 KB 0644
CGIHTTPServer.pyc File 10.76 KB 0644
CGIHTTPServer.pyo File 10.76 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 25.92 KB 0644
Cookie.pyc File 22.13 KB 0644
Cookie.pyo File 22.13 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.77 KB 0644
HTMLParser.pyc File 13.41 KB 0644
HTMLParser.pyo File 13.11 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.38 KB 0644
Queue.pyc File 9.2 KB 0644
Queue.pyo File 9.2 KB 0644
SimpleHTTPServer.py File 7.81 KB 0644
SimpleHTTPServer.pyc File 7.82 KB 0644
SimpleHTTPServer.pyo File 7.82 KB 0644
SimpleXMLRPCServer.py File 25.21 KB 0644
SimpleXMLRPCServer.pyc File 22.33 KB 0644
SimpleXMLRPCServer.pyo File 22.33 KB 0644
SocketServer.py File 23.39 KB 0644
SocketServer.pyc File 23.52 KB 0644
SocketServer.pyo File 23.52 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 6.89 KB 0644
UserDict.pyc File 9.48 KB 0644
UserDict.pyo File 9.48 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.31 KB 0644
_LWPCookieJar.pyo File 5.31 KB 0644
_MozillaCookieJar.py File 5.66 KB 0644
_MozillaCookieJar.pyc File 4.36 KB 0644
_MozillaCookieJar.pyo File 4.32 KB 0644
__future__.py File 4.28 KB 0644
__future__.pyc File 4.12 KB 0644
__future__.pyo File 4.12 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 18.18 KB 0644
_abcoll.pyc File 25.08 KB 0644
_abcoll.pyo File 25.08 KB 0644
_osx_support.py File 18.65 KB 0644
_osx_support.pyc File 11.48 KB 0644
_osx_support.pyo File 11.48 KB 0644
_pyio.py File 68 KB 0644
_pyio.pyc File 63.18 KB 0644
_pyio.pyo File 63.18 KB 0644
_strptime.py File 20.24 KB 0644
_strptime.pyc File 14.82 KB 0644
_strptime.pyo File 14.82 KB 0644
_sysconfigdata.py File 19.27 KB 0644
_sysconfigdata.pyc File 22.43 KB 0644
_sysconfigdata.pyo File 22.43 KB 0644
_threading_local.py File 7.09 KB 0644
_threading_local.pyc File 6.22 KB 0644
_threading_local.pyo File 6.22 KB 0644
_weakrefset.py File 5.77 KB 0644
_weakrefset.pyc File 9.45 KB 0644
_weakrefset.pyo File 9.45 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 33.77 KB 0644
aifc.pyc File 29.75 KB 0644
aifc.pyo File 29.75 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 87.14 KB 0644
argparse.pyc File 62.86 KB 0644
argparse.pyo File 62.7 KB 0644
ast.py File 11.53 KB 0644
ast.pyc File 12.63 KB 0644
ast.pyo File 12.63 KB 0644
asynchat.py File 11.31 KB 0644
asynchat.pyc File 8.6 KB 0644
asynchat.pyo File 8.6 KB 0644
asyncore.py File 20.45 KB 0644
asyncore.pyc File 18.45 KB 0644
asyncore.pyo File 18.45 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.53 KB 0755
base64.pyc File 11.03 KB 0644
base64.pyo File 11.03 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.35 KB 0644
binhex.pyc File 15.1 KB 0644
binhex.pyo File 15.1 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.42 KB 0755
cProfile.pyc File 6.25 KB 0644
cProfile.pyo File 6.25 KB 0644
calendar.py File 22.84 KB 0644
calendar.pyc File 27.26 KB 0644
calendar.pyo File 27.26 KB 0644
cgi.py File 35.46 KB 0755
cgi.pyc File 32.58 KB 0644
cgi.pyo File 32.58 KB 0644
cgitb.py File 11.89 KB 0644
cgitb.pyc File 11.85 KB 0644
cgitb.pyo File 11.85 KB 0644
chunk.py File 5.29 KB 0644
chunk.pyc File 5.47 KB 0644
chunk.pyo File 5.47 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 35.3 KB 0644
codecs.pyc File 35.96 KB 0644
codecs.pyo File 35.96 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 27.15 KB 0644
collections.pyc File 25.55 KB 0644
collections.pyo File 25.5 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.95 KB 0644
cookielib.pyc File 53.44 KB 0644
cookielib.pyo File 53.26 KB 0644
copy.py File 11.26 KB 0644
copy.pyc File 11.88 KB 0644
copy.pyo File 11.79 KB 0644
copy_reg.py File 6.81 KB 0644
copy_reg.pyc File 5.05 KB 0644
copy_reg.pyo File 5 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 16.32 KB 0644
csv.pyc File 13.19 KB 0644
csv.pyo File 13.19 KB 0644
dbhash.py File 498 B 0644
dbhash.pyc File 718 B 0644
dbhash.pyo File 718 B 0644
decimal.py File 216.73 KB 0644
decimal.pyc File 168.12 KB 0644
decimal.pyo File 168.12 KB 0644
difflib.py File 80.4 KB 0644
difflib.pyc File 60.45 KB 0644
difflib.pyo File 60.4 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.63 KB 0644
doctest.pyc File 81.68 KB 0644
doctest.pyo File 81.4 KB 0644
dumbdbm.py File 8.93 KB 0644
dumbdbm.pyc File 6.59 KB 0644
dumbdbm.pyo File 6.59 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.42 KB 0644
fileinput.pyc File 14.16 KB 0644
fileinput.pyo File 14.16 KB 0644
fnmatch.py File 3.24 KB 0644
fnmatch.pyc File 3.53 KB 0644
fnmatch.pyo File 3.53 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.62 KB 0644
fpformat.pyc File 4.59 KB 0644
fpformat.pyo File 4.59 KB 0644
fractions.py File 21.87 KB 0644
fractions.pyc File 19.25 KB 0644
fractions.pyo File 19.25 KB 0644
ftplib.py File 37.65 KB 0644
ftplib.pyc File 34.12 KB 0644
ftplib.pyo File 34.12 KB 0644
functools.py File 4.69 KB 0644
functools.pyc File 6.47 KB 0644
functools.pyo File 6.47 KB 0644
genericpath.py File 3.13 KB 0644
genericpath.pyc File 3.43 KB 0644
genericpath.pyo File 3.43 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 22.13 KB 0644
gettext.pyc File 17.58 KB 0644
gettext.pyo File 17.58 KB 0644
glob.py File 3.04 KB 0644
glob.pyc File 2.87 KB 0644
glob.pyo File 2.87 KB 0644
gzip.py File 18.58 KB 0644
gzip.pyc File 14.88 KB 0644
gzip.pyo File 14.88 KB 0644
hashlib.py File 7.66 KB 0644
hashlib.pyc File 6.76 KB 0644
hashlib.pyo File 6.76 KB 0644
heapq.py File 17.87 KB 0644
heapq.pyc File 14.22 KB 0644
heapq.pyo File 14.22 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 52.06 KB 0644
httplib.pyc File 37.82 KB 0644
httplib.pyo File 37.64 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.23 KB 0644
imaplib.pyc File 43.96 KB 0644
imaplib.pyo File 41.32 KB 0644
imghdr.py File 3.46 KB 0644
imghdr.pyc File 4.72 KB 0644
imghdr.pyo File 4.72 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 42 KB 0644
inspect.pyc File 39.29 KB 0644
inspect.pyo File 39.29 KB 0644
io.py File 3.24 KB 0644
io.pyc File 3.5 KB 0644
io.pyo File 3.5 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.93 KB 0644
linecache.pyc File 3.2 KB 0644
linecache.pyo File 3.2 KB 0644
locale.py File 100.42 KB 0644
locale.pyc File 55.28 KB 0644
locale.pyo File 55.28 KB 0644
macpath.py File 6.14 KB 0644
macpath.pyc File 7.5 KB 0644
macpath.pyo File 7.5 KB 0644
macurl2path.py File 2.67 KB 0644
macurl2path.pyc File 2.19 KB 0644
macurl2path.pyo File 2.19 KB 0644
mailbox.py File 79.34 KB 0644
mailbox.pyc File 74.92 KB 0644
mailbox.pyo File 74.87 KB 0644
mailcap.py File 8.21 KB 0644
mailcap.pyc File 7.77 KB 0644
mailcap.pyo File 7.77 KB 0644
markupbase.py File 14.3 KB 0644
markupbase.pyc File 9.05 KB 0644
markupbase.pyo File 8.86 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 32.99 KB 0644
mhlib.pyo File 32.99 KB 0644
mimetools.py File 7 KB 0644
mimetools.pyc File 8.01 KB 0644
mimetools.pyo File 8.01 KB 0644
mimetypes.py File 20.54 KB 0644
mimetypes.pyc File 18.06 KB 0644
mimetypes.pyo File 18.06 KB 0644
mimify.py File 14.67 KB 0755
mimify.pyc File 11.72 KB 0644
mimify.pyo File 11.72 KB 0644
modulefinder.py File 23.89 KB 0644
modulefinder.pyc File 18.68 KB 0644
modulefinder.pyo File 18.6 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 5.75 KB 0644
netrc.pyc File 4.6 KB 0644
netrc.pyo File 4.6 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.97 KB 0644
ntpath.pyc File 12.82 KB 0644
ntpath.pyo File 12.82 KB 0644
nturl2path.py File 2.36 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.77 KB 0644
optparse.pyc File 52.63 KB 0644
optparse.pyo File 52.55 KB 0644
os.py File 25.3 KB 0644
os.pyc File 25.09 KB 0644
os.pyo File 25.09 KB 0644
os2emxpath.py File 4.53 KB 0644
os2emxpath.pyc File 4.42 KB 0644
os2emxpath.pyo File 4.42 KB 0644
pdb.doc File 7.73 KB 0644
pdb.py File 45.02 KB 0755
pdb.pyc File 42.65 KB 0644
pdb.pyo File 42.65 KB 0644
pickle.py File 44.42 KB 0644
pickle.pyc File 37.66 KB 0644
pickle.pyo File 37.46 KB 0644
pickletools.py File 72.78 KB 0644
pickletools.pyc File 55.7 KB 0644
pickletools.pyo File 54.85 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.77 KB 0644
pkgutil.pyc File 18.51 KB 0644
pkgutil.pyo File 18.51 KB 0644
platform.py File 51.56 KB 0755
platform.pyc File 37.08 KB 0644
platform.pyo File 37.08 KB 0644
plistlib.py File 15.44 KB 0644
plistlib.pyc File 19.5 KB 0644
plistlib.pyo File 19.41 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.96 KB 0644
posixpath.pyc File 11.19 KB 0644
posixpath.pyo File 11.19 KB 0644
pprint.py File 11.5 KB 0644
pprint.pyc File 9.96 KB 0644
pprint.pyo File 9.78 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.09 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.8 KB 0644
py_compile.pyc File 6.28 KB 0644
py_compile.pyo File 6.28 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 93.5 KB 0755
pydoc.pyc File 90.18 KB 0644
pydoc.pyo File 90.12 KB 0644
quopri.py File 6.8 KB 0755
quopri.pyc File 6.42 KB 0644
quopri.pyo File 6.42 KB 0644
random.py File 31.7 KB 0644
random.pyc File 25.1 KB 0644
random.pyo File 25.1 KB 0644
re.py File 13.11 KB 0644
re.pyc File 13.1 KB 0644
re.pyo File 13.1 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.25 KB 0644
rexec.pyo File 23.25 KB 0644
rfc822.py File 32.76 KB 0644
rfc822.pyc File 31.07 KB 0644
rfc822.pyo File 31.07 KB 0644
rlcompleter.py File 5.85 KB 0644
rlcompleter.pyc File 5.94 KB 0644
rlcompleter.pyo File 5.94 KB 0644
robotparser.py File 7.51 KB 0644
robotparser.pyc File 7.82 KB 0644
robotparser.pyo File 7.82 KB 0644
runpy.py File 10.82 KB 0644
runpy.pyc File 8.6 KB 0644
runpy.pyo File 8.6 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.99 KB 0644
shelve.pyc File 10.02 KB 0644
shelve.pyo File 10.02 KB 0644
shlex.py File 10.9 KB 0644
shlex.pyc File 7.38 KB 0644
shlex.pyo File 7.38 KB 0644
shutil.py File 19.41 KB 0644
shutil.pyc File 18.81 KB 0644
shutil.pyo File 18.81 KB 0644
site.py File 20.8 KB 0644
site.pyc File 20.3 KB 0644
site.pyo File 20.3 KB 0644
smtpd.py File 18.11 KB 0755
smtpd.pyc File 15.51 KB 0644
smtpd.pyo File 15.51 KB 0644
smtplib.py File 31.38 KB 0755
smtplib.pyc File 29.59 KB 0644
smtplib.pyo File 29.59 KB 0644
sndhdr.py File 5.83 KB 0644
sndhdr.pyc File 7.19 KB 0644
sndhdr.pyo File 7.19 KB 0644
socket.py File 20.13 KB 0644
socket.pyc File 15.77 KB 0644
socket.pyo File 15.69 KB 0644
sre.py File 384 B 0644
sre.pyc File 519 B 0644
sre.pyo File 519 B 0644
sre_compile.py File 19.36 KB 0644
sre_compile.pyc File 12.27 KB 0644
sre_compile.pyo File 12.11 KB 0644
sre_constants.py File 7.03 KB 0644
sre_constants.pyc File 6.05 KB 0644
sre_constants.pyo File 6.05 KB 0644
sre_parse.py File 29.98 KB 0644
sre_parse.pyc File 20.66 KB 0644
sre_parse.pyo File 20.66 KB 0644
ssl.py File 38.39 KB 0644
ssl.pyc File 31.95 KB 0644
ssl.pyo File 31.95 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 21.04 KB 0644
string.pyc File 19.98 KB 0644
string.pyo File 19.98 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 49.34 KB 0644
subprocess.pyc File 31.64 KB 0644
subprocess.pyo File 31.64 KB 0644
sunau.py File 16.82 KB 0644
sunau.pyc File 17.96 KB 0644
sunau.pyo File 17.96 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.26 KB 0644
symtable.pyc File 11.51 KB 0644
symtable.pyo File 11.38 KB 0644
sysconfig.py File 22.32 KB 0644
sysconfig.pyc File 17.4 KB 0644
sysconfig.pyo File 17.4 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.53 KB 0644
tarfile.pyc File 74.41 KB 0644
tarfile.pyo File 74.41 KB 0644
telnetlib.py File 26.4 KB 0644
telnetlib.pyc File 22.61 KB 0644
telnetlib.pyo File 22.61 KB 0644
tempfile.py File 19.09 KB 0644
tempfile.pyc File 19.87 KB 0644
tempfile.pyo File 19.87 KB 0644
textwrap.py File 16.88 KB 0644
textwrap.pyc File 11.81 KB 0644
textwrap.pyo File 11.72 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.27 KB 0644
threading.pyc File 41.72 KB 0644
threading.pyo File 39.6 KB 0644
timeit.py File 12.49 KB 0755
timeit.pyc File 11.9 KB 0644
timeit.pyo File 11.9 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.85 KB 0644
token.pyc File 3.73 KB 0644
token.pyo File 3.73 KB 0644
tokenize.py File 17.07 KB 0644
tokenize.pyc File 14.17 KB 0644
tokenize.pyo File 14.11 KB 0644
trace.py File 29.19 KB 0755
trace.pyc File 22.26 KB 0644
trace.pyo File 22.2 KB 0644
traceback.py File 11.02 KB 0644
traceback.pyc File 11.41 KB 0644
traceback.pyo File 11.41 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 2.04 KB 0644
types.pyc File 2.66 KB 0644
types.pyo File 2.66 KB 0644
urllib.py File 58.82 KB 0644
urllib.pyc File 50.04 KB 0644
urllib.pyo File 49.95 KB 0644
urllib2.py File 51.31 KB 0644
urllib2.pyc File 46.19 KB 0644
urllib2.pyo File 46.1 KB 0644
urlparse.py File 19.98 KB 0644
urlparse.pyc File 17.59 KB 0644
urlparse.pyo File 17.59 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.54 KB 0755
uu.pyc File 4.29 KB 0644
uu.pyo File 4.29 KB 0644
uuid.py File 22.98 KB 0644
uuid.pyc File 22.82 KB 0644
uuid.pyo File 22.71 KB 0644
warnings.py File 14.48 KB 0644
warnings.pyc File 13.19 KB 0644
warnings.pyo File 12.42 KB 0644
wave.py File 18.15 KB 0644
wave.pyc File 19.54 KB 0644
wave.pyo File 19.4 KB 0644
weakref.py File 14.48 KB 0644
weakref.pyc File 16.06 KB 0644
weakref.pyo File 16.06 KB 0644
webbrowser.py File 22.19 KB 0755
webbrowser.pyc File 19.29 KB 0644
webbrowser.pyo File 19.24 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.93 KB 0644
xdrlib.pyc File 9.67 KB 0644
xdrlib.pyo File 9.67 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.91 KB 0644
xmlrpclib.pyc File 43.07 KB 0644
xmlrpclib.pyo File 42.89 KB 0644
zipfile.py File 58.08 KB 0644
zipfile.pyc File 41.15 KB 0644
zipfile.pyo File 41.15 KB 0644