From python-3000-checkins at python.org Tue Jul 1 01:30:25 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 01:30:25 +0200 (CEST) Subject: [Python-3000-checkins] r64602 - in python/branches/py3k: Lib/test/test_threading_local.py Modules/_threadmodule.c Message-ID: <20080630233025.3D09B1E4012@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 01:30:24 2008 New Revision: 64602 Log: Merged revisions 64601 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64601 | amaury.forgeotdarc | 2008-06-30 17:42:40 -0500 (Mon, 30 Jun 2008) | 11 lines #Issue3088 in-progress: Race condition with instances of classes derived from threading.local: When a thread touches such an object for the first time, a new thread-local __dict__ is created, and the __init__ method is run. But a thread switch can occur here; if the other thread touches the same object, it installs another __dict__; when the first thread resumes, it updates the dictionary of the second... This is the deep cause of the failures in test_multiprocessing involving "managers" objects. Also a 2.5 backport candidate. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_threading_local.py python/branches/py3k/Modules/_threadmodule.c Modified: python/branches/py3k/Lib/test/test_threading_local.py ============================================================================== --- python/branches/py3k/Lib/test/test_threading_local.py (original) +++ python/branches/py3k/Lib/test/test_threading_local.py Tue Jul 1 01:30:24 2008 @@ -42,6 +42,32 @@ deadlist = [weak for weak in weaklist if weak() is None] self.assert_(len(deadlist) in (n-1, n), (n, len(deadlist))) + def test_derived(self): + # Issue 3088: if there is a threads switch inside the __init__ + # of a threading.local derived class, the per-thread dictionary + # is created but not correctly set on the object. + # The first member set may be bogus. + import time + class Local(threading.local): + def __init__(self): + time.sleep(0.01) + local = Local() + + def f(i): + local.x = i + # Simply check that the variable is correctly set + self.assertEqual(local.x, i) + + threads= [] + for i in range(10): + t = threading.Thread(target=f, args=(i,)) + t.start() + threads.append(t) + + for t in threads: + t.join() + + def test_main(): suite = unittest.TestSuite() suite.addTest(DocTestSuite('_threading_local')) Modified: python/branches/py3k/Modules/_threadmodule.c ============================================================================== --- python/branches/py3k/Modules/_threadmodule.c (original) +++ python/branches/py3k/Modules/_threadmodule.c Tue Jul 1 01:30:24 2008 @@ -293,7 +293,10 @@ } } - else if (self->dict != ldict) { + + /* The call to tp_init above may have caused another thread to run. + Install our ldict again. */ + if (self->dict != ldict) { Py_CLEAR(self->dict); Py_INCREF(ldict); self->dict = ldict; From python-3000-checkins at python.org Tue Jul 1 05:40:57 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 05:40:57 +0200 (CEST) Subject: [Python-3000-checkins] r64604 - in python/branches/py3k-urllib/Doc: howto/urllib2.rst library/contextlib.rst library/ftplib.rst library/http.client.rst library/internet.rst Message-ID: <20080701034057.0C0F21E4018@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 05:40:56 2008 New Revision: 64604 Log: updating the changes to py3k-urllib branch Modified: python/branches/py3k-urllib/Doc/howto/urllib2.rst python/branches/py3k-urllib/Doc/library/contextlib.rst python/branches/py3k-urllib/Doc/library/ftplib.rst python/branches/py3k-urllib/Doc/library/http.client.rst python/branches/py3k-urllib/Doc/library/internet.rst Modified: python/branches/py3k-urllib/Doc/howto/urllib2.rst ============================================================================== --- python/branches/py3k-urllib/Doc/howto/urllib2.rst (original) +++ python/branches/py3k-urllib/Doc/howto/urllib2.rst Tue Jul 1 05:40:56 2008 @@ -1,6 +1,6 @@ -************************************************ - HOWTO Fetch Internet Resources Using urllib2 -************************************************ +***************************************************** + HOWTO Fetch Internet Resources Using urllib package +***************************************************** :Author: `Michael Foord `_ @@ -24,14 +24,14 @@ A tutorial on *Basic Authentication*, with examples in Python. -**urllib2** is a `Python `_ module for fetching URLs +**urllib.request** is a `Python `_ module for fetching URLs (Uniform Resource Locators). It offers a very simple interface, in the form of the *urlopen* function. This is capable of fetching URLs using a variety of different protocols. It also offers a slightly more complex interface for handling common situations - like basic authentication, cookies, proxies and so on. These are provided by objects called handlers and openers. -urllib2 supports fetching URLs for many "URL schemes" (identified by the string +urllib.request supports fetching URLs for many "URL schemes" (identified by the string before the ":" in URL - for example "ftp" is the URL scheme of "ftp://python.org/") using their associated network protocols (e.g. FTP, HTTP). This tutorial focuses on the most common case, HTTP. @@ -40,43 +40,43 @@ encounter errors or non-trivial cases when opening HTTP URLs, you will need some understanding of the HyperText Transfer Protocol. The most comprehensive and authoritative reference to HTTP is :rfc:`2616`. This is a technical document and -not intended to be easy to read. This HOWTO aims to illustrate using *urllib2*, +not intended to be easy to read. This HOWTO aims to illustrate using *urllib*, with enough detail about HTTP to help you through. It is not intended to replace -the :mod:`urllib2` docs, but is supplementary to them. +the :mod:`urllib.request` docs, but is supplementary to them. Fetching URLs ============= -The simplest way to use urllib2 is as follows:: +The simplest way to use urllib.request is as follows:: - import urllib2 - response = urllib2.urlopen('http://python.org/') + import urllib.request + response = urllib.request.urlopen('http://python.org/') html = response.read() -Many uses of urllib2 will be that simple (note that instead of an 'http:' URL we +Many uses of urllib will be that simple (note that instead of an 'http:' URL we could have used an URL starting with 'ftp:', 'file:', etc.). However, it's the purpose of this tutorial to explain the more complicated cases, concentrating on HTTP. HTTP is based on requests and responses - the client makes requests and servers -send responses. urllib2 mirrors this with a ``Request`` object which represents +send responses. urllib.request mirrors this with a ``Request`` object which represents the HTTP request you are making. In its simplest form you create a Request object that specifies the URL you want to fetch. Calling ``urlopen`` with this Request object returns a response object for the URL requested. This response is a file-like object, which means you can for example call ``.read()`` on the response:: - import urllib2 + import urllib.request - req = urllib2.Request('http://www.voidspace.org.uk') - response = urllib2.urlopen(req) + req = urllib.request.Request('http://www.voidspace.org.uk') + response = urllib.request.urlopen(req) the_page = response.read() -Note that urllib2 makes use of the same Request interface to handle all URL +Note that urllib.request makes use of the same Request interface to handle all URL schemes. For example, you can make an FTP request like so:: - req = urllib2.Request('ftp://example.com/') + req = urllib.request.Request('ftp://example.com/') In the case of HTTP, there are two extra things that Request objects allow you to do: First, you can pass data to be sent to the server. Second, you can pass @@ -94,20 +94,20 @@ all POSTs have to come from forms: you can use a POST to transmit arbitrary data to your own application. In the common case of HTML forms, the data needs to be encoded in a standard way, and then passed to the Request object as the ``data`` -argument. The encoding is done using a function from the ``urllib`` library -*not* from ``urllib2``. :: +argument. The encoding is done using a function from the ``urllib.parse`` library +*not* from ``urllib.request``. :: - import urllib - import urllib2 + import urllib.parse + import urllib.request url = 'http://www.someserver.com/cgi-bin/register.cgi' values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python' } - data = urllib.urlencode(values) - req = urllib2.Request(url, data) - response = urllib2.urlopen(req) + data = urllib.parse.urlencode(values) + req = urllib.request.Request(url, data) + response = urllib.request.urlopen(req) the_page = response.read() Note that other encodings are sometimes required (e.g. for file upload from HTML @@ -115,7 +115,7 @@ `_ for more details). -If you do not pass the ``data`` argument, urllib2 uses a **GET** request. One +If you do not pass the ``data`` argument, urllib.request uses a **GET** request. One way in which GET and POST requests differ is that POST requests often have "side-effects": they change the state of the system in some way (for example by placing an order with the website for a hundredweight of tinned spam to be @@ -127,18 +127,18 @@ This is done as follows:: - >>> import urllib2 - >>> import urllib + >>> import urllib.request + >>> import urllib.parse >>> data = {} >>> data['name'] = 'Somebody Here' >>> data['location'] = 'Northampton' >>> data['language'] = 'Python' - >>> url_values = urllib.urlencode(data) + >>> url_values = urllib.parse.urlencode(data) >>> print(url_values) name=Somebody+Here&language=Python&location=Northampton >>> url = 'http://www.example.com/example.cgi' >>> full_url = url + '?' + url_values - >>> data = urllib2.open(full_url) + >>> data = urllib.request.open(full_url) Notice that the full URL is created by adding a ``?`` to the URL, followed by the encoded values. @@ -150,7 +150,7 @@ to your HTTP request. Some websites [#]_ dislike being browsed by programs, or send different versions -to different browsers [#]_ . By default urllib2 identifies itself as +to different browsers [#]_ . By default urllib identifies itself as ``Python-urllib/x.y`` (where ``x`` and ``y`` are the major and minor version numbers of the Python release, e.g. ``Python-urllib/2.5``), which may confuse the site, or just plain @@ -160,8 +160,8 @@ request as above, but identifies itself as a version of Internet Explorer [#]_. :: - import urllib - import urllib2 + import urllib.parse + import urllib.request url = 'http://www.someserver.com/cgi-bin/register.cgi' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' @@ -170,9 +170,9 @@ 'language' : 'Python' } headers = { 'User-Agent' : user_agent } - data = urllib.urlencode(values) - req = urllib2.Request(url, data, headers) - response = urllib2.urlopen(req) + data = urllib.parse.urlencode(values) + req = urllib.request.Request(url, data, headers) + response = urllib.request.urlopen(req) the_page = response.read() The response also has two useful methods. See the section on `info and geturl`_ @@ -182,7 +182,7 @@ Handling Exceptions =================== -*urlopen* raises ``URLError`` when it cannot handle a response (though as usual +*urllib.error* raises ``URLError`` when it cannot handle a response (though as usual with Python APIs, builtin exceptions such as ValueError, TypeError etc. may also be raised). @@ -199,9 +199,9 @@ e.g. :: - >>> req = urllib2.Request('http://www.pretend_server.org') - >>> try: urllib2.urlopen(req) - >>> except URLError, e: + >>> req = urllib.request.Request('http://www.pretend_server.org') + >>> try: urllib.request.urlopen(req) + >>> except urllib.error.URLError, e: >>> print(e.reason) >>> (4, 'getaddrinfo failed') @@ -214,7 +214,7 @@ the status code indicates that the server is unable to fulfil the request. The default handlers will handle some of these responses for you (for example, if the response is a "redirection" that requests the client fetch the document from -a different URL, urllib2 will handle that for you). For those it can't handle, +a different URL, urllib.request will handle that for you). For those it can't handle, urlopen will raise an ``HTTPError``. Typical errors include '404' (page not found), '403' (request forbidden), and '401' (authentication required). @@ -305,12 +305,12 @@ When an error is raised the server responds by returning an HTTP error code *and* an error page. You can use the ``HTTPError`` instance as a response on the page returned. This means that as well as the code attribute, it also has read, -geturl, and info, methods. :: +geturl, and info, methods as returned by the ``urllib.response`` module:: - >>> req = urllib2.Request('http://www.python.org/fish.html') + >>> req = urllib.request.Request('http://www.python.org/fish.html') >>> try: - >>> urllib2.urlopen(req) - >>> except URLError, e: + >>> urllib.request.urlopen(req) + >>> except urllib.error.URLError, e: >>> print(e.code) >>> print(e.read()) >>> @@ -334,7 +334,8 @@ :: - from urllib2 import Request, urlopen, URLError, HTTPError + from urllib.request import Request, urlopen + from urllib.error import URLError, HTTPError req = Request(someurl) try: response = urlopen(req) @@ -358,7 +359,8 @@ :: - from urllib2 import Request, urlopen, URLError + from urllib.request import Request, urlopen + from urllib.error import URLError req = Request(someurl) try: response = urlopen(req) @@ -377,7 +379,8 @@ =============== The response returned by urlopen (or the ``HTTPError`` instance) has two useful -methods ``info`` and ``geturl``. +methods ``info`` and ``geturl`` and is defined in the module +``urllib.response``. **geturl** - this returns the real URL of the page fetched. This is useful because ``urlopen`` (or the opener object used) may have followed a @@ -397,7 +400,7 @@ ==================== When you fetch a URL you use an opener (an instance of the perhaps -confusingly-named :class:`urllib2.OpenerDirector`). Normally we have been using +confusingly-named :class:`urllib.request.OpenerDirector`). Normally we have been using the default opener - via ``urlopen`` - but you can create custom openers. Openers use handlers. All the "heavy lifting" is done by the handlers. Each handler knows how to open URLs for a particular URL scheme (http, @@ -466,24 +469,24 @@ than the URL you pass to .add_password() will also match. :: # create a password manager - password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() + password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() # Add the username and password. # If we knew the realm, we could use it instead of ``None``. top_level_url = "http://example.com/foo/" password_mgr.add_password(None, top_level_url, username, password) - handler = urllib2.HTTPBasicAuthHandler(password_mgr) + handler = urllib.request.HTTPBasicAuthHandler(password_mgr) # create "opener" (OpenerDirector instance) - opener = urllib2.build_opener(handler) + opener = urllib.request.build_opener(handler) # use the opener to fetch a URL opener.open(a_url) # Install the opener. - # Now all calls to urllib2.urlopen use our opener. - urllib2.install_opener(opener) + # Now all calls to urllib.request.urlopen use our opener. + urllib.request.install_opener(opener) .. note:: @@ -505,46 +508,46 @@ Proxies ======= -**urllib2** will auto-detect your proxy settings and use those. This is through +**urllib.request** will auto-detect your proxy settings and use those. This is through the ``ProxyHandler`` which is part of the normal handler chain. Normally that's a good thing, but there are occasions when it may not be helpful [#]_. One way to do this is to setup our own ``ProxyHandler``, with no proxies defined. This is done using similar steps to setting up a `Basic Authentication`_ handler : :: - >>> proxy_support = urllib2.ProxyHandler({}) - >>> opener = urllib2.build_opener(proxy_support) - >>> urllib2.install_opener(opener) + >>> proxy_support = urllib.request.ProxyHandler({}) + >>> opener = urllib.request.build_opener(proxy_support) + >>> urllib.request.install_opener(opener) .. note:: - Currently ``urllib2`` *does not* support fetching of ``https`` locations - through a proxy. However, this can be enabled by extending urllib2 as + Currently ``urllib.request`` *does not* support fetching of ``https`` locations + through a proxy. However, this can be enabled by extending urllib.request as shown in the recipe [#]_. Sockets and Layers ================== -The Python support for fetching resources from the web is layered. urllib2 uses -the http.client library, which in turn uses the socket library. +The Python support for fetching resources from the web is layered. +urllib.request uses the http.client library, which in turn uses the socket library. As of Python 2.3 you can specify how long a socket should wait for a response before timing out. This can be useful in applications which have to fetch web pages. By default the socket module has *no timeout* and can hang. Currently, -the socket timeout is not exposed at the http.client or urllib2 levels. +the socket timeout is not exposed at the http.client or urllib.request levels. However, you can set the default timeout globally for all sockets using :: import socket - import urllib2 + import urllib.request # timeout in seconds timeout = 10 socket.setdefaulttimeout(timeout) - # this call to urllib2.urlopen now uses the default timeout + # this call to urllib.request.urlopen now uses the default timeout # we have set in the socket module - req = urllib2.Request('http://www.voidspace.org.uk') - response = urllib2.urlopen(req) + req = urllib.request.Request('http://www.voidspace.org.uk') + response = urllib.request.urlopen(req) ------- Modified: python/branches/py3k-urllib/Doc/library/contextlib.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/contextlib.rst (original) +++ python/branches/py3k-urllib/Doc/library/contextlib.rst Tue Jul 1 05:40:56 2008 @@ -98,9 +98,9 @@ And lets you write code like this:: from contextlib import closing - import urllib + import urllib.request - with closing(urllib.urlopen('http://www.python.org')) as page: + with closing(urllib.request.urlopen('http://www.python.org')) as page: for line in page: print(line) Modified: python/branches/py3k-urllib/Doc/library/ftplib.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/ftplib.rst (original) +++ python/branches/py3k-urllib/Doc/library/ftplib.rst Tue Jul 1 05:40:56 2008 @@ -13,9 +13,9 @@ This module defines the class :class:`FTP` and a few related items. The :class:`FTP` class implements the client side of the FTP protocol. You can use this to write Python programs that perform a variety of automated FTP jobs, such -as mirroring other ftp servers. It is also used by the module :mod:`urllib` to -handle URLs that use FTP. For more information on FTP (File Transfer Protocol), -see Internet :rfc:`959`. +as mirroring other ftp servers. It is also used by the module +:mod:`urllib.request` to handle URLs that use FTP. For more information on FTP +(File Transfer Protocol), see Internet :rfc:`959`. Here's a sample session using the :mod:`ftplib` module:: Modified: python/branches/py3k-urllib/Doc/library/http.client.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/http.client.rst (original) +++ python/branches/py3k-urllib/Doc/library/http.client.rst Tue Jul 1 05:40:56 2008 @@ -9,10 +9,11 @@ pair: HTTP; protocol single: HTTP; http.client (standard module) -.. index:: module: urllib +.. index:: module: urllib.request This module defines classes which implement the client side of the HTTP and -HTTPS protocols. It is normally not used directly --- the module :mod:`urllib` +HTTPS protocols. It is normally not used directly --- the module +:mod:`urllib.request` uses it to handle URLs that use HTTP and HTTPS. .. note:: @@ -484,8 +485,8 @@ Here is an example session that shows how to ``POST`` requests:: - >>> import http.client, urllib - >>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) + >>> import http.client, urllib.parse + >>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) >>> headers = {"Content-type": "application/x-www-form-urlencoded", ... "Accept": "text/plain"} >>> conn = http.client.HTTPConnection("musi-cal.mojam.com:80") Modified: python/branches/py3k-urllib/Doc/library/internet.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/internet.rst (original) +++ python/branches/py3k-urllib/Doc/library/internet.rst Tue Jul 1 05:40:56 2008 @@ -25,9 +25,9 @@ cgitb.rst wsgiref.rst urllib.request.rst - urllib.robotparser.rst - urllib.error.rst urllib.parse.rst + urllib.error.rst + urllib.robotparser.rst http.client.rst ftplib.rst poplib.rst From python-3000-checkins at python.org Tue Jul 1 05:55:38 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 05:55:38 +0200 (CEST) Subject: [Python-3000-checkins] r64605 - python/branches/py3k-urllib/Doc/library/urllib.error.rst Message-ID: <20080701035538.9B24F1E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 05:55:38 2008 New Revision: 64605 Log: urllib.error doc Added: python/branches/py3k-urllib/Doc/library/urllib.error.rst (props changed) - copied unchanged from r64604, /python/branches/py3k/Doc/library/urllib.error.rst From python-3000-checkins at python.org Tue Jul 1 05:57:36 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 05:57:36 +0200 (CEST) Subject: [Python-3000-checkins] r64606 - python/branches/py3k-urllib/Doc/library/urllib.parse.rst Message-ID: <20080701035736.A22DA1E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 05:57:36 2008 New Revision: 64606 Log: urllib.parse doc to py3k-urllib branch Added: python/branches/py3k-urllib/Doc/library/urllib.parse.rst (props changed) - copied unchanged from r64604, /python/branches/py3k/Doc/library/urllib.parse.rst From python-3000-checkins at python.org Tue Jul 1 05:58:33 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 05:58:33 +0200 (CEST) Subject: [Python-3000-checkins] r64607 - python/branches/py3k-urllib/Doc/library/urllib.request.rst Message-ID: <20080701035833.E45671E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 05:58:33 2008 New Revision: 64607 Log: changes py3k-urllib branch Added: python/branches/py3k-urllib/Doc/library/urllib.request.rst (props changed) - copied unchanged from r64604, /python/branches/py3k/Doc/library/urllib.request.rst From python-3000-checkins at python.org Tue Jul 1 05:59:18 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 05:59:18 +0200 (CEST) Subject: [Python-3000-checkins] r64608 - python/branches/py3k-urllib/Doc/library/urllib.robotparser.rst Message-ID: <20080701035918.BAB3C1E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 05:59:18 2008 New Revision: 64608 Log: changes to py3k-urllib branch Added: python/branches/py3k-urllib/Doc/library/urllib.robotparser.rst (props changed) - copied unchanged from r64604, /python/branches/py3k/Doc/library/urllib.robotparser.rst From python-3000-checkins at python.org Tue Jul 1 06:02:33 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 06:02:33 +0200 (CEST) Subject: [Python-3000-checkins] r64609 - in python/branches/py3k-urllib: Doc/conf.py Doc/howto/urllib2.rst Doc/library/contextlib.rst Doc/library/decimal.rst Doc/library/fractions.rst Doc/library/http.client.rst Doc/library/http.cookiejar.rst Doc/library/multiprocessing.rst Doc/library/operator.rst Doc/library/optparse.rst Doc/library/pickle.rst Doc/library/ssl.rst Doc/reference/compound_stmts.rst Doc/tutorial/stdlib.rst Doc/whatsnew/2.6.rst Include/bytesobject.h Include/patchlevel.h Include/pymem.h Include/pyport.h Include/unicodeobject.h Lib/distutils/__init__.py Lib/http/cookiejar.py Lib/http/server.py Lib/idlelib/idlever.py Lib/lib2to3/refactor.py Lib/logging/__init__.py Lib/logging/handlers.py Lib/multiprocessing Lib/multiprocessing/connection.py Lib/multiprocessing/dummy Lib/multiprocessing/managers.py Lib/multiprocessing/process.py Lib/multiprocessing/sharedctypes.py Lib/nturl2path.py Lib/platform.py Lib/pydoc.py Lib/ssl.py Lib/test/crashers/loosing_mro_ref.py Lib/test/ieee754.txt Lib/test/regrtest.py Lib/test/test_array.py Lib/test/test_binop.py Lib/test/test_compile.py Lib/test/test_grammar.py Lib/test/test_heapq.py Lib/test/test_int.py Lib/test/test_multiprocessing.py Lib/test/test_ssl.py Lib/test/test_struct.py Lib/test/test_sys.py Lib/test/test_threading_local.py Lib/test/test_types.py Lib/test/test_warnings.py Lib/urllib Lib/urllib/request.py Lib/warnings.py Mac/BuildScript/build-installer.py Mac/Makefile.in Makefile.pre.in Misc/ACKS Misc/NEWS Misc/RPM/python-3.0.spec Misc/cheatsheet Misc/developers.txt Modules/_csv.c Modules/_ctypes/callproc.c Modules/_heapqmodule.c Modules/_struct.c Modules/_threadmodule.c Modules/arraymodule.c Modules/audioop.c Modules/binascii.c Modules/cjkcodecs/multibytecodec.c Modules/datetimemodule.c Modules/mathmodule.c Objects/dictobject.c Objects/listobject.c Objects/longobject.c Objects/memoryobject.c Objects/obmalloc.c Objects/stringlib/formatter.h Objects/stringlib/localeutil.h Objects/tupleobject.c PC/_msi.c PCbuild/sqlite3.vcproj Parser/node.c Python/_warnings.c Python/asdl.c Python/ast.c Python/compile.c Python/marshal.c Python/pystrtod.c README RELNOTES Tools/buildbot/external-amd64.bat Tools/faqwiz/faqwiz.py Tools/msi/msi.py Tools/msi/msilib.py Tools/versioncheck/pyversioncheck.py Tools/webchecker/webchecker.py Tools/webchecker/websucker.py setup.py Message-ID: <20080701040233.228D81E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 06:02:29 2008 New Revision: 64609 Log: merging the files from trunk to py3k-urllib branch Modified: python/branches/py3k-urllib/ (props changed) python/branches/py3k-urllib/Doc/conf.py python/branches/py3k-urllib/Doc/howto/urllib2.rst python/branches/py3k-urllib/Doc/library/contextlib.rst python/branches/py3k-urllib/Doc/library/decimal.rst python/branches/py3k-urllib/Doc/library/fractions.rst python/branches/py3k-urllib/Doc/library/http.client.rst python/branches/py3k-urllib/Doc/library/http.cookiejar.rst python/branches/py3k-urllib/Doc/library/multiprocessing.rst python/branches/py3k-urllib/Doc/library/operator.rst python/branches/py3k-urllib/Doc/library/optparse.rst python/branches/py3k-urllib/Doc/library/pickle.rst python/branches/py3k-urllib/Doc/library/ssl.rst python/branches/py3k-urllib/Doc/reference/compound_stmts.rst python/branches/py3k-urllib/Doc/tutorial/stdlib.rst python/branches/py3k-urllib/Doc/whatsnew/2.6.rst python/branches/py3k-urllib/Include/bytesobject.h python/branches/py3k-urllib/Include/patchlevel.h python/branches/py3k-urllib/Include/pymem.h python/branches/py3k-urllib/Include/pyport.h python/branches/py3k-urllib/Include/unicodeobject.h python/branches/py3k-urllib/Lib/distutils/__init__.py python/branches/py3k-urllib/Lib/http/cookiejar.py python/branches/py3k-urllib/Lib/http/server.py python/branches/py3k-urllib/Lib/idlelib/idlever.py python/branches/py3k-urllib/Lib/lib2to3/refactor.py python/branches/py3k-urllib/Lib/logging/__init__.py python/branches/py3k-urllib/Lib/logging/handlers.py python/branches/py3k-urllib/Lib/multiprocessing/ (props changed) python/branches/py3k-urllib/Lib/multiprocessing/connection.py python/branches/py3k-urllib/Lib/multiprocessing/dummy/ (props changed) python/branches/py3k-urllib/Lib/multiprocessing/managers.py python/branches/py3k-urllib/Lib/multiprocessing/process.py python/branches/py3k-urllib/Lib/multiprocessing/sharedctypes.py python/branches/py3k-urllib/Lib/nturl2path.py python/branches/py3k-urllib/Lib/platform.py python/branches/py3k-urllib/Lib/pydoc.py python/branches/py3k-urllib/Lib/ssl.py python/branches/py3k-urllib/Lib/test/crashers/loosing_mro_ref.py python/branches/py3k-urllib/Lib/test/ieee754.txt python/branches/py3k-urllib/Lib/test/regrtest.py python/branches/py3k-urllib/Lib/test/test_array.py python/branches/py3k-urllib/Lib/test/test_binop.py python/branches/py3k-urllib/Lib/test/test_compile.py python/branches/py3k-urllib/Lib/test/test_grammar.py python/branches/py3k-urllib/Lib/test/test_heapq.py python/branches/py3k-urllib/Lib/test/test_int.py python/branches/py3k-urllib/Lib/test/test_multiprocessing.py python/branches/py3k-urllib/Lib/test/test_ssl.py python/branches/py3k-urllib/Lib/test/test_struct.py python/branches/py3k-urllib/Lib/test/test_sys.py python/branches/py3k-urllib/Lib/test/test_threading_local.py python/branches/py3k-urllib/Lib/test/test_types.py python/branches/py3k-urllib/Lib/test/test_warnings.py python/branches/py3k-urllib/Lib/urllib/ (props changed) python/branches/py3k-urllib/Lib/urllib/request.py python/branches/py3k-urllib/Lib/warnings.py python/branches/py3k-urllib/Mac/BuildScript/build-installer.py python/branches/py3k-urllib/Mac/Makefile.in python/branches/py3k-urllib/Makefile.pre.in python/branches/py3k-urllib/Misc/ACKS python/branches/py3k-urllib/Misc/NEWS python/branches/py3k-urllib/Misc/RPM/python-3.0.spec python/branches/py3k-urllib/Misc/cheatsheet python/branches/py3k-urllib/Misc/developers.txt python/branches/py3k-urllib/Modules/_csv.c python/branches/py3k-urllib/Modules/_ctypes/callproc.c python/branches/py3k-urllib/Modules/_heapqmodule.c python/branches/py3k-urllib/Modules/_struct.c python/branches/py3k-urllib/Modules/_threadmodule.c python/branches/py3k-urllib/Modules/arraymodule.c python/branches/py3k-urllib/Modules/audioop.c python/branches/py3k-urllib/Modules/binascii.c python/branches/py3k-urllib/Modules/cjkcodecs/multibytecodec.c python/branches/py3k-urllib/Modules/datetimemodule.c python/branches/py3k-urllib/Modules/mathmodule.c python/branches/py3k-urllib/Objects/dictobject.c python/branches/py3k-urllib/Objects/listobject.c python/branches/py3k-urllib/Objects/longobject.c python/branches/py3k-urllib/Objects/memoryobject.c python/branches/py3k-urllib/Objects/obmalloc.c python/branches/py3k-urllib/Objects/stringlib/formatter.h python/branches/py3k-urllib/Objects/stringlib/localeutil.h python/branches/py3k-urllib/Objects/tupleobject.c python/branches/py3k-urllib/PC/_msi.c python/branches/py3k-urllib/PCbuild/sqlite3.vcproj python/branches/py3k-urllib/Parser/node.c python/branches/py3k-urllib/Python/_warnings.c python/branches/py3k-urllib/Python/asdl.c python/branches/py3k-urllib/Python/ast.c python/branches/py3k-urllib/Python/compile.c python/branches/py3k-urllib/Python/marshal.c python/branches/py3k-urllib/Python/pystrtod.c python/branches/py3k-urllib/README python/branches/py3k-urllib/RELNOTES python/branches/py3k-urllib/Tools/buildbot/external-amd64.bat python/branches/py3k-urllib/Tools/faqwiz/faqwiz.py python/branches/py3k-urllib/Tools/msi/msi.py python/branches/py3k-urllib/Tools/msi/msilib.py python/branches/py3k-urllib/Tools/versioncheck/pyversioncheck.py python/branches/py3k-urllib/Tools/webchecker/webchecker.py python/branches/py3k-urllib/Tools/webchecker/websucker.py python/branches/py3k-urllib/setup.py Modified: python/branches/py3k-urllib/Doc/conf.py ============================================================================== --- python/branches/py3k-urllib/Doc/conf.py (original) +++ python/branches/py3k-urllib/Doc/conf.py Tue Jul 1 06:02:29 2008 @@ -95,6 +95,9 @@ # Output file base name for HTML help builder. htmlhelp_basename = 'python' + release.replace('.', '') +# Split the index +html_split_index = True + # Options for LaTeX output # ------------------------ Modified: python/branches/py3k-urllib/Doc/howto/urllib2.rst ============================================================================== --- python/branches/py3k-urllib/Doc/howto/urllib2.rst (original) +++ python/branches/py3k-urllib/Doc/howto/urllib2.rst Tue Jul 1 06:02:29 2008 @@ -1,12 +1,12 @@ -***************************************************** - HOWTO Fetch Internet Resources Using urllib package -***************************************************** +*********************************************************** + HOWTO Fetch Internet Resources Using The urllib Package +*********************************************************** :Author: `Michael Foord `_ .. note:: - There is an French translation of an earlier revision of this + There is a French translation of an earlier revision of this HOWTO, available at `urllib2 - Le Manuel manquant `_. @@ -18,7 +18,7 @@ .. sidebar:: Related Articles You may also find useful the following article on fetching web resources - with Python : + with Python: * `Basic Authentication `_ @@ -94,8 +94,8 @@ all POSTs have to come from forms: you can use a POST to transmit arbitrary data to your own application. In the common case of HTML forms, the data needs to be encoded in a standard way, and then passed to the Request object as the ``data`` -argument. The encoding is done using a function from the ``urllib.parse`` library -*not* from ``urllib.request``. :: +argument. The encoding is done using a function from the :mod:`urllib.parse` +library. :: import urllib.parse import urllib.request @@ -115,7 +115,7 @@ `_ for more details). -If you do not pass the ``data`` argument, urllib.request uses a **GET** request. One +If you do not pass the ``data`` argument, urllib uses a **GET** request. One way in which GET and POST requests differ is that POST requests often have "side-effects": they change the state of the system in some way (for example by placing an order with the website for a hundredweight of tinned spam to be @@ -182,13 +182,15 @@ Handling Exceptions =================== -*urllib.error* raises ``URLError`` when it cannot handle a response (though as usual +*urlopen* raises ``URLError`` when it cannot handle a response (though as usual with Python APIs, builtin exceptions such as ValueError, TypeError etc. may also be raised). ``HTTPError`` is the subclass of ``URLError`` raised in the specific case of HTTP URLs. +The exception classes are exported from the :mod:`urllib.error` module. + URLError -------- @@ -214,7 +216,7 @@ the status code indicates that the server is unable to fulfil the request. The default handlers will handle some of these responses for you (for example, if the response is a "redirection" that requests the client fetch the document from -a different URL, urllib.request will handle that for you). For those it can't handle, +a different URL, urllib will handle that for you). For those it can't handle, urlopen will raise an ``HTTPError``. Typical errors include '404' (page not found), '403' (request forbidden), and '401' (authentication required). @@ -380,7 +382,7 @@ The response returned by urlopen (or the ``HTTPError`` instance) has two useful methods ``info`` and ``geturl`` and is defined in the module -``urllib.response``. +:mod:`urllib.response`. **geturl** - this returns the real URL of the page fetched. This is useful because ``urlopen`` (or the opener object used) may have followed a @@ -388,7 +390,7 @@ **info** - this returns a dictionary-like object that describes the page fetched, particularly the headers sent by the server. It is currently an -``http.client.HTTPMessage`` instance. +:class:`http.client.HTTPMessage` instance. Typical headers include 'Content-length', 'Content-type', and so on. See the `Quick Reference to HTTP Headers `_ @@ -508,7 +510,7 @@ Proxies ======= -**urllib.request** will auto-detect your proxy settings and use those. This is through +**urllib** will auto-detect your proxy settings and use those. This is through the ``ProxyHandler`` which is part of the normal handler chain. Normally that's a good thing, but there are occasions when it may not be helpful [#]_. One way to do this is to setup our own ``ProxyHandler``, with no proxies defined. This @@ -528,8 +530,8 @@ Sockets and Layers ================== -The Python support for fetching resources from the web is layered. -urllib.request uses the http.client library, which in turn uses the socket library. +The Python support for fetching resources from the web is layered. urllib uses +the :mod:`http.client` library, which in turn uses the socket library. As of Python 2.3 you can specify how long a socket should wait for a response before timing out. This can be useful in applications which have to fetch web @@ -573,9 +575,9 @@ `Quick Reference to HTTP Headers`_. .. [#] In my case I have to use a proxy to access the internet at work. If you attempt to fetch *localhost* URLs through this proxy it blocks them. IE - is set to use the proxy, which urllib2 picks up on. In order to test - scripts with a localhost server, I have to prevent urllib2 from using + is set to use the proxy, which urllib picks up on. In order to test + scripts with a localhost server, I have to prevent urllib from using the proxy. -.. [#] urllib2 opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe +.. [#] urllib opener for SSL proxy (CONNECT method): `ASPN Cookbook Recipe `_. Modified: python/branches/py3k-urllib/Doc/library/contextlib.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/contextlib.rst (original) +++ python/branches/py3k-urllib/Doc/library/contextlib.rst Tue Jul 1 06:02:29 2008 @@ -98,9 +98,9 @@ And lets you write code like this:: from contextlib import closing - import urllib.request + from urllib.request import urlopen - with closing(urllib.request.urlopen('http://www.python.org')) as page: + with closing(urlopen('http://www.python.org')) as page: for line in page: print(line) Modified: python/branches/py3k-urllib/Doc/library/decimal.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/decimal.rst (original) +++ python/branches/py3k-urllib/Doc/library/decimal.rst Tue Jul 1 06:02:29 2008 @@ -135,6 +135,7 @@ :const:`NaN` which stands for "Not a number", positive and negative :const:`Infinity`, and :const:`-0`. + >>> getcontext().prec = 28 >>> Decimal(10) Decimal('10') >>> Decimal('3.14') @@ -173,7 +174,7 @@ .. doctest:: :options: +NORMALIZE_WHITESPACE - >>> data = map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()) + >>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split())) >>> max(data) Decimal('9.25') >>> min(data) @@ -201,6 +202,7 @@ And some mathematical functions are also available to Decimal: + >>> getcontext().prec = 28 >>> Decimal(2).sqrt() Decimal('1.414213562373095048801688724') >>> Decimal(1).exp() @@ -267,7 +269,7 @@ Decimal('3.14159292') >>> getcontext() Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, - capitals=1, flags=[Rounded, Inexact], traps=[]) + capitals=1, flags=[Inexact, Rounded], traps=[]) The *flags* entry shows that the rational approximation to :const:`Pi` was rounded (digits beyond the context precision were thrown away) and that the @@ -414,6 +416,11 @@ ``x.compare_total_mag(y)`` is equivalent to ``x.copy_abs().compare_total(y.copy_abs())``. + .. method:: conjugate() + + Just returns itself, this method is only to comply with the Decimal + Specification. + .. method:: copy_abs() Return the absolute value of the argument. This operation is unaffected @@ -722,13 +729,6 @@ :const:`Rounded`. If given, applies *rounding*; otherwise, uses the rounding method in either the supplied *context* or the current context. - .. method:: trim() - - Return the decimal with *insignificant* trailing zeros removed. Here, a - trailing zero is considered insignificant either if it follows the decimal - point, or if the exponent of the argument (that is, the last element of - the :meth:`as_tuple` representation) is positive. - .. _logical_operands_label: @@ -940,6 +940,46 @@ Return the sum of *x* and *y*. + .. method:: canonical(x) + + Returns the same Decimal object *x*. + + + .. method:: compare(x, y) + + Compares *x* and *y* numerically. + + + .. method:: compare_signal(x, y) + + Compares the values of the two operands numerically. + + + .. method:: compare_total(x, y) + + Compares two operands using their abstract representation. + + + .. method:: compare_total_mag(x, y) + + Compares two operands using their abstract representation, ignoring sign. + + + .. method:: copy_abs(x) + + Returns a copy of *x* with the sign set to 0. + + + .. method:: copy_negate(x) + + Returns a copy of *x* with the sign inverted. + + + .. method:: copy_sign(x, y) + + Copies the sign from *y* to *x*. + + .. method:: divide(x, y) Return *x* divided by *y*. @@ -955,6 +995,121 @@ Divides two numbers and returns the integer part of the result. + .. method:: exp(x) + + Returns `e ** x`. + + + .. method:: fma(x, y, z) + + Returns *x* multiplied by *y*, plus *z*. + + + .. method:: is_canonical(x) + + Returns True if *x* is canonical; otherwise returns False. + + + .. method:: is_finite(x) + + Returns True if *x* is finite; otherwise returns False. + + + .. method:: is_infinite(x) + + Returns True if *x* is infinite; otherwise returns False. + + + .. method:: is_nan(x) + + Returns True if *x* is a qNaN or sNaN; otherwise returns False. + + + .. method:: is_normal(x) + + Returns True if *x* is a normal number; otherwise returns False. + + + .. method:: is_qnan(x) + + Returns True if *x* is a quiet NaN; otherwise returns False. + + + .. method:: is_signed(x) + + Returns True if *x* is negative; otherwise returns False. + + + .. method:: is_snan(x) + + Returns True if *x* is a signaling NaN; otherwise returns False. + + + .. method:: is_subnormal(x) + + Returns True if *x* is subnormal; otherwise returns False. + + + .. method:: is_zero(x) + + Returns True if *x* is a zero; otherwise returns False. + + + .. method:: ln(x) + + Returns the natural (base e) logarithm of *x*. + + + .. method:: log10(x) + + Returns the base 10 logarithm of *x*. + + + .. method:: logb(x) + + Returns the exponent of the magnitude of the operand's MSD. + + + .. method:: logical_and(x, y) + + Applies the logical operation `and` between each operand's digits. + + + .. method:: logical_invert(x) + + Invert all the digits in *x*. + + + .. method:: logical_or(x, y) + + Applies the logical operation `or` between each operand's digits. + + + .. method:: logical_xor(x, y) + + Applies the logical operation `xor` between each operand's digits. + + + .. method:: max(x, y) + + Compares two values numerically and returns the maximum. + + + .. method:: max_mag(x, y) + + Compares the values numerically with their sign ignored. + + + .. method:: min(x, y) + + Compares two values numerically and returns the minimum. + + + .. method:: min_mag(x, y) + + Compares the values numerically with their sign ignored. + + .. method:: minus(x) Minus corresponds to the unary prefix minus operator in Python. @@ -965,6 +1120,31 @@ Return the product of *x* and *y*. + .. method:: next_minus(x) + + Returns the largest representable number smaller than *x*. + + + .. method:: next_plus(x) + + Returns the smallest representable number larger than *x*. + + + .. method:: next_toward(x, y) + + Returns the number closest to *x*, in direction towards *y*. + + + .. method:: normalize(x) + + Reduces *x* to its simplest form. + + + .. method:: number_class(x) + + Returns an indication of the class of *x*. + + .. method:: plus(x) Plus corresponds to the unary prefix plus operator in Python. This @@ -994,6 +1174,17 @@ that would be obtained by computing ``(x**y) % modulo`` with unbounded precision, but is computed more efficiently. It is always exact. + + .. method:: quantize(x, y) + + Returns a value equal to *x* (rounded), having the exponent of *y*. + + + .. method:: radix() + + Just returns 10, as this is Decimal, :) + + .. method:: remainder(x, y) Returns the remainder from integer division. @@ -1001,10 +1192,52 @@ The sign of the result, if non-zero, is the same as that of the original dividend. + .. method:: remainder_near(x, y) + + Returns `x - y * n`, where *n* is the integer nearest the exact value + of `x / y` (if the result is `0` then its sign will be the sign of *x*). + + + .. method:: rotate(x, y) + + Returns a rotated copy of *x*, *y* times. + + + .. method:: same_quantum(x, y) + + Returns True if the two operands have the same exponent. + + + .. method:: scaleb (x, y) + + Returns the first operand after adding the second value its exp. + + + .. method:: shift(x, y) + + Returns a shifted copy of *x*, *y* times. + + + .. method:: sqrt(x) + + Square root of a non-negative number to context precision. + + .. method:: subtract(x, y) Return the difference between *x* and *y*. + + .. method:: to_eng_string(x) + + Converts a number to a string, using scientific notation. + + + .. method:: to_integral_exact(x) + + Rounds to an integer. + + .. method:: to_sci_string(x) Converts a number to a string using scientific notation. @@ -1323,7 +1556,7 @@ q = Decimal(10) ** -places # 2 places --> '0.01' sign, digits, exp = value.quantize(q).as_tuple() result = [] - digits = map(str, digits) + digits = list(map(str, digits)) build, next = result.append, digits.pop if sign: build(trailneg) Modified: python/branches/py3k-urllib/Doc/library/fractions.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/fractions.rst (original) +++ python/branches/py3k-urllib/Doc/library/fractions.rst Tue Jul 1 06:02:29 2008 @@ -8,39 +8,75 @@ .. sectionauthor:: Jeffrey Yasskin -The :mod:`fractions` module defines an immutable, infinite-precision -Rational number class. +The :mod:`fractions` module provides support for rational number arithmetic. +A Fraction instance can be constructed from a pair of integers, from +another rational number, or from a string. + .. class:: Fraction(numerator=0, denominator=1) Fraction(other_fraction) Fraction(string) The first version requires that *numerator* and *denominator* are instances of :class:`numbers.Integral` and returns a new - ``Fraction`` representing ``numerator/denominator``. If - *denominator* is :const:`0`, raises a :exc:`ZeroDivisionError`. The - second version requires that *other_fraction* is an instance of - :class:`numbers.Fraction` and returns an instance of - :class:`Rational` with the same value. The third version expects a - string of the form ``[-+]?[0-9]+(/[0-9]+)?``, optionally surrounded - by spaces. - - Implements all of the methods and operations from - :class:`numbers.Rational` and is immutable and hashable. + :class:`Fraction` instance with value ``numerator/denominator``. If + *denominator* is :const:`0`, it raises a + :exc:`ZeroDivisionError`. The second version requires that + *other_fraction* is an instance of :class:`numbers.Rational` and + returns an :class:`Fraction` instance with the same value. The + last version of the constructor expects a string or unicode + instance in one of two possible forms. The first form is:: + + [sign] numerator ['/' denominator] + + where the optional ``sign`` may be either '+' or '-' and + ``numerator`` and ``denominator`` (if present) are strings of + decimal digits. The second permitted form is that of a number + containing a decimal point:: + + [sign] integer '.' [fraction] | [sign] '.' fraction + + where ``integer`` and ``fraction`` are strings of digits. In + either form the input string may also have leading and/or trailing + whitespace. Here are some examples:: + + >>> from fractions import Fraction + >>> Fraction(16, -10) + Fraction(-8, 5) + >>> Fraction(123) + Fraction(123, 1) + >>> Fraction() + Fraction(0, 1) + >>> Fraction('3/7') + Fraction(3, 7) + [40794 refs] + >>> Fraction(' -3/7 ') + Fraction(-3, 7) + >>> Fraction('1.414213 \t\n') + Fraction(1414213, 1000000) + >>> Fraction('-.125') + Fraction(-1, 8) + + + The :class:`Fraction` class inherits from the abstract base class + :class:`numbers.Rational`, and implements all of the methods and + operations from that class. :class:`Fraction` instances are hashable, + and should be treated as immutable. In addition, + :class:`Fraction` has the following methods: .. method:: from_float(flt) - This classmethod constructs a :class:`Fraction` representing the exact + This class method constructs a :class:`Fraction` representing the exact value of *flt*, which must be a :class:`float`. Beware that - ``Fraction.from_float(0.3)`` is not the same value as ``Rational(3, 10)`` + ``Fraction.from_float(0.3)`` is not the same value as ``Fraction(3, 10)`` .. method:: from_decimal(dec) - This classmethod constructs a :class:`Fraction` representing the exact - value of *dec*, which must be a :class:`decimal.Decimal`. + This class method constructs a :class:`Fraction` representing the exact + value of *dec*, which must be a :class:`decimal.Decimal` instance. .. method:: limit_denominator(max_denominator=1000000) @@ -51,37 +87,50 @@ >>> from fractions import Fraction >>> Fraction('3.1415926535897932').limit_denominator(1000) - Fraction(355L, 113L) + Fraction(355, 113) or for recovering a rational number that's represented as a float: >>> from math import pi, cos >>> Fraction.from_float(cos(pi/3)) - Fraction(4503599627370497L, 9007199254740992L) + Fraction(4503599627370497, 9007199254740992) >>> Fraction.from_float(cos(pi/3)).limit_denominator() - Fraction(1L, 2L) + Fraction(1, 2) .. method:: __floor__() - Returns the greatest :class:`int` ``<= self``. Will be accessible through - :func:`math.floor` in Py3k. + Returns the greatest :class:`int` ``<= self``. This method can + also be accessed through the :func:`math.floor` function: + + >>> from math import floor + >>> floor(Fraction(355, 113)) + 3 .. method:: __ceil__() - Returns the least :class:`int` ``>= self``. Will be accessible through - :func:`math.ceil` in Py3k. + Returns the least :class:`int` ``>= self``. This method can + also be accessed through the :func:`math.ceil` function. .. method:: __round__() __round__(ndigits) - The first version returns the nearest :class:`int` to ``self``, rounding - half to even. The second version rounds ``self`` to the nearest multiple - of ``Fraction(1, 10**ndigits)`` (logically, if ``ndigits`` is negative), - again rounding half toward even. Will be accessible through :func:`round` - in Py3k. + The first version returns the nearest :class:`int` to ``self``, + rounding half to even. The second version rounds ``self`` to the + nearest multiple of ``Fraction(1, 10**ndigits)`` (logically, if + ``ndigits`` is negative), again rounding half toward even. This + method can also be accessed through the :func:`round` function. + + +.. function:: gcd(a, b) + + Return the greatest common divisor of the integers `a` and `b`. If + either `a` or `b` is nonzero, then the absolute value of `gcd(a, + b)` is the largest integer that divides both `a` and `b`. `gcd(a,b)` + has the same sign as `b` if `b` is nonzero; otherwise it takes the sign + of `a`. `gcd(0, 0)` returns `0`. .. seealso:: Modified: python/branches/py3k-urllib/Doc/library/http.client.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/http.client.rst (original) +++ python/branches/py3k-urllib/Doc/library/http.client.rst Tue Jul 1 06:02:29 2008 @@ -13,8 +13,7 @@ This module defines classes which implement the client side of the HTTP and HTTPS protocols. It is normally not used directly --- the module -:mod:`urllib.request` -uses it to handle URLs that use HTTP and HTTPS. +:mod:`urllib.request` uses it to handle URLs that use HTTP and HTTPS. .. note:: Modified: python/branches/py3k-urllib/Doc/library/http.cookiejar.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/http.cookiejar.rst (original) +++ python/branches/py3k-urllib/Doc/library/http.cookiejar.rst Tue Jul 1 06:02:29 2008 @@ -100,7 +100,7 @@ .. seealso:: - Module :mod:`urllib2` + Module :mod:`urllib.request` URL opening with automatic cookie handling. Module :mod:`http.cookies` @@ -149,11 +149,11 @@ the :class:`CookieJar`'s :class:`CookiePolicy` instance are true and false respectively), the :mailheader:`Cookie2` header is also added when appropriate. - The *request* object (usually a :class:`urllib2.Request` instance) must support - the methods :meth:`get_full_url`, :meth:`get_host`, :meth:`get_type`, - :meth:`unverifiable`, :meth:`get_origin_req_host`, :meth:`has_header`, - :meth:`get_header`, :meth:`header_items`, and :meth:`add_unredirected_header`,as - documented by :mod:`urllib2`. + The *request* object (usually a :class:`urllib.request..Request` instance) + must support the methods :meth:`get_full_url`, :meth:`get_host`, + :meth:`get_type`, :meth:`unverifiable`, :meth:`get_origin_req_host`, + :meth:`has_header`, :meth:`get_header`, :meth:`header_items`, and + :meth:`add_unredirected_header`, as documented by :mod:`urllib.request`. .. method:: CookieJar.extract_cookies(response, request) @@ -166,14 +166,15 @@ as appropriate (subject to the :meth:`CookiePolicy.set_ok` method's approval). The *response* object (usually the result of a call to - :meth:`urllib2.urlopen`, or similar) should support an :meth:`info` method, - which returns a :class:`email.message.Message` instance. + :meth:`urllib.request.urlopen`, or similar) should support an :meth:`info` + method, which returns a :class:`email.message.Message` instance. - The *request* object (usually a :class:`urllib2.Request` instance) must support - the methods :meth:`get_full_url`, :meth:`get_host`, :meth:`unverifiable`, and - :meth:`get_origin_req_host`, as documented by :mod:`urllib2`. The request is - used to set default values for cookie-attributes as well as for checking that - the cookie is allowed to be set. + The *request* object (usually a :class:`urllib.request.Request` instance) + must support the methods :meth:`get_full_url`, :meth:`get_host`, + :meth:`unverifiable`, and :meth:`get_origin_req_host`, as documented by + :mod:`urllib.request`. The request is used to set default values for + cookie-attributes as well as for checking that the cookie is allowed to be + set. .. method:: CookieJar.set_policy(policy) @@ -715,18 +716,18 @@ The first example shows the most common usage of :mod:`http.cookiejar`:: - import http.cookiejar, urllib2 + import http.cookiejar, urllib.request cj = http.cookiejar.CookieJar() - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") This example illustrates how to open a URL using your Netscape, Mozilla, or Lynx cookies (assumes Unix/Netscape convention for location of the cookies file):: - import os, http.cookiejar, urllib2 + import os, http.cookiejar, urllib.request cj = http.cookiejar.MozillaCookieJar() cj.load(os.path.join(os.environ["HOME"], ".netscape/cookies.txt")) - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") The next example illustrates the use of :class:`DefaultCookiePolicy`. Turn on @@ -734,12 +735,12 @@ Netscape cookies, and block some domains from setting cookies or having them returned:: - import urllib2 + import urllib.request from http.cookiejar import CookieJar, DefaultCookiePolicy policy = DefaultCookiePolicy( rfc2965=True, strict_ns_domain=Policy.DomainStrict, blocked_domains=["ads.net", ".ads.net"]) cj = CookieJar(policy) - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) + opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/") Modified: python/branches/py3k-urllib/Doc/library/multiprocessing.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/multiprocessing.rst (original) +++ python/branches/py3k-urllib/Doc/library/multiprocessing.rst Tue Jul 1 06:02:29 2008 @@ -4,81 +4,24 @@ .. module:: multiprocessing :synopsis: Process-based "threading" interface. -:mod:`multiprocessing` is a package for the Python language which supports the -spawning of processes using a similar API of the :mod:`threading` module. It -runs on both Unix and Windows. - -The :mod:`multiprocessing` module offers the capability of both local and remote -concurrency effectively side-stepping the Global Interpreter Lock by utilizing -subprocesses for "threads". Due to this, the :mod:`multiprocessing` module -allows the programmer to fully leverage multiple processors on a given machine. - Introduction ------------- - - -Threads, processes and the GIL -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To run more than one piece of code at the same time on the same computer one has -the choice of either using multiple processes or multiple threads. +---------------------- -Although a program can be made up of multiple processes, these processes are in -effect completely independent of one another: different processes are not able -to cooperate with one another unless one sets up some means of communication -between them (such as by using sockets). If a lot of data must be transferred -between processes then this can be inefficient. - -On the other hand, multiple threads within a single process are intimately -connected: they share their data but often can interfere badly with one another. -It is often argued that the only way to make multithreaded programming "easy" is -to avoid relying on any shared state and for the threads to only communicate by -passing messages to each other. - -CPython has a *Global Interpreter Lock* (GIL) which in many ways makes threading -easier than it is in most languages by making sure that only one thread can -manipulate the interpreter's objects at a time. As a result, it is often safe -to let multiple threads access data without using any additional locking as one -would need to in a language such as C. - -One downside of the GIL is that on multi-processor (or multi-core) systems a -multithreaded Python program can only make use of one processor at a time unless -your application makes heavy use of I/O which effectively side-steps this. This -is a problem that can be overcome by using multiple processes instead. - -This package allows one to write multi-process programs using much the same API -that one uses for writing threaded programs. - - -Forking and spawning -~~~~~~~~~~~~~~~~~~~~ - -There are two ways of creating a new process in Python: - -* The current process can *fork* a new child process by using the - :func:`os.fork` function. This effectively creates an identical copy of the - current process which is now able to go off and perform some task set by the - parent process. This means that the child process inherits *copies* of all - variables that the parent process had. However, :func:`os.fork` is not - available on every platform: in particular Windows does not support it. - -* Alternatively, the current process can spawn a completely new Python - interpreter by using the :mod:`subprocess` module or one of the - :func:`os.spawn*` functions. Getting this new interpreter in to a fit state - to perform the task set for it by its parent process is, however, a bit of a - challenge. - -The :mod:`multiprocessing` module uses :func:`os.fork` if it is available since -it makes life a lot simpler. Forking the process is also more efficient in -terms of memory usage and the time needed to create the new process. +:mod:`multiprocessing` is a package that supports spawning processes using an +API similar to the :mod:`threading` module. The :mod:`multiprocessing` package +offers both local and remote concurrency, effectively side-stepping the +:term:`Global Interpreter Lock` by using subprocesses instead of threads. Due +to this, the :mod:`multiprocessing` module allows the programmer to fully +leverage multiple processors on a given machine. It runs on both Unix and +Windows. The :class:`Process` class ~~~~~~~~~~~~~~~~~~~~~~~~~~ In :mod:`multiprocessing`, processes are spawned by creating a :class:`Process` -object and then calling its :meth:`Process.start` method. :class:`Process` +object and then calling its :meth:`~Process.start` method. :class:`Process` follows the API of :class:`threading.Thread`. A trivial example of a multiprocess program is :: @@ -107,7 +50,7 @@ **Queues** - The :class:`Queue` class is a near clone of :class:`Queue.Queue`. For + The :class:`Queue` class is a near clone of :class:`queue.Queue`. For example:: from multiprocessing import Process, Queue @@ -143,11 +86,12 @@ p.join() The two connection objects returned by :func:`Pipe` represent the two ends of - the pipe. Each connection object has :meth:`send` and :meth:`recv` methods - (among others). Note that data in a pipe may become corrupted if two - processes (or threads) try to read from or write to the *same* end of the - pipe at the same time. Of course there is no risk of corruption from - processes using different ends of the pipe at the same time. + the pipe. Each connection object has :meth:`~Connection.send` and + :meth:`~Connection.recv` methods (among others). Note that data in a pipe + may become corrupted if two processes (or threads) try to read from or write + to the *same* end of the pipe at the same time. Of course there is no risk + of corruption from processes using different ends of the pipe at the same + time. Synchronization between processes @@ -268,7 +212,7 @@ Using a pool of workers ~~~~~~~~~~~~~~~~~~~~~~~ -The :class:`multiprocessing.pool.Pool()` class represens a pool of worker +The :class:`~multiprocessing.pool.Pool` class represents a pool of worker processes. It has methods which allows tasks to be offloaded to the worker processes in a few different ways. @@ -303,9 +247,9 @@ :class:`threading.Thread`. The constructor should always be called with keyword arguments. *group* - should always be ``None``; it exists soley for compatibility with - :class:`threading.Thread`. *target* is the callable object to be invoked by - the :meth:`run()` method. It defaults to None, meaning nothing is + should always be ``None``; it exists solely for compatibility with + :class:`~threading.Thread`. *target* is the callable object to be invoked by + the :meth:`run()` method. It defaults to ``None``, meaning nothing is called. *name* is the process name. By default, a unique name is constructed of the form 'Process-N\ :sub:`1`:N\ :sub:`2`:...:N\ :sub:`k`' where N\ :sub:`1`,N\ :sub:`2`,...,N\ :sub:`k` is a sequence of integers whose length @@ -413,11 +357,11 @@ Set the process's authentication key which must be a byte string. - .. method:: terminate()` + .. method:: terminate() - Terminate the process. On Unix this is done using the ``SIGTERM`` signal, - on Windows ``TerminateProcess()`` is used. Note that exit handlers and - finally clauses etc will not be executed. + Terminate the process. On Unix this is done using the ``SIGTERM`` signal; + on Windows :cfunc:`TerminateProcess` is used. Note that exit handlers and + finally clauses, etc., will not be executed. Note that descendant processes of the process will *not* be terminated -- they will simply become orphaned. @@ -470,22 +414,25 @@ processes) or a queue (which allows multiple producers and consumers). The :class:`Queue` and :class:`JoinableQueue` types are multi-producer, -multi-consumer FIFO queues modelled on the :class:`Queue.Queue` class in the +multi-consumer FIFO queues modelled on the :class:`queue.Queue` class in the standard library. They differ in that :class:`Queue` lacks the -:meth:`task_done` and :meth:`join` methods introduced into Python 2.5's -:class:`Queue.Queue` class. +:meth:`~queue.Queue.task_done` and :meth:`~queue.Queue.join` methods introduced +into Python 2.5's :class:`queue.Queue` class. If you use :class:`JoinableQueue` then you **must** call :meth:`JoinableQueue.task_done` for each task removed from the queue or else the semaphore used to count the number of unfinished tasks may eventually overflow raising an exception. +Note that one can also create a shared queue by using a manager object -- see +:ref:`multiprocessing-managers`. + .. note:: - :mod:`multiprocessing` uses the usual :exc:`Queue.Empty` and - :exc:`Queue.Full` exceptions to signal a timeout. They are not available in + :mod:`multiprocessing` uses the usual :exc:`queue.Empty` and + :exc:`queue.Full` exceptions to signal a timeout. They are not available in the :mod:`multiprocessing` namespace so you need to import them from - :mod:`Queue`. + :mod:`queue`. .. warning:: @@ -509,9 +456,6 @@ Note that a queue created using a manager does not have this issue. See :ref:`multiprocessing-programming`. -Note that one can also create a shared queue by using a manager object -- see -:ref:`multiprocessing-managers`. - For an example of the usage of queues for interprocess communication see :ref:`multiprocessing-examples`. @@ -533,11 +477,11 @@ locks/semaphores. When a process first puts an item on the queue a feeder thread is started which transfers objects from a buffer into the pipe. - The usual :exc:`Queue.Empty` and :exc:`Queue.Full` exceptions from the + The usual :exc:`queue.Empty` and :exc:`queue.Full` exceptions from the standard library's :mod:`Queue` module are raised to signal timeouts. - :class:`Queue` implements all the methods of :class:`Queue.Queue` except for - :meth:`task_done` and :meth:`join`. + :class:`Queue` implements all the methods of :class:`queue.Queue` except for + :meth:`~queue.Queue.task_done` and :meth:`~queue.Queue.join`. .. method:: qsize() @@ -557,15 +501,15 @@ Return ``True`` if the queue is full, ``False`` otherwise. Because of multithreading/multiprocessing semantics, this is not reliable. - .. method:: put(item[, block[, timeout]])` + .. method:: put(item[, block[, timeout]]) - Put item into the queue. If optional args *block* is ``True`` (the - default) and *timeout* is ``None`` (the default), block if necessary until + Put item into the queue. If the optional argument *block* is ``True`` + (the default) and *timeout* is ``None`` (the default), block if necessary until a free slot is available. If *timeout* is a positive number, it blocks at - most *timeout* seconds and raises the :exc:`Queue.Full` exception if no + most *timeout* seconds and raises the :exc:`queue.Full` exception if no free slot was available within that time. Otherwise (*block* is ``False``), put an item on the queue if a free slot is immediately - available, else raise the :exc:`Queue.Full` exception (*timeout* is + available, else raise the :exc:`queue.Full` exception (*timeout* is ignored in that case). .. method:: put_nowait(item) @@ -577,10 +521,10 @@ Remove and return an item from the queue. If optional args *block* is ``True`` (the default) and *timeout* is ``None`` (the default), block if necessary until an item is available. If *timeout* is a positive number, - it blocks at most *timeout* seconds and raises the :exc:`Queue.Empty` + it blocks at most *timeout* seconds and raises the :exc:`queue.Empty` exception if no item was available within that time. Otherwise (block is ``False``), return an item if one is immediately available, else raise the - :exc:`Queue.Empty` exception (*timeout* is ignored in that case). + :exc:`queue.Empty` exception (*timeout* is ignored in that case). .. method:: get_nowait() get_no_wait() @@ -588,7 +532,7 @@ Equivalent to ``get(False)``. :class:`multiprocessing.Queue` has a few additional methods not found in - :class:`Queue.Queue` which are usually unnecessary: + :class:`queue.Queue` which are usually unnecessary: .. method:: close() @@ -605,13 +549,13 @@ By default if a process is not the creator of the queue then on exit it will attempt to join the queue's background thread. The process can call - :meth:`cancel_join_thread()` to make :meth:`join_thread()` do nothing. + :meth:`cancel_join_thread` to make :meth:`join_thread` do nothing. .. method:: cancel_join_thread() Prevent :meth:`join_thread` from blocking. In particular, this prevents the background thread from being joined automatically when the process - exits -- see :meth:`join_thread()`. + exits -- see :meth:`join_thread`. .. class:: JoinableQueue([maxsize]) @@ -622,13 +566,13 @@ .. method:: task_done() Indicate that a formerly enqueued task is complete. Used by queue consumer - threads. For each :meth:`get` used to fetch a task, a subsequent call to - :meth:`task_done` tells the queue that the processing on the task is - complete. - - If a :meth:`join` is currently blocking, it will resume when all items - have been processed (meaning that a :meth:`task_done` call was received - for every item that had been :meth:`put` into the queue). + threads. For each :meth:`~Queue.get` used to fetch a task, a subsequent + call to :meth:`task_done` tells the queue that the processing on the task + is complete. + + If a :meth:`~Queue.join` is currently blocking, it will resume when all + items have been processed (meaning that a :meth:`task_done` call was + received for every item that had been :meth:`~Queue.put` into the queue). Raises a :exc:`ValueError` if called more times than there were items placed in the queue. @@ -642,7 +586,7 @@ queue. The count goes down whenever a consumer thread calls :meth:`task_done` to indicate that the item was retrieved and all work on it is complete. When the count of unfinished tasks drops to zero, - :meth:`join` unblocks. + :meth:`~Queue.join` unblocks. Miscellaneous @@ -684,17 +628,17 @@ freeze_support() Process(target=f).start() - If the :func:`freeze_support()` line is missed out then trying to run the - frozen executable will raise :exc:`RuntimeError`. + If the ``freeze_support()`` line is missed out then trying to run the frozen + executable will raise :exc:`RuntimeError`. If the module is being run normally by the Python interpreter then - :func:`freeze_support()` has no effect. + :func:`freeze_support` has no effect. .. function:: set_executable() Sets the path of the python interpreter to use when starting a child process. - (By default `sys.executable` is used). Embedders will probably need to do - some thing like :: + (By default :data:`sys.executable` is used). Embedders will probably need to + do some thing like :: setExecutable(os.path.join(sys.exec_prefix, 'pythonw.exe')) @@ -715,7 +659,7 @@ Connection objects allow the sending and receiving of picklable objects or strings. They can be thought of as message oriented connected sockets. -Connection objects usually created using :func:`Pipe()` -- see also +Connection objects usually created using :func:`Pipe` -- see also :ref:`multiprocessing-listeners-clients`. .. class:: Connection @@ -812,9 +756,10 @@ receives, which can be a security risk unless you can trust the process which sent the message. - Therefore, unless the connection object was produced using :func:`Pipe()` - you should only use the `recv()` and `send()` methods after performing some - sort of authentication. See :ref:`multiprocessing-auth-keys`. + Therefore, unless the connection object was produced using :func:`Pipe` you + should only use the :meth:`~Connection.recv` and :meth:`~Connection.send` + methods after performing some sort of authentication. See + :ref:`multiprocessing-auth-keys`. .. warning:: @@ -827,8 +772,8 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~ Generally synchronization primitives are not as necessary in a multiprocess -program as they are in a mulithreaded program. See the documentation for the -standard library's :mod:`threading` module. +program as they are in a mulithreaded program. See the documentation for +:mod:`threading` module. Note that one can also create synchronization primitives by using a manager object -- see :ref:`multiprocessing-managers`. @@ -842,7 +787,7 @@ .. class:: Condition([lock]) - A condition variable: a clone of `threading.Condition`. + A condition variable: a clone of :class:`threading.Condition`. If *lock* is specified then it should be a :class:`Lock` or :class:`RLock` object from :mod:`multiprocessing`. @@ -865,7 +810,7 @@ .. note:: - The :meth:`acquire()` method of :class:`BoundedSemaphore`, :class:`Lock`, + The :meth:`acquire` method of :class:`BoundedSemaphore`, :class:`Lock`, :class:`RLock` and :class:`Semaphore` has a timeout parameter not supported by the equivalents in :mod:`threading`. The signature is ``acquire(block=True, timeout=None)`` with keyword parameters being @@ -891,7 +836,7 @@ It is possible to create shared objects using shared memory which can be inherited by child processes. -.. function:: Value(typecode_or_type[, lock[, *args]]) +.. function:: Value(typecode_or_type[, *args, lock]]) Return a :mod:`ctypes` object allocated from shared memory. By default the return value is actually a synchronized wrapper for the object. @@ -983,7 +928,7 @@ attributes which allow one to use it to store and retrieve strings -- see documentation for :mod:`ctypes`. -.. function:: Array(typecode_or_type, size_or_initializer[, lock[, *args]]) +.. function:: Array(typecode_or_type, size_or_initializer[, *args[, lock]]) The same as :func:`RawArray` except that depending on the value of *lock* a process-safe synchronization wrapper may be returned instead of a raw ctypes @@ -1025,11 +970,11 @@ :class:`multiprocessing.RLock` object is created automatically. A synchronized wrapper will have two methods in addition to those of the - object it wraps: :meth:`get_obj()` returns the wrapped object and - :meth:`get_lock()` returns the lock object used for synchronization. + object it wraps: :meth:`get_obj` returns the wrapped object and + :meth:`get_lock` returns the lock object used for synchronization. Note that accessing the ctypes object through the wrapper can be a lot slower - han accessing the raw ctypes object. + than accessing the raw ctypes object. The table below compares the syntax for creating shared ctypes objects from @@ -1105,10 +1050,10 @@ .. function:: multiprocessing.Manager() - Returns a started :class:`SyncManager` object which can be used for sharing - objects between processes. The returned manager object corresponds to a - spawned child process and has methods which will create shared objects and - return corresponding proxies. + Returns a started :class:`~multiprocessing.managers.SyncManager` object which + can be used for sharing objects between processes. The returned manager + object corresponds to a spawned child process and has methods which will + create shared objects and return corresponding proxies. .. module:: multiprocessing.managers :synopsis: Share data between process with shared objects. @@ -1148,7 +1093,7 @@ .. method:: shutdown() Stop the process used by the manager. This is only available if - meth:`start` has been used to start the server process. + :meth:`start` has been used to start the server process. This can be called multiple times. @@ -1162,12 +1107,12 @@ *callable* is a callable used for creating objects for this type identifier. If a manager instance will be created using the - :meth:`from_address()` classmethod or if the *create_method* argument is + :meth:`from_address` classmethod or if the *create_method* argument is ``False`` then this can be left as ``None``. - *proxytype* is a subclass of :class:`multiprocessing.managers.BaseProxy` - which is used to create proxies for shared objects with this *typeid*. If - ``None`` then a proxy class is created automatically. + *proxytype* is a subclass of :class:`BaseProxy` which is used to create + proxies for shared objects with this *typeid*. If ``None`` then a proxy + class is created automatically. *exposed* is used to specify a sequence of method names which proxies for this typeid should be allowed to access using @@ -1175,7 +1120,7 @@ :attr:`proxytype._exposed_` is used instead if it exists.) In the case where no exposed list is specified, all "public methods" of the shared object will be accessible. (Here a "public method" means any attribute - which has a ``__call__()`` method and whose name does not begin with + which has a :meth:`__call__` method and whose name does not begin with ``'_'``.) *method_to_typeid* is a mapping used to specify the return type of those @@ -1200,7 +1145,7 @@ A subclass of :class:`BaseManager` which can be used for the synchronization of processes. Objects of this type are returned by - :func:`multiprocessing.Manager()`. + :func:`multiprocessing.Manager`. It also supports creation of shared lists and dictionaries. @@ -1231,7 +1176,7 @@ .. method:: Queue([maxsize]) - Create a shared `Queue.Queue` object and return a proxy for it. + Create a shared :class:`queue.Queue` object and return a proxy for it. .. method:: RLock() @@ -1244,7 +1189,7 @@ .. method:: Array(typecode, sequence) - Create an array and return a proxy for it. (*format* is ignored.) + Create an array and return a proxy for it. .. method:: Value(typecode, value) @@ -1285,8 +1230,8 @@ >>>>>>>>>>>>>>>>>>> To create one's own manager, one creates a subclass of :class:`BaseManager` and -use the :meth:`resgister()` classmethod to register new types or callables with -the manager class. For example:: +use the :meth:`~BaseManager.resgister` classmethod to register new types or +callables with the manager class. For example:: from multiprocessing.managers import BaseManager @@ -1319,8 +1264,8 @@ remote clients can access:: >>> from multiprocessing.managers import BaseManager - >>> import Queue - >>> queue = Queue.Queue() + >>> import queue + >>> queue = queue.Queue() >>> class QueueManager(BaseManager): pass ... >>> QueueManager.register('getQueue', callable=lambda:queue) @@ -1385,7 +1330,7 @@ >>> a = manager.list() >>> b = manager.list() - >>> a.append(b) # referent of `a` now contains referent of `b` + >>> a.append(b) # referent of a now contains referent of b >>> print a, b [[]] [] >>> b.append('hello') @@ -1432,7 +1377,7 @@ Note in particular that an exception will be raised if *methodname* has not been *exposed* - An example of the usage of :meth:`_call_method()`:: + An example of the usage of :meth:`_call_method`:: >>> l = manager.list(range(10)) >>> l._call_method('__len__') @@ -1476,7 +1421,7 @@ :synopsis: Create pools of processes. One can create a pool of processes which will carry out tasks submitted to it -with the :class:`Pool` class in :mod:`multiprocess.pool`. +with the :class:`Pool` class. .. class:: multiprocessing.Pool([processes[, initializer[, initargs]]]) @@ -1514,7 +1459,7 @@ .. method:: map_async(func, iterable[, chunksize[, callback]]) - A variant of the :meth:`.map` method which returns a result object. + A variant of the :meth:`map` method which returns a result object. If *callback* is specified then it should be a callable which accepts a single argument. When the result becomes ready *callback* is applied to @@ -1622,7 +1567,7 @@ However, the :mod:`multiprocessing.connection` module allows some extra flexibility. It basically gives a high level message oriented API for dealing with sockets or Windows named pipes, and also has support for *digest -authentication* using the :mod:`hmac` module from the standard library. +authentication* using the :mod:`hmac` module. .. function:: deliver_challenge(connection, authkey) @@ -1645,7 +1590,7 @@ .. function:: Client(address[, family[, authenticate[, authkey]]]) Attempt to set up a connection to the listener which is using address - *address*, returning a :class:`Connection`. + *address*, returning a :class:`~multiprocessing.Connection`. The type of the connection is determined by *family* argument, but this can generally be omitted since it can usually be inferred from the format of @@ -1721,15 +1666,6 @@ Exception raised when there is an authentication error. -.. exception:: BufferTooShort - - Exception raise by the :meth:`Connection.recv_bytes_into` method of a - connection object when the supplied buffer object is too small for the - message read. - - If *e* is an instance of :exc:`BufferTooShort` then ``e.args[0]`` will give - the message as a byte string. - **Examples** @@ -1780,10 +1716,10 @@ Address Formats >>>>>>>>>>>>>>> -* An ``'AF_INET'`` address is a tuple of the form ``(hostname, port)``` where +* An ``'AF_INET'`` address is a tuple of the form ``(hostname, port)`` where *hostname* is a string and *port* is an integer. -* An ``'AF_UNIX'``` address is a string representing a filename on the +* An ``'AF_UNIX'`` address is a string representing a filename on the filesystem. * An ``'AF_PIPE'`` address is a string of the form @@ -1812,11 +1748,11 @@ If authentication is requested but do authentication key is specified then the return value of ``current_process().get_auth_key`` is used (see -:class:`Process`). This value will automatically inherited by any -:class:`Process` object that the current process creates. This means that (by -default) all processes of a multi-process program will share a single -authentication key which can be used when setting up connections between the -themselves. +:class:`~multiprocessing.Process`). This value will automatically inherited by +any :class:`~multiprocessing.Process` object that the current process creates. +This means that (by default) all processes of a multi-process program will share +a single authentication key which can be used when setting up connections +between the themselves. Suitable authentication keys can also be generated by using :func:`os.urandom`. @@ -1866,7 +1802,7 @@ :synopsis: Dumb wrapper around threading. :mod:`multiprocessing.dummy` replicates the API of :mod:`multiprocessing` but is -no more than a wrapper around the `threading` module. +no more than a wrapper around the :mod:`threading` module. .. _multiprocessing-programming: @@ -1912,7 +1848,7 @@ Better to inherit than pickle/unpickle - On Windows many of types from :mod:`multiprocessing` need to be picklable so + On Windows many types from :mod:`multiprocessing` need to be picklable so that child processes can use them. However, one should generally avoid sending shared objects to other processes using pipes or queues. Instead you should arrange the program so that a process which need access to a @@ -1926,8 +1862,7 @@ processes. Therefore it is probably best to only consider using - :meth:`Process.terminate()` on processes which never use any shared - resources. + :meth:`Process.terminate` on processes which never use any shared resources. Joining processes that use queues @@ -1959,7 +1894,7 @@ A fix here would be to swap the last two lines round (or simply remove the ``p.join()`` line). -Explicity pass resources to child processes +Explicitly pass resources to child processes On Unix a child process can make use of a shared resource created in a parent process using a global resource. However, it is better to pass the @@ -2050,7 +1985,7 @@ p = Process(target=foo) p.start() - (The :func:`freeze_support()` line can be omitted if the program will be run + (The ``freeze_support()`` line can be omitted if the program will be run normally instead of frozen.) This allows the newly spawned Python interpreter to safely import the module Modified: python/branches/py3k-urllib/Doc/library/operator.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/operator.rst (original) +++ python/branches/py3k-urllib/Doc/library/operator.rst Tue Jul 1 06:02:29 2008 @@ -210,24 +210,12 @@ Remove the value of *a* at index *b*. -.. function:: delslice(a, b, c) - __delslice__(a, b, c) - - Delete the slice of *a* from index *b* to index *c-1*. - - .. function:: getitem(a, b) __getitem__(a, b) Return the value of *a* at index *b*. -.. function:: getslice(a, b, c) - __getslice__(a, b, c) - - Return the slice of *a* from index *b* to index *c-1*. - - .. function:: indexOf(a, b) Return the index of the first of occurrence of *b* in *a*. @@ -245,12 +233,6 @@ Set the value of *a* at index *b* to *c*. -.. function:: setslice(a, b, c, v) - __setslice__(a, b, c, v) - - Set the slice of *a* from index *b* to index *c-1* to the sequence *v*. - - Many operations have an "in-place" version. The following functions provide a more primitive access to in-place operators than the usual syntax does; for example, the :term:`statement` ``x += y`` is equivalent to @@ -533,12 +515,6 @@ +-----------------------+-------------------------+---------------------------------+ | Sequence Repitition | ``seq * i`` | ``repeat(seq, i)`` | +-----------------------+-------------------------+---------------------------------+ -| Slice Assignment | ``seq[i:j] = values`` | ``setslice(seq, i, j, values)`` | -+-----------------------+-------------------------+---------------------------------+ -| Slice Deletion | ``del seq[i:j]`` | ``delslice(seq, i, j)`` | -+-----------------------+-------------------------+---------------------------------+ -| Slicing | ``seq[i:j]`` | ``getslice(seq, i, j)`` | -+-----------------------+-------------------------+---------------------------------+ | String Formatting | ``s % obj`` | ``mod(s, obj)`` | +-----------------------+-------------------------+---------------------------------+ | Subtraction | ``a - b`` | ``sub(a, b)`` | Modified: python/branches/py3k-urllib/Doc/library/optparse.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/optparse.rst (original) +++ python/branches/py3k-urllib/Doc/library/optparse.rst Tue Jul 1 06:02:29 2008 @@ -636,9 +636,9 @@ option involved in the error; be sure to do the same when calling ``parser.error()`` from your application code. -If :mod:`optparse`'s default error-handling behaviour does not suite your needs, -you'll need to subclass OptionParser and override ``exit()`` and/or -:meth:`error`. +If :mod:`optparse`'s default error-handling behaviour does not suit your needs, +you'll need to subclass OptionParser and override its :meth:`exit` and/or +:meth:`error` methods. .. _optparse-putting-it-all-together: Modified: python/branches/py3k-urllib/Doc/library/pickle.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/pickle.rst (original) +++ python/branches/py3k-urllib/Doc/library/pickle.rst Tue Jul 1 06:02:29 2008 @@ -20,27 +20,15 @@ "unpickling" is the inverse operation, whereby a byte stream is converted back into an object hierarchy. Pickling (and unpickling) is alternatively known as "serialization", "marshalling," [#]_ or "flattening", however, to avoid -confusion, the terms used here are "pickling" and "unpickling". - -This documentation describes both the :mod:`pickle` module and the -:mod:`cPickle` module. +confusion, the terms used here are "pickling" and "unpickling".. Relationship to other Python modules ------------------------------------ -The :mod:`pickle` module has an optimized cousin called the :mod:`cPickle` -module. As its name implies, :mod:`cPickle` is written in C, so it can be up to -1000 times faster than :mod:`pickle`. However it does not support subclassing -of the :func:`Pickler` and :func:`Unpickler` classes, because in :mod:`cPickle` -these are functions, not classes. Most applications have no need for this -functionality, and can benefit from the improved performance of :mod:`cPickle`. -Other than that, the interfaces of the two modules are nearly identical; the -common interface is described in this manual and differences are pointed out -where necessary. In the following discussions, we use the term "pickle" to -collectively describe the :mod:`pickle` and :mod:`cPickle` modules. - -The data streams the two modules produce are guaranteed to be interchangeable. +The :mod:`pickle` module has an transparent optimizer (:mod:`_pickle`) written +in C. It is used whenever available. Otherwise the pure Python implementation is +used. Python has a more primitive serialization module called :mod:`marshal`, but in general :mod:`pickle` should always be the preferred way to serialize Python @@ -229,7 +217,7 @@ necessarily limited to) :exc:`AttributeError`, :exc:`EOFError`, :exc:`ImportError`, and :exc:`IndexError`. -The :mod:`pickle` module also exports two callables [#]_, :class:`Pickler` and +The :mod:`pickle` module also exports two callables, :class:`Pickler` and :class:`Unpickler`: @@ -305,11 +293,6 @@ ids" that may be referenced in a pickle data stream. See section :ref:`pickle-protocol` below for more details. - **Note:** the :meth:`noload` method is currently only available on - :class:`Unpickler` objects created with the :mod:`cPickle` module. - :mod:`pickle` module :class:`Unpickler`\ s do not have the :meth:`noload` - method. - What can be pickled and unpickled? ---------------------------------- @@ -535,7 +518,7 @@ objects are referenced by a "persistent id", which is just an arbitrary string of printable ASCII characters. The resolution of such names is not defined by the :mod:`pickle` module; it will delegate this resolution to user defined -functions on the pickler and unpickler. [#]_ +functions on the pickler and unpickler. To define external persistent id resolution, you need to set the :attr:`persistent_id` attribute of the pickler object and the @@ -600,15 +583,8 @@ j = up.load() print(j) -In the :mod:`cPickle` module, the unpickler's :attr:`persistent_load` attribute -can also be set to a Python list, in which case, when the unpickler reaches a -persistent id, the persistent id string will simply be appended to this list. -This functionality exists so that a pickle data stream can be "sniffed" for -object references without actually instantiating all the objects in a pickle. -[#]_ Setting :attr:`persistent_load` to a list is usually used in conjunction -with the :meth:`noload` method on the Unpickler. -.. BAW: Both pickle and cPickle support something called inst_persistent_id() +.. BAW: pickle supports something called inst_persistent_id() which appears to give unknown types a second shot at producing a persistent id. Since Jim Fulton can't remember why it was added or what it's for, I'm leaving it undocumented. @@ -625,32 +601,22 @@ By default, unpickling will import any class that it finds in the pickle data. You can control exactly what gets unpickled and what gets called by customizing -your unpickler. Unfortunately, exactly how you do this is different depending -on whether you're using :mod:`pickle` or :mod:`cPickle`. [#]_ +your unpickler. -In the :mod:`pickle` module, you need to derive a subclass from -:class:`Unpickler`, overriding the :meth:`load_global` method. -:meth:`load_global` should read two lines from the pickle data stream where the -first line will the name of the module containing the class and the second line -will be the name of the instance's class. It then looks up the class, possibly -importing the module and digging out the attribute, then it appends what it -finds to the unpickler's stack. Later on, this class will be assigned to the -:attr:`__class__` attribute of an empty class, as a way of magically creating an -instance without calling its class's :meth:`__init__`. Your job (should you -choose to accept it), would be to have :meth:`load_global` push onto the -unpickler's stack, a known safe version of any class you deem safe to unpickle. -It is up to you to produce such a class. Or you could raise an error if you -want to disallow all unpickling of instances. If this sounds like a hack, -you're right. Refer to the source code to make this work. - -Things are a little cleaner with :mod:`cPickle`, but not by much. To control -what gets unpickled, you can set the unpickler's :attr:`find_global` attribute -to a function or ``None``. If it is ``None`` then any attempts to unpickle -instances will raise an :exc:`UnpicklingError`. If it is a function, then it -should accept a module name and a class name, and return the corresponding class -object. It is responsible for looking up the class and performing any necessary -imports, and it may raise an error to prevent instances of the class from being -unpickled. +You need to derive a subclass from :class:`Unpickler`, overriding the +:meth:`load_global` method. :meth:`load_global` should read two lines from the +pickle data stream where the first line will the name of the module containing +the class and the second line will be the name of the instance's class. It then +looks up the class, possibly importing the module and digging out the attribute, +then it appends what it finds to the unpickler's stack. Later on, this class +will be assigned to the :attr:`__class__` attribute of an empty class, as a way +of magically creating an instance without calling its class's +:meth:`__init__`. Your job (should you choose to accept it), would be to have +:meth:`load_global` push onto the unpickler's stack, a known safe version of any +class you deem safe to unpickle. It is up to you to produce such a class. Or +you could raise an error if you want to disallow all unpickling of instances. +If this sounds like a hack, you're right. Refer to the source code to make this +work. The moral of the story is that you should be really careful about the source of the strings your application unpickles. @@ -777,48 +743,10 @@ High-performance serialization of built-in types. -:mod:`cPickle` --- A faster :mod:`pickle` -========================================= - -.. module:: cPickle - :synopsis: Faster version of pickle, but not subclassable. -.. moduleauthor:: Jim Fulton -.. sectionauthor:: Fred L. Drake, Jr. - - -.. index:: module: pickle - -The :mod:`cPickle` module supports serialization and de-serialization of Python -objects, providing an interface and functionality nearly identical to the -:mod:`pickle` module. There are several differences, the most important being -performance and subclassability. - -First, :mod:`cPickle` can be up to 1000 times faster than :mod:`pickle` because -the former is implemented in C. Second, in the :mod:`cPickle` module the -callables :func:`Pickler` and :func:`Unpickler` are functions, not classes. -This means that you cannot use them to derive custom pickling and unpickling -subclasses. Most applications have no need for this functionality and should -benefit from the greatly improved performance of the :mod:`cPickle` module. - -The pickle data stream produced by :mod:`pickle` and :mod:`cPickle` are -identical, so it is possible to use :mod:`pickle` and :mod:`cPickle` -interchangeably with existing pickles. [#]_ - -There are additional minor differences in API between :mod:`cPickle` and -:mod:`pickle`, however for most applications, they are interchangeable. More -documentation is provided in the :mod:`pickle` module documentation, which -includes a list of the documented differences. - .. rubric:: Footnotes .. [#] Don't confuse this with the :mod:`marshal` module -.. [#] In the :mod:`pickle` module these callables are classes, which you could - subclass to customize the behavior. However, in the :mod:`cPickle` module these - callables are factory functions and so cannot be subclassed. One common reason - to subclass is to control what objects can actually be unpickled. See section - :ref:`pickle-sub` for more details. - .. [#] *Warning*: this is intended for pickling multiple objects without intervening modifications to the objects or their parts. If you modify an object and then pickle it again using the same :class:`Pickler` instance, the object is not @@ -834,25 +762,3 @@ .. [#] This protocol is also used by the shallow and deep copying operations defined in the :mod:`copy` module. - -.. [#] The actual mechanism for associating these user defined functions is slightly - different for :mod:`pickle` and :mod:`cPickle`. The description given here - works the same for both implementations. Users of the :mod:`pickle` module - could also use subclassing to effect the same results, overriding the - :meth:`persistent_id` and :meth:`persistent_load` methods in the derived - classes. - -.. [#] We'll leave you with the image of Guido and Jim sitting around sniffing pickles - in their living rooms. - -.. [#] A word of caution: the mechanisms described here use internal attributes and - methods, which are subject to change in future versions of Python. We intend to - someday provide a common interface for controlling this behavior, which will - work in either :mod:`pickle` or :mod:`cPickle`. - -.. [#] Since the pickle data format is actually a tiny stack-oriented programming - language, and some freedom is taken in the encodings of certain objects, it is - possible that the two modules produce different data streams for the same input - objects. However it is guaranteed that they will always be able to read each - other's data streams. - Modified: python/branches/py3k-urllib/Doc/library/ssl.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/ssl.rst (original) +++ python/branches/py3k-urllib/Doc/library/ssl.rst Tue Jul 1 06:02:29 2008 @@ -129,7 +129,7 @@ method should signal unexpected EOF from the other end of the connection. If specified as :const:`True` (the default), it returns a normal EOF in response to unexpected EOF errors raised from the underlying socket; if :const:`False`, it will raise - the exceptions back the caller. + the exceptions back to the caller. .. function:: RAND_status() Modified: python/branches/py3k-urllib/Doc/reference/compound_stmts.rst ============================================================================== --- python/branches/py3k-urllib/Doc/reference/compound_stmts.rst (original) +++ python/branches/py3k-urllib/Doc/reference/compound_stmts.rst Tue Jul 1 06:02:29 2008 @@ -569,12 +569,13 @@ Foo = f1(arg)(f2(Foo)) **Programmer's note:** Variables defined in the class definition are class -can be set in a method with ``self.name = value``. Both class and instance -variables are accessible through the notation "``self.name``", and an instance -variable hides a class variable with the same name when accessed in this way. -Class variables can be used as defaults for instance variables, but using -mutable values there can lead to unexpected results. Descriptors can be used -to create instance variables with different implementation details. +variables; they are shared by instances. Instance variables can be set in a +method with ``self.name = value``. Both class and instance variables are +accessible through the notation "``self.name``", and an instance variable hides +a class variable with the same name when accessed in this way. Class variables +can be used as defaults for instance variables, but using mutable values there +can lead to unexpected results. Descriptors can be used to create instance +variables with different implementation details. .. XXX add link to descriptor docs above Modified: python/branches/py3k-urllib/Doc/tutorial/stdlib.rst ============================================================================== --- python/branches/py3k-urllib/Doc/tutorial/stdlib.rst (original) +++ python/branches/py3k-urllib/Doc/tutorial/stdlib.rst Tue Jul 1 06:02:29 2008 @@ -147,11 +147,11 @@ =============== There are a number of modules for accessing the internet and processing internet -protocols. Two of the simplest are :mod:`urllib.request` for retrieving data from urls -and :mod:`smtplib` for sending mail:: +protocols. Two of the simplest are :mod:`urllib.request` for retrieving data +from urls and :mod:`smtplib` for sending mail:: - >>> import urllib.request - >>> for line in urllib.request.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'): + >>> from urllib.request import urlopen + >>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'): ... if 'EST' in line or 'EDT' in line: # look for Eastern Time ... print(line) Modified: python/branches/py3k-urllib/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k-urllib/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k-urllib/Doc/whatsnew/2.6.rst Tue Jul 1 06:02:29 2008 @@ -521,6 +521,21 @@ .. ====================================================================== +.. _pep-0371: + +PEP 371: The ``multiprocessing`` Package +===================================================== + +XXX write this. + +.. seealso:: + + :pep:`371` - Per-user ``site-packages`` Directory + PEP written by Jesse Noller and Richard Oudkerk; + implemented by Jesse Noller. + +.. ====================================================================== + .. _pep-3101: PEP 3101: Advanced String Formatting Modified: python/branches/py3k-urllib/Include/bytesobject.h ============================================================================== --- python/branches/py3k-urllib/Include/bytesobject.h (original) +++ python/branches/py3k-urllib/Include/bytesobject.h Tue Jul 1 06:02:29 2008 @@ -91,8 +91,8 @@ see Objects/stringlib/localeutil.h */ PyAPI_FUNC(int) _PyBytes_InsertThousandsGrouping(char *buffer, - Py_ssize_t len, - char *plast, + Py_ssize_t n_buffer, + Py_ssize_t n_digits, Py_ssize_t buf_size, Py_ssize_t *count, int append_zero_char); Modified: python/branches/py3k-urllib/Include/patchlevel.h ============================================================================== --- python/branches/py3k-urllib/Include/patchlevel.h (original) +++ python/branches/py3k-urllib/Include/patchlevel.h Tue Jul 1 06:02:29 2008 @@ -19,11 +19,11 @@ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 0 #define PY_MICRO_VERSION 0 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA -#define PY_RELEASE_SERIAL 5 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.0a5+" +#define PY_VERSION "3.0b1+" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ Modified: python/branches/py3k-urllib/Include/pymem.h ============================================================================== --- python/branches/py3k-urllib/Include/pymem.h (original) +++ python/branches/py3k-urllib/Include/pymem.h Tue Jul 1 06:02:29 2008 @@ -85,14 +85,18 @@ */ #define PyMem_New(type, n) \ - ( (type *) PyMem_Malloc((n) * sizeof(type)) ) + ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) #define PyMem_NEW(type, n) \ - ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) + ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) #define PyMem_Resize(p, type, n) \ - ( (p) = (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) + ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( (p) = (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) ) #define PyMem_RESIZE(p, type, n) \ - ( (p) = (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) + ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( (p) = (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) ) /* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. Modified: python/branches/py3k-urllib/Include/pyport.h ============================================================================== --- python/branches/py3k-urllib/Include/pyport.h (original) +++ python/branches/py3k-urllib/Include/pyport.h Tue Jul 1 06:02:29 2008 @@ -106,6 +106,17 @@ # error "Python needs a typedef for Py_ssize_t in pyport.h." #endif +/* Largest possible value of size_t. + SIZE_MAX is part of C99, so it might be defined on some + platforms. If it is not defined, (size_t)-1 is a portable + definition for C89, due to the way signed->unsigned + conversion is defined. */ +#ifdef SIZE_MAX +#define PY_SIZE_MAX SIZE_MAX +#else +#define PY_SIZE_MAX ((size_t)-1) +#endif + /* Largest positive value of type Py_ssize_t. */ #define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) /* Smallest negative value of type Py_ssize_t. */ Modified: python/branches/py3k-urllib/Include/unicodeobject.h ============================================================================== --- python/branches/py3k-urllib/Include/unicodeobject.h (original) +++ python/branches/py3k-urllib/Include/unicodeobject.h Tue Jul 1 06:02:29 2008 @@ -1458,8 +1458,8 @@ see Objects/stringlib/localeutil.h */ PyAPI_FUNC(int) _PyUnicode_InsertThousandsGrouping(Py_UNICODE *buffer, - Py_ssize_t len, - Py_UNICODE *plast, + Py_ssize_t n_buffer, + Py_ssize_t n_digits, Py_ssize_t buf_size, Py_ssize_t *count, int append_zero_char); Modified: python/branches/py3k-urllib/Lib/distutils/__init__.py ============================================================================== --- python/branches/py3k-urllib/Lib/distutils/__init__.py (original) +++ python/branches/py3k-urllib/Lib/distutils/__init__.py Tue Jul 1 06:02:29 2008 @@ -20,5 +20,5 @@ # #--start constants-- -__version__ = "3.0a5" +__version__ = "3.0b1" #--end constants-- Modified: python/branches/py3k-urllib/Lib/http/cookiejar.py ============================================================================== --- python/branches/py3k-urllib/Lib/http/cookiejar.py (original) +++ python/branches/py3k-urllib/Lib/http/cookiejar.py Tue Jul 1 06:02:29 2008 @@ -1305,7 +1305,7 @@ return attrs def add_cookie_header(self, request): - """Add correct Cookie: header to request (urllib2.Request object). + """Add correct Cookie: header to request (urllib.request.Request object). The Cookie2 header is also added unless policy.hide_cookie2 is true. Modified: python/branches/py3k-urllib/Lib/http/server.py ============================================================================== --- python/branches/py3k-urllib/Lib/http/server.py (original) +++ python/branches/py3k-urllib/Lib/http/server.py Tue Jul 1 06:02:29 2008 @@ -13,9 +13,7 @@ This class implements GET and POST requests to cgi-bin scripts. If the os.fork() function is not present (e.g. on Windows), -os.popen2() is used as a fallback, with slightly altered semantics; if -that function is not present either (e.g. on Macintosh), only Python -scripts are supported, and they are executed by the current process. +subprocess.Popen() is used as a fallback, with slightly altered semantics. In all cases, the implementation is intentionally naive -- all requests are executed synchronously. @@ -826,8 +824,6 @@ # Determine platform specifics have_fork = hasattr(os, 'fork') - have_popen2 = hasattr(os, 'popen2') - have_popen3 = hasattr(os, 'popen3') # Make rfile unbuffered -- we need to read one line and then pass # the rest to a subprocess, so we can't use buffered input. @@ -929,10 +925,6 @@ return ispy = self.is_python(scriptname) if not ispy: - if not (self.have_fork or self.have_popen2 or self.have_popen3): - self.send_error(403, "CGI script is not a Python script (%r)" % - scriptname) - return if not self.is_executable(scriptfile): self.send_error(403, "CGI script is not executable (%r)" % scriptname) @@ -1041,13 +1033,9 @@ self.server.handle_error(self.request, self.client_address) os._exit(127) - elif self.have_popen2 or self.have_popen3: - # Windows -- use popen2 or popen3 to create a subprocess - import shutil - if self.have_popen3: - popenx = os.popen3 - else: - popenx = os.popen2 + else: + # Non-Unix -- use subprocess + import subprocess cmdline = scriptfile if self.is_python(scriptfile): interp = sys.executable @@ -1062,54 +1050,26 @@ nbytes = int(length) except (TypeError, ValueError): nbytes = 0 - files = popenx(cmdline, 'b') - fi = files[0] - fo = files[1] - if self.have_popen3: - fe = files[2] + p = subprocess.Popen(cmdline, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) if self.command.lower() == "post" and nbytes > 0: data = self.rfile.read(nbytes) - fi.write(data) + else: + data = None # throw away additional data [see bug #427345] while select.select([self.rfile._sock], [], [], 0)[0]: if not self.rfile._sock.recv(1): break - fi.close() - shutil.copyfileobj(fo, self.wfile) - if self.have_popen3: - errors = fe.read() - fe.close() - if errors: - self.log_error('%s', errors) - sts = fo.close() - if sts: - self.log_error("CGI script exit status %#x", sts) - else: - self.log_message("CGI script exited OK") - - else: - # Other O.S. -- execute script in this process - save_argv = sys.argv - save_stdin = sys.stdin - save_stdout = sys.stdout - save_stderr = sys.stderr - try: - save_cwd = os.getcwd() - try: - sys.argv = [scriptfile] - if '=' not in decoded_query: - sys.argv.append(decoded_query) - sys.stdout = self.wfile - sys.stdin = self.rfile - exec(open(scriptfile).read(), {"__name__": "__main__"}) - finally: - sys.argv = save_argv - sys.stdin = save_stdin - sys.stdout = save_stdout - sys.stderr = save_stderr - os.chdir(save_cwd) - except SystemExit as sts: - self.log_error("CGI script exit status %s", str(sts)) + stdout, stderr = p.communicate(data) + self.wfile.write(stdout) + if stderr: + self.log_error('%s', stderr) + status = p.returncode + if status: + self.log_error("CGI script exit status %#x", status) else: self.log_message("CGI script exited OK") Modified: python/branches/py3k-urllib/Lib/idlelib/idlever.py ============================================================================== --- python/branches/py3k-urllib/Lib/idlelib/idlever.py (original) +++ python/branches/py3k-urllib/Lib/idlelib/idlever.py Tue Jul 1 06:02:29 2008 @@ -1 +1 @@ -IDLE_VERSION = "3.0a5" +IDLE_VERSION = "3.0b1" Modified: python/branches/py3k-urllib/Lib/lib2to3/refactor.py ============================================================================== --- python/branches/py3k-urllib/Lib/lib2to3/refactor.py (original) +++ python/branches/py3k-urllib/Lib/lib2to3/refactor.py Tue Jul 1 06:02:29 2008 @@ -172,7 +172,9 @@ want a pre-order AST traversal, and post_order is the list that want post-order traversal. """ - fixer_pkg = ".".join(self.fixer_dir.split(os.path.sep)) + fixer_pkg = self.fixer_dir.replace(os.path.sep, ".") + if os.path.altsep: + fixer_pkg = fixer_pkg.replace(os.path.altsep, ".") pre_order_fixers = [] post_order_fixers = [] fix_names = self.options.fix Modified: python/branches/py3k-urllib/Lib/logging/__init__.py ============================================================================== --- python/branches/py3k-urllib/Lib/logging/__init__.py (original) +++ python/branches/py3k-urllib/Lib/logging/__init__.py Tue Jul 1 06:02:29 2008 @@ -731,7 +731,7 @@ """ Flushes the stream. """ - if self.stream: + if self.stream and hasattr(self.stream, "flush"): self.stream.flush() def emit(self, record): @@ -787,7 +787,8 @@ """ if self.stream: self.flush() - self.stream.close() + if hasattr(self.stream, "close"): + self.stream.close() StreamHandler.close(self) self.stream = None Modified: python/branches/py3k-urllib/Lib/logging/handlers.py ============================================================================== --- python/branches/py3k-urllib/Lib/logging/handlers.py (original) +++ python/branches/py3k-urllib/Lib/logging/handlers.py Tue Jul 1 06:02:29 2008 @@ -1002,11 +1002,11 @@ Send the record to the Web server as an URL-encoded dictionary """ try: - import http.client, urllib + import http.client, urllib.parse host = self.host h = http.client.HTTP(host) url = self.url - data = urllib.urlencode(self.mapLogRecord(record)) + data = urllib.parse.urlencode(self.mapLogRecord(record)) if self.method == "GET": if (url.find('?') >= 0): sep = '&' Modified: python/branches/py3k-urllib/Lib/multiprocessing/connection.py ============================================================================== --- python/branches/py3k-urllib/Lib/multiprocessing/connection.py (original) +++ python/branches/py3k-urllib/Lib/multiprocessing/connection.py Tue Jul 1 06:02:29 2008 @@ -352,14 +352,9 @@ MESSAGE_LENGTH = 20 -CHALLENGE = '#CHALLENGE#' -WELCOME = '#WELCOME#' -FAILURE = '#FAILURE#' - -if sys.version_info >= (3, 0): # XXX can use bytes literals in 2.6/3.0 - CHALLENGE = CHALLENGE.encode('ascii') - WELCOME = WELCOME.encode('ascii') - FAILURE = FAILURE.encode('ascii') +CHALLENGE = b'#CHALLENGE#' +WELCOME = b'#WELCOME#' +FAILURE = b'#FAILURE#' def deliver_challenge(connection, authkey): import hmac Modified: python/branches/py3k-urllib/Lib/multiprocessing/managers.py ============================================================================== --- python/branches/py3k-urllib/Lib/multiprocessing/managers.py (original) +++ python/branches/py3k-urllib/Lib/multiprocessing/managers.py Tue Jul 1 06:02:29 2008 @@ -33,15 +33,6 @@ from pickle import PicklingError # -# -# - -try: - bytes -except NameError: - bytes = str # XXX not needed in Py2.6 and Py3.0 - -# # Register some things for pickling # @@ -50,7 +41,7 @@ copyreg.pickle(array.array, reduce_array) view_types = [type(getattr({}, name)()) for name in ('items','keys','values')] -if view_types[0] is not list: # XXX only needed in Py3.0 +if view_types[0] is not list: # only needed in Py3.0 def rebuild_as_list(obj): return list, (list(obj),) for view_type in view_types: @@ -939,14 +930,11 @@ # class IteratorProxy(BaseProxy): - # XXX remove methods for Py3.0 and Py2.6 - _exposed_ = ('__next__', 'next', 'send', 'throw', 'close') + _exposed_ = ('__next__', 'send', 'throw', 'close') def __iter__(self): return self def __next__(self, *args): return self._callmethod('__next__', args) - def next(self, *args): - return self._callmethod('next', args) def send(self, *args): return self._callmethod('send', args) def throw(self, *args): Modified: python/branches/py3k-urllib/Lib/multiprocessing/process.py ============================================================================== --- python/branches/py3k-urllib/Lib/multiprocessing/process.py (original) +++ python/branches/py3k-urllib/Lib/multiprocessing/process.py Tue Jul 1 06:02:29 2008 @@ -26,11 +26,6 @@ except OSError: ORIGINAL_DIR = None -try: - bytes -except NameError: - bytes = str # XXX not needed in Py2.6 and Py3.0 - # # Public functions # Modified: python/branches/py3k-urllib/Lib/multiprocessing/sharedctypes.py ============================================================================== --- python/branches/py3k-urllib/Lib/multiprocessing/sharedctypes.py (original) +++ python/branches/py3k-urllib/Lib/multiprocessing/sharedctypes.py Tue Jul 1 06:02:29 2008 @@ -62,13 +62,10 @@ result.__init__(*size_or_initializer) return result -def Value(typecode_or_type, *args, **kwds): +def Value(typecode_or_type, *args, lock=None): ''' Return a synchronization wrapper for a Value ''' - lock = kwds.pop('lock', None) - if kwds: - raise ValueError('unrecognized keyword argument(s): %s' % list(kwds.keys())) obj = RawValue(typecode_or_type, *args) if lock is None: lock = RLock() Modified: python/branches/py3k-urllib/Lib/nturl2path.py ============================================================================== --- python/branches/py3k-urllib/Lib/nturl2path.py (original) +++ python/branches/py3k-urllib/Lib/nturl2path.py Tue Jul 1 06:02:29 2008 @@ -7,7 +7,7 @@ # ///C|/foo/bar/spam.foo # becomes # C:\foo\bar\spam.foo - import string, urllib + import string, urllib.parse # Windows itself uses ":" even in URLs. url = url.replace(':', '|') if not '|' in url: @@ -19,7 +19,7 @@ url = url[2:] components = url.split('/') # make sure not to convert quoted slashes :-) - return urllib.unquote('\\'.join(components)) + return urllib.parse.unquote('\\'.join(components)) comp = url.split('|') if len(comp) != 2 or comp[0][-1] not in string.ascii_letters: error = 'Bad URL: ' + url @@ -29,7 +29,7 @@ path = drive + ':' for comp in components: if comp: - path = path + '\\' + urllib.unquote(comp) + path = path + '\\' + urllib.parse.unquote(comp) return path def pathname2url(p): @@ -39,7 +39,7 @@ # C:\foo\bar\spam.foo # becomes # ///C|/foo/bar/spam.foo - import urllib + import urllib.parse if not ':' in p: # No drive specifier, just convert slashes and quote the name if p[:2] == '\\\\': @@ -48,16 +48,16 @@ # (notice doubling of slashes at the start of the path) p = '\\\\' + p components = p.split('\\') - return urllib.quote('/'.join(components)) + return urllib.parse.quote('/'.join(components)) comp = p.split(':') if len(comp) != 2 or len(comp[0]) > 1: error = 'Bad path: ' + p raise IOError(error) - drive = urllib.quote(comp[0].upper()) + drive = urllib.parse.quote(comp[0].upper()) components = comp[1].split('\\') path = '///' + drive + '|' for comp in components: if comp: - path = path + '/' + urllib.quote(comp) + path = path + '/' + urllib.parse.quote(comp) return path Modified: python/branches/py3k-urllib/Lib/platform.py ============================================================================== --- python/branches/py3k-urllib/Lib/platform.py (original) +++ python/branches/py3k-urllib/Lib/platform.py Tue Jul 1 06:02:29 2008 @@ -1066,22 +1066,29 @@ """ global _uname_cache + no_os_uname = 0 if _uname_cache is not None: return _uname_cache + processor = '' + # Get some infos from the builtin os.uname API... try: system,node,release,version,machine = os.uname() - except AttributeError: - # Hmm, no uname... we'll have to poke around the system then. - system = sys.platform - release = '' - version = '' - node = _node() - machine = '' - processor = '' + no_os_uname = 1 + + if no_os_uname or not filter(None, (system, node, release, version, machine)): + # Hmm, no there is either no uname or uname has returned + #'unknowns'... we'll have to poke around the system then. + if no_os_uname: + system = sys.platform + release = '' + version = '' + node = _node() + machine = '' + use_syscmd_ver = 1 # Try win32_ver() on win32 platforms @@ -1093,8 +1100,10 @@ # available on Win XP and later; see # http://support.microsoft.com/kb/888731 and # http://www.geocities.com/rick_lively/MANUALS/ENV/MSWIN/PROCESSI.HTM - machine = os.environ.get('PROCESSOR_ARCHITECTURE', '') - processor = os.environ.get('PROCESSOR_IDENTIFIER', machine) + if not machine: + machine = os.environ.get('PROCESSOR_ARCHITECTURE', '') + if not processor: + processor = os.environ.get('PROCESSOR_IDENTIFIER', machine) # Try the 'ver' system command available on some # platforms @@ -1136,30 +1145,28 @@ release,(version,stage,nonrel),machine = mac_ver() system = 'MacOS' - else: - # System specific extensions - if system == 'OpenVMS': - # OpenVMS seems to have release and version mixed up - if not release or release == '0': - release = version - version = '' - # Get processor information - try: - import vms_lib - except ImportError: - pass - else: - csid, cpu_number = vms_lib.getsyi('SYI$_CPU',0) - if (cpu_number >= 128): - processor = 'Alpha' - else: - processor = 'VAX' + # System specific extensions + if system == 'OpenVMS': + # OpenVMS seems to have release and version mixed up + if not release or release == '0': + release = version + version = '' + # Get processor information + try: + import vms_lib + except ImportError: + pass else: - # Get processor information from the uname system command - processor = _syscmd_uname('-p','') + csid, cpu_number = vms_lib.getsyi('SYI$_CPU',0) + if (cpu_number >= 128): + processor = 'Alpha' + else: + processor = 'VAX' + if not processor: + # Get processor information from the uname system command + processor = _syscmd_uname('-p','') - # 'unknown' is not really any useful as information; we'll convert - # it to '' which is more portable + #If any unknowns still exist, replace them with ''s, which are more portable if system == 'unknown': system = '' if node == 'unknown': Modified: python/branches/py3k-urllib/Lib/pydoc.py ============================================================================== --- python/branches/py3k-urllib/Lib/pydoc.py (original) +++ python/branches/py3k-urllib/Lib/pydoc.py Tue Jul 1 06:02:29 2008 @@ -1870,16 +1870,25 @@ else: loader = importer.find_module(modname) if hasattr(loader,'get_source'): + try: + source = loader.get_source(modname) + except UnicodeDecodeError: + if onerror: + onerror(modname) + continue import io - desc = source_synopsis( - io.StringIO(loader.get_source(modname)) - ) or '' + desc = source_synopsis(io.StringIO(source)) or '' if hasattr(loader,'get_filename'): path = loader.get_filename(modname) else: path = None else: - module = loader.load_module(modname) + try: + module = loader.load_module(modname) + except ImportError: + if onerror: + onerror(modname) + continue desc = (module.__doc__ or '').splitlines()[0] path = getattr(module,'__file__',None) name = modname + ' - ' + desc @@ -1895,10 +1904,12 @@ if modname[-9:] == '.__init__': modname = modname[:-9] + ' (package)' print(modname, desc and '- ' + desc) + def onerror(modname): + pass try: import warnings except ImportError: pass else: warnings.filterwarnings('ignore') # ignore problems during import - ModuleScanner().run(callback, key) + ModuleScanner().run(callback, key, onerror=onerror) # --------------------------------------------------- web browser interface Modified: python/branches/py3k-urllib/Lib/ssl.py ============================================================================== --- python/branches/py3k-urllib/Lib/ssl.py (original) +++ python/branches/py3k-urllib/Lib/ssl.py Tue Jul 1 06:02:29 2008 @@ -215,13 +215,13 @@ else: return socket.send(self, data, flags) - def send_to(self, data, addr, flags=0): + def sendto(self, data, addr, flags=0): self._checkClosed() if self._sslobj: - raise ValueError("send_to not allowed on instances of %s" % + raise ValueError("sendto not allowed on instances of %s" % self.__class__) else: - return socket.send_to(self, data, addr, flags) + return socket.sendto(self, data, addr, flags) def sendall(self, data, flags=0): self._checkClosed() @@ -276,13 +276,13 @@ else: return socket.recv_into(self, buffer, nbytes, flags) - def recv_from(self, addr, buflen=1024, flags=0): + def recvfrom(self, addr, buflen=1024, flags=0): self._checkClosed() if self._sslobj: - raise ValueError("recv_from not allowed on instances of %s" % + raise ValueError("recvfrom not allowed on instances of %s" % self.__class__) else: - return socket.recv_from(self, addr, buflen, flags) + return socket.recvfrom(self, addr, buflen, flags) def pending(self): self._checkClosed() Modified: python/branches/py3k-urllib/Lib/test/crashers/loosing_mro_ref.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/crashers/loosing_mro_ref.py (original) +++ python/branches/py3k-urllib/Lib/test/crashers/loosing_mro_ref.py Tue Jul 1 06:02:29 2008 @@ -27,10 +27,9 @@ class Base2(object): mykey = 'from Base2' -class X(Base): - # you can't add a non-string key to X.__dict__, but it can be - # there from the beginning :-) - locals()[MyKey()] = 5 +# you can't add a non-string key to X.__dict__, but it can be +# there from the beginning :-) +X = type('X', (Base,), {MyKey(): 5}) print(X.mykey) # I get a segfault, or a slightly wrong assertion error in a debug build. Modified: python/branches/py3k-urllib/Lib/test/ieee754.txt ============================================================================== --- python/branches/py3k-urllib/Lib/test/ieee754.txt (original) +++ python/branches/py3k-urllib/Lib/test/ieee754.txt Tue Jul 1 06:02:29 2008 @@ -127,31 +127,31 @@ >>> sin(INF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> sin(NINF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> sin(NAN) nan >>> cos(INF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> cos(NINF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> cos(NAN) nan >>> tan(INF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> tan(NINF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> tan(NAN) nan @@ -169,11 +169,11 @@ >>> asin(INF), asin(NINF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> acos(INF), acos(NINF) Traceback (most recent call last): ... -ValueError: math domain error (invalid argument) +ValueError: math domain error >>> equal(atan(INF), PI/2), equal(atan(NINF), -PI/2) (True, True) Modified: python/branches/py3k-urllib/Lib/test/regrtest.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/regrtest.py (original) +++ python/branches/py3k-urllib/Lib/test/regrtest.py Tue Jul 1 06:02:29 2008 @@ -870,7 +870,6 @@ test_crypt test_curses test_dbm - test_dl test_fcntl test_fork1 test_epoll @@ -879,7 +878,6 @@ test_ioctl test_largefile test_kqueue - test_mhlib test_openpty test_ossaudiodev test_pipes @@ -897,7 +895,6 @@ 'linux2': """ test_curses - test_dl test_largefile test_kqueue test_ossaudiodev @@ -911,7 +908,6 @@ test_crypt test_curses test_dbm - test_dl test_fcntl test_fork1 test_epoll @@ -936,7 +932,6 @@ 'unixware7': """ test_bsddb - test_dl test_epoll test_largefile test_kqueue @@ -949,7 +944,6 @@ 'openunix8': """ test_bsddb - test_dl test_epoll test_largefile test_kqueue @@ -963,7 +957,6 @@ """ test_asynchat test_bsddb - test_dl test_fork1 test_epoll test_gettext @@ -1012,7 +1005,6 @@ """ test_bsddb test_curses - test_dl test_epoll test_dbm_gnu test_gzip @@ -1029,7 +1021,6 @@ 'atheos': """ test_curses - test_dl test_dbm_gnu test_epoll test_largefile @@ -1058,11 +1049,9 @@ test_audioop test_bsddb3 test_curses - test_dl test_epoll test_kqueue test_largefile - test_mhlib test_mmap test_openpty test_ossaudiodev @@ -1090,7 +1079,6 @@ test_bsddb test_bsddb3 test_bz2 - test_dl test_epoll test_dbm_gnu test_gzip @@ -1105,7 +1093,6 @@ test_bsddb test_bsddb3 test_ctypes - test_dl test_epoll test_dbm_gnu test_locale @@ -1120,7 +1107,6 @@ test_bsddb3 test_ctypes test_curses - test_dl test_epoll test_dbm_gnu test_locale @@ -1164,13 +1150,6 @@ if test_timeout.skip_expected: self.expected.add('test_timeout') - if not sys.platform in ("mac", "darwin"): - MAC_ONLY = ["test_macostools", "test_aepack", - "test_plistlib", "test_scriptpackages", - "test_applesingle"] - for skip in MAC_ONLY: - self.expected.add(skip) - if sys.platform != "win32": # test_sqlite is only reliable on Windows where the library # is distributed with Python Modified: python/branches/py3k-urllib/Lib/test/test_array.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_array.py (original) +++ python/branches/py3k-urllib/Lib/test/test_array.py Tue Jul 1 06:02:29 2008 @@ -962,6 +962,23 @@ class DoubleTest(FPTest): typecode = 'd' minitemsize = 8 + + def test_alloc_overflow(self): + a = array.array('d', [-1]*65536) + try: + a *= 65536 + except MemoryError: + pass + else: + self.fail("a *= 2**16 didn't raise MemoryError") + b = array.array('d', [ 2.71828183, 3.14159265, -1]) + try: + b * 1431655766 + except MemoryError: + pass + else: + self.fail("a * 1431655766 didn't raise MemoryError") + tests.append(DoubleTest) def test_main(verbose=None): Modified: python/branches/py3k-urllib/Lib/test/test_binop.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_binop.py (original) +++ python/branches/py3k-urllib/Lib/test/test_binop.py Tue Jul 1 06:02:29 2008 @@ -301,21 +301,16 @@ self.assertEqual(Rat(10), 10.0) self.assertEqual(10.0, Rat(10)) - def test_future_div(self): - exec(future_test) + def test_true_div(self): + self.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3)) + self.assertEqual(Rat(10, 3) / 3, Rat(10, 9)) + self.assertEqual(2 / Rat(5), Rat(2, 5)) + self.assertEqual(3.0 * Rat(1, 2), 1.5) + self.assertEqual(Rat(1, 2) * 3.0, 1.5) + self.assertEqual(eval('1/2'), 0.5) # XXX Ran out of steam; TO DO: divmod, div, future division -future_test = """ -from __future__ import division -self.assertEqual(Rat(10, 3) / Rat(5, 7), Rat(14, 3)) -self.assertEqual(Rat(10, 3) / 3, Rat(10, 9)) -self.assertEqual(2 / Rat(5), Rat(2, 5)) -self.assertEqual(3.0 * Rat(1, 2), 1.5) -self.assertEqual(Rat(1, 2) * 3.0, 1.5) -self.assertEqual(eval('1/2'), 0.5) -""" - def test_main(): support.run_unittest(RatTestCase) Modified: python/branches/py3k-urllib/Lib/test/test_compile.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_compile.py (original) +++ python/branches/py3k-urllib/Lib/test/test_compile.py Tue Jul 1 06:02:29 2008 @@ -18,21 +18,9 @@ self.assertRaises(SyntaxError, eval, 'lambda a,a:0') self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0') self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0') - try: - exec('def f(a, a): pass') - self.fail("duplicate arguments") - except SyntaxError: - pass - try: - exec('def f(a = 0, a = 1): pass') - self.fail("duplicate keyword arguments") - except SyntaxError: - pass - try: - exec('def f(a): global a; a = 1') - self.fail("variable is global and local") - except SyntaxError: - pass + self.assertRaises(SyntaxError, exec, 'def f(a, a): pass') + self.assertRaises(SyntaxError, exec, 'def f(a = 0, a = 1): pass') + self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1') def test_syntax_error(self): self.assertRaises(SyntaxError, compile, "1+*3", "filename", "exec") @@ -41,11 +29,7 @@ self.assertRaises(SyntaxError, compile, "f(None=1)", "", "exec") def test_duplicate_global_local(self): - try: - exec('def f(a): global a; a = 1') - self.fail("variable is global and local") - except SyntaxError: - pass + self.assertRaises(SyntaxError, exec, 'def f(a): global a; a = 1') def test_exec_with_general_mapping_for_locals(self): @@ -76,23 +60,13 @@ self.assertEqual(m.results, ('z', g)) exec('z = locals()', g, m) self.assertEqual(m.results, ('z', m)) - try: - exec('z = b', m) - except TypeError: - pass - else: - self.fail('Did not validate globals as a real dict') + self.assertRaises(TypeError, exec, 'z = b', m) class A: "Non-mapping" pass m = A() - try: - exec('z = a', g, m) - except TypeError: - pass - else: - self.fail('Did not validate locals as a mapping') + self.assertRaises(TypeError, exec, 'z = a', g, m) # Verify that dict subclasses work as well class D(dict): @@ -129,11 +103,7 @@ self.assertEqual(g['f'](5), 0) def test_argument_order(self): - try: - exec('def f(a=1, b): pass') - self.fail("non-default args after default") - except SyntaxError: - pass + self.assertRaises(SyntaxError, exec, 'def f(a=1, b): pass') def test_float_literals(self): # testing bad float literals Modified: python/branches/py3k-urllib/Lib/test/test_grammar.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_grammar.py (original) +++ python/branches/py3k-urllib/Lib/test/test_grammar.py Tue Jul 1 06:02:29 2008 @@ -335,6 +335,7 @@ self.assertEquals(l5(1, 2), 5) self.assertEquals(l5(1, 2, 3), 6) check_syntax_error(self, "lambda x: x = 2") + check_syntax_error(self, "lambda (None,): None") l6 = lambda x, y, *, k=20: x+y+k self.assertEquals(l6(1,2), 1+2+20) self.assertEquals(l6(1,2,k=10), 1+2+10) Modified: python/branches/py3k-urllib/Lib/test/test_heapq.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_heapq.py (original) +++ python/branches/py3k-urllib/Lib/test/test_heapq.py Tue Jul 1 06:02:29 2008 @@ -198,7 +198,8 @@ module = c_heapq def test_comparison_operator(self): - # Issue 3501: Make sure heapq works with both __lt__ and __le__ + # Issue 3501: Make sure heapq works with both __lt__ + # For python 3.0, __le__ alone is not enough def hsort(data, comp): data = [comp(x) for x in data] self.module.heapify(data) @@ -211,12 +212,12 @@ class LE: def __init__(self, x): self.x = x - def __lt__(self, other): + def __le__(self, other): return self.x >= other.x data = [random.random() for i in range(100)] target = sorted(data, reverse=True) self.assertEqual(hsort(data, LT), target) - self.assertEqual(hsort(data, LE), target) + self.assertRaises(TypeError, data, LE) #============================================================================== Modified: python/branches/py3k-urllib/Lib/test/test_int.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_int.py (original) +++ python/branches/py3k-urllib/Lib/test/test_int.py Tue Jul 1 06:02:29 2008 @@ -95,6 +95,9 @@ self.assertRaises(ValueError, int, "0b", 2) self.assertRaises(ValueError, int, "0b", 0) + # Bug #3236: Return small longs from PyLong_FromString + self.assert_(int("10") is 10) + self.assert_(int("-1") is -1) # SF bug 1334662: int(string, base) wrong answers # Various representations of 2**32 evaluated to 0 Modified: python/branches/py3k-urllib/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k-urllib/Lib/test/test_multiprocessing.py Tue Jul 1 06:02:29 2008 @@ -1333,7 +1333,7 @@ self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) - +""" class _TestListenerClient(BaseTestCase): ALLOWED_TYPES = ('processes', 'threads') @@ -1353,7 +1353,7 @@ self.assertEqual(conn.recv(), 'hello') p.join() l.close() - +""" # # Test of sending connection and socket objects between processes # @@ -1755,6 +1755,13 @@ # def test_main(run=None): + if sys.platform.startswith("linux"): + try: + lock = multiprocessing.RLock() + except OSError: + from test.support import TestSkipped + raise TestSkipped("OSError raises on RLock creation, see issue 3111!") + if run is None: from test.support import run_unittest as run Modified: python/branches/py3k-urllib/Lib/test/test_ssl.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_ssl.py (original) +++ python/branches/py3k-urllib/Lib/test/test_ssl.py Tue Jul 1 06:02:29 2008 @@ -529,6 +529,7 @@ self.send(str(data, 'ASCII', 'strict').lower().encode('ASCII', 'strict')) def handle_close(self): + self.close() if support.verbose: sys.stdout.write(" server: closed connection %s\n" % self.socket) Modified: python/branches/py3k-urllib/Lib/test/test_struct.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_struct.py (original) +++ python/branches/py3k-urllib/Lib/test/test_struct.py Tue Jul 1 06:02:29 2008 @@ -8,6 +8,7 @@ import sys ISBIGENDIAN = sys.byteorder == "big" +IS32BIT = sys.maxsize == 0x7fffffff del sys try: @@ -83,7 +84,7 @@ self.fail("did not raise error for float coerce") def test_isbigendian(self): - self.assertEqual((struct.pack('=i', 1)[0] == chr(0)), ISBIGENDIAN) + self.assertEqual((struct.pack('=i', 1)[0] == 0), ISBIGENDIAN) def test_consistence(self): self.assertRaises(struct.error, struct.calcsize, 'Z') @@ -580,6 +581,11 @@ for c in [b'\x01', b'\x7f', b'\xff', b'\x0f', b'\xf0']: self.assertTrue(struct.unpack('>?', c)[0]) + if IS32BIT: + def test_crasher(self): + self.assertRaises(MemoryError, struct.pack, "357913941b", "a") + + def test_main(): run_unittest(StructTest) Modified: python/branches/py3k-urllib/Lib/test/test_sys.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_sys.py (original) +++ python/branches/py3k-urllib/Lib/test/test_sys.py Tue Jul 1 06:02:29 2008 @@ -1,6 +1,7 @@ # -*- coding: iso-8859-1 -*- import unittest, test.support import sys, io, os +import struct class SysModuleTest(unittest.TestCase): @@ -373,13 +374,16 @@ class SizeofTest(unittest.TestCase): def setUp(self): - import struct + self.c = len(struct.pack('c', ' ')) + self.H = len(struct.pack('H', 0)) self.i = len(struct.pack('i', 0)) self.l = len(struct.pack('l', 0)) - self.p = len(struct.pack('P', 0)) - self.headersize = self.l + self.p + self.P = len(struct.pack('P', 0)) + # due to missing size_t information from struct, it is assumed that + # sizeof(Py_ssize_t) = sizeof(void*) + self.header = 'PP' if hasattr(sys, "gettotalrefcount"): - self.headersize += 2 * self.p + self.header += '2P' self.file = open(test.support.TESTFN, 'wb') def tearDown(self): @@ -395,52 +399,38 @@ else: self.assertEqual(result, size, msg + str(size)) - def align(self, value): - mod = value % self.p - if mod != 0: - return value - mod + self.p - else: - return value - - def test_align(self): - self.assertEqual(self.align(0) % self.p, 0) - self.assertEqual(self.align(1) % self.p, 0) - self.assertEqual(self.align(3) % self.p, 0) - self.assertEqual(self.align(4) % self.p, 0) - self.assertEqual(self.align(7) % self.p, 0) - self.assertEqual(self.align(8) % self.p, 0) - self.assertEqual(self.align(9) % self.p, 0) + def calcsize(self, fmt): + """Wrapper around struct.calcsize which enforces the alignment of the + end of a structure to the alignment requirement of pointer. + + Note: This wrapper should only be used if a pointer member is included + and no member with a size larger than a pointer exists. + """ + return struct.calcsize(fmt + '0P') def test_standardtypes(self): - i = self.i - l = self.l - p = self.p - h = self.headersize - # bool - self.check_sizeof(True, h + 2*l) - # bytearray - self.check_sizeof(bytes(), h + self.align(i) + l + p) + h = self.header + size = self.calcsize # cell def get_cell(): x = 42 def inner(): return x return inner - self.check_sizeof(get_cell().__closure__[0], h + p) + self.check_sizeof(get_cell().__closure__[0], size(h + 'P')) # code - self.check_sizeof(get_cell().__code__, h + self.align(5*i) + 8*p +\ - self.align(i) + 2*p) + self.check_sizeof(get_cell().__code__, size(h + '5i8Pi2P')) # complex - self.check_sizeof(complex(0,1), h + 2*8) + self.check_sizeof(complex(0,1), size(h + '2d')) # enumerate - self.check_sizeof(enumerate([]), h + l + 3*p) + self.check_sizeof(enumerate([]), size(h + 'l3P')) # reverse - self.check_sizeof(reversed(''), h + l + p ) + self.check_sizeof(reversed(''), size(h + 'PP')) # float - self.check_sizeof(float(0), h + 8) + self.check_sizeof(float(0), size(h + 'd')) # function def func(): pass - self.check_sizeof(func, h + 11 * p) + self.check_sizeof(func, size(h + '11P')) class c(): @staticmethod def foo(): @@ -449,58 +439,47 @@ def bar(cls): pass # staticmethod - self.check_sizeof(foo, h + l) + self.check_sizeof(foo, size(h + 'P')) # classmethod - self.check_sizeof(bar, h + l) + self.check_sizeof(bar, size(h + 'P')) # generator def get_gen(): yield 1 - self.check_sizeof(get_gen(), h + p + self.align(i) + 2*p) + self.check_sizeof(get_gen(), size(h + 'Pi2P')) # builtin_function_or_method - self.check_sizeof(abs, h + 3*p) + self.check_sizeof(abs, size(h + '3P')) # module - self.check_sizeof(unittest, h + 3*p) + self.check_sizeof(unittest, size(h + '3P')) # range - self.check_sizeof(range(1), h + 3*p) + self.check_sizeof(range(1), size(h + '3P')) # slice - self.check_sizeof(slice(0), h + 3*p) + self.check_sizeof(slice(0), size(h + '3P')) - h += l + h += 'P' + # bool + self.check_sizeof(True, size(h + 'H')) # new-style class class class_newstyle(object): def method(): pass # type (PyTypeObject + PyNumberMethods + PyMappingMethods + # PySequenceMethods + PyBufferProcs) - self.check_sizeof(class_newstyle, h + - # PyTypeObject - p + 2*l + 15*p + l + 4*p + l + 9*p + l + 11*p + - self.align(4) + - # PyNumberMethods - 16*p + self.align(i) + 17*p + - 3*p + # PyMappingMethods - 10*p + # PySequenceMethods - 2*p + # PyBufferProcs - 2*p) # *ht_name and *ht_slots + self.check_sizeof(class_newstyle, size(h + 'P2P15Pl4PP9PP11PI') +\ + size('16Pi17P 3P 10P 2P 2P')) def test_specialtypes(self): - i = self.i - l = self.l - p = self.p - h = self.headersize + h = self.header + size = self.calcsize # dict - self.check_sizeof({}, h + 3*l + 3*p + 8*(l + 2*p)) + self.check_sizeof({}, size(h + '3P2P') + 8*size('P2P')) longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} - self.check_sizeof(longdict, h + 3*l + 3*p + 8*(l + 2*p) + 16*(l + 2*p)) - # list - self.check_sizeof([], h + l + p + l) - self.check_sizeof([1, 2, 3], h + l + p + l + 3*l) + self.check_sizeof(longdict, size(h + '3P2P') + (8+16)*size('P2P')) # unicode usize = len('\0'.encode('unicode-internal')) samples = ['', '1'*100] # we need to test for both sizes, because we don't know if the string # has been cached for s in samples: - basicsize = h + l + p + l + l + p + usize * (len(s) + 1) + basicsize = size(h + 'PPliP') + usize * (len(s) + 1) defenc = bytes(s, 'ascii') self.check_sizeof(s, basicsize, size2=basicsize + sys.getsizeof(defenc)) @@ -512,14 +491,20 @@ finally: self.check_sizeof(s, basicsize + sys.getsizeof(defenc)) - h += l + h += 'P' + # list + self.check_sizeof([], size(h + 'PP')) + self.check_sizeof([1, 2, 3], size(h + 'PP') + 3*self.P) # long - self.check_sizeof(0, h + self.align(2)) - self.check_sizeof(1, h + self.align(2)) - self.check_sizeof(-1, h + self.align(2)) - self.check_sizeof(32768, h + self.align(2) + 2) - self.check_sizeof(32768*32768-1, h + self.align(2) + 2) - self.check_sizeof(32768*32768, h + self.align(2) + 4) + self.check_sizeof(0, size(h + 'H')) + self.check_sizeof(1, size(h + 'H')) + self.check_sizeof(-1, size(h + 'H')) + self.check_sizeof(32768, size(h + 'H') + self.H) + self.check_sizeof(32768*32768-1, size(h + 'H') + self.H) + self.check_sizeof(32768*32768, size(h + 'H') + 2*self.H) + # tuple + self.check_sizeof((), size(h)) + self.check_sizeof((1,2,3), size(h) + 3*self.P) def test_main(): Modified: python/branches/py3k-urllib/Lib/test/test_threading_local.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_threading_local.py (original) +++ python/branches/py3k-urllib/Lib/test/test_threading_local.py Tue Jul 1 06:02:29 2008 @@ -42,6 +42,32 @@ deadlist = [weak for weak in weaklist if weak() is None] self.assert_(len(deadlist) in (n-1, n), (n, len(deadlist))) + def test_derived(self): + # Issue 3088: if there is a threads switch inside the __init__ + # of a threading.local derived class, the per-thread dictionary + # is created but not correctly set on the object. + # The first member set may be bogus. + import time + class Local(threading.local): + def __init__(self): + time.sleep(0.01) + local = Local() + + def f(i): + local.x = i + # Simply check that the variable is correctly set + self.assertEqual(local.x, i) + + threads= [] + for i in range(10): + t = threading.Thread(target=f, args=(i,)) + t.start() + threads.append(t) + + for t in threads: + t.join() + + def test_main(): suite = unittest.TestSuite() suite.addTest(DocTestSuite('_threading_local')) Modified: python/branches/py3k-urllib/Lib/test/test_types.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_types.py (original) +++ python/branches/py3k-urllib/Lib/test/test_types.py Tue Jul 1 06:02:29 2008 @@ -428,6 +428,14 @@ # move to the next integer to test x = x // 10 + rfmt = ">20n" + lfmt = "<20n" + cfmt = "^20n" + for x in (1234, 12345, 123456, 1234567, 12345678, 123456789, 1234567890, 12345678900): + self.assertEqual(len(format(0, rfmt)), len(format(x, rfmt))) + self.assertEqual(len(format(0, lfmt)), len(format(x, lfmt))) + self.assertEqual(len(format(0, cfmt)), len(format(x, cfmt))) + def test_float__format__(self): # these should be rewritten to use both format(x, spec) and # x.__format__(spec) Modified: python/branches/py3k-urllib/Lib/test/test_warnings.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_warnings.py (original) +++ python/branches/py3k-urllib/Lib/test/test_warnings.py Tue Jul 1 06:02:29 2008 @@ -301,6 +301,21 @@ warning_tests.__name__ = module_name sys.argv = argv + def test_warn_explicit_type_errors(self): + # warn_explicit() shoud error out gracefully if it is given objects + # of the wrong types. + # lineno is expected to be an integer. + self.assertRaises(TypeError, self.module.warn_explicit, + None, UserWarning, None, None) + # Either 'message' needs to be an instance of Warning or 'category' + # needs to be a subclass. + self.assertRaises(TypeError, self.module.warn_explicit, + None, None, None, 1) + # 'registry' must be a dict or None. + self.assertRaises((TypeError, AttributeError), + self.module.warn_explicit, + None, Warning, None, 1, registry=42) + class CWarnTests(BaseTest, WarnTests): Modified: python/branches/py3k-urllib/Lib/urllib/request.py ============================================================================== --- python/branches/py3k-urllib/Lib/urllib/request.py (original) +++ python/branches/py3k-urllib/Lib/urllib/request.py Tue Jul 1 06:02:29 2008 @@ -47,24 +47,25 @@ Example usage: -import urllib2 +import urllib.request # set up authentication info -authinfo = urllib2.HTTPBasicAuthHandler() +authinfo = urllib.request.HTTPBasicAuthHandler() authinfo.add_password(realm='PDQ Application', uri='https://mahler:8092/site-updates.py', user='klem', passwd='geheim$parole') -proxy_support = urllib2.ProxyHandler({"http" : "http://ahad-haam:3128"}) +proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"}) # build a new opener that adds authentication and caching FTP handlers -opener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler) +opener = urllib.request.build_opener(proxy_support, authinfo, + urllib.request.CacheFTPHandler) # install it -urllib2.install_opener(opener) +urllib.request.install_opener(opener) -f = urllib2.urlopen('http://www.python.org/') +f = urllib.request.urlopen('http://www.python.org/') """ # XXX issues: @@ -105,7 +106,6 @@ _have_ssl = False else: _have_ssl = True -assert _have_ssl # used in User-Agent header sent __version__ = sys.version[:3] @@ -417,8 +417,6 @@ FTPHandler, FileHandler, HTTPErrorProcessor] if hasattr(http.client, "HTTPSConnection"): default_classes.append(HTTPSHandler) - else: - import pdb; pdb.set_trace() skip = set() for klass in default_classes: for check in handlers: @@ -505,7 +503,7 @@ # Strictly (according to RFC 2616), 301 or 302 in response to # a POST MUST NOT cause a redirection without confirmation - # from the user (of urllib2, in this case). In practice, + # from the user (of urllib.request, in this case). In practice, # essentially all clients do redirect in this case, so we do # the same. # be conciliant with URIs containing a space @@ -658,7 +656,7 @@ if proxy_type is None: proxy_type = orig_type if user and password: - user_pass = '%s:%s' % (unquote(user), + user_pass = '%s:%s' % (urllib.parse.unquote(user), urllib.parse.unquote(password)) creds = base64.b64encode(user_pass.encode()).decode("ascii") req.add_header('Proxy-authorization', 'Basic ' + creds) @@ -811,7 +809,7 @@ def http_error_407(self, req, fp, code, msg, headers): # http_error_auth_reqed requires that there is no userinfo component in - # authority. Assume there isn't one, since urllib2 does not (and + # authority. Assume there isn't one, since urllib.request does not (and # should not, RFC 3986 s. 3.2.1) support requests for URLs containing # userinfo. authority = req.get_host() @@ -1197,7 +1195,7 @@ return urllib.response.addinfourl(open(localfile, 'rb'), headers, 'file:'+file) except OSError as msg: - # urllib2 users shouldn't expect OSErrors coming from urlopen() + # users shouldn't expect OSErrors coming from urlopen() raise urllib.error.URLError(msg) raise urllib.error.URLError('file not on local host') Modified: python/branches/py3k-urllib/Lib/warnings.py ============================================================================== --- python/branches/py3k-urllib/Lib/warnings.py (original) +++ python/branches/py3k-urllib/Lib/warnings.py Tue Jul 1 06:02:29 2008 @@ -188,6 +188,7 @@ def warn_explicit(message, category, filename, lineno, module=None, registry=None, module_globals=None): + lineno = int(lineno) if module is None: module = filename or "" if module[-3:].lower() == ".py": Modified: python/branches/py3k-urllib/Mac/BuildScript/build-installer.py ============================================================================== --- python/branches/py3k-urllib/Mac/BuildScript/build-installer.py (original) +++ python/branches/py3k-urllib/Mac/BuildScript/build-installer.py Tue Jul 1 06:02:29 2008 @@ -9,7 +9,8 @@ Usage: see USAGE variable in the script. """ -import platform, os, sys, getopt, textwrap, shutil, urllib2, stat, time, pwd +import platform, os, sys, getopt, textwrap, shutil, stat, time, pwd +import urllib.request import grp INCLUDE_TIMESTAMP = 1 @@ -442,7 +443,7 @@ if KNOWNSIZES.get(url) == size: print("Using existing file for", url) return - fpIn = urllib2.urlopen(url) + fpIn = urllib.request.urlopen(url) fpOut = open(fname, 'wb') block = fpIn.read(10240) try: Modified: python/branches/py3k-urllib/Mac/Makefile.in ============================================================================== --- python/branches/py3k-urllib/Mac/Makefile.in (original) +++ python/branches/py3k-urllib/Mac/Makefile.in Tue Jul 1 06:02:29 2008 @@ -43,7 +43,6 @@ Resources/English.lproj/Documentation/ide DOCDIR=$(srcdir)/Resources/app/Resources/English.lproj/Documentation DOCINDEX=$(DOCDIR)/"Documentation idx" -CACHERSRC=$(srcdir)/scripts/cachersrc.py compileall=$(srcdir)/../Lib/compileall.py installapps: install_Python install_BuildApplet install_PythonLauncher \ @@ -225,7 +224,6 @@ done - $(RUNSHARED) $(BUILDPYTHON) $(CACHERSRC) -v $(DESTDIR)$(MACLIBDEST) $(DESTDIR)$(MACTOOLSDEST) $(RUNSHARED) $(BUILDPYTHON) -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) $(RUNSHARED) $(BUILDPYTHON) -O -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) Modified: python/branches/py3k-urllib/Makefile.pre.in ============================================================================== --- python/branches/py3k-urllib/Makefile.pre.in (original) +++ python/branches/py3k-urllib/Makefile.pre.in Tue Jul 1 06:02:29 2008 @@ -814,6 +814,7 @@ ctypes ctypes/test ctypes/macholib idlelib idlelib/Icons \ distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \ setuptools setuptools/command setuptools/tests setuptools.egg-info \ + multiprocessing multiprocessing/dummy \ curses $(MACHDEPS) libinstall: build_all $(srcdir)/Lib/$(PLATDIR) @for i in $(SCRIPTDIR) $(LIBDEST); \ Modified: python/branches/py3k-urllib/Misc/ACKS ============================================================================== --- python/branches/py3k-urllib/Misc/ACKS (original) +++ python/branches/py3k-urllib/Misc/ACKS Tue Jul 1 06:02:29 2008 @@ -486,6 +486,7 @@ Gustavo Niemeyer Oscar Nierstrasz Hrvoje Niksic +Jesse Noller Bill Noon Stefan Norberg Tim Northover @@ -502,6 +503,7 @@ Douglas Orr Denis S. Otkidach Michael Otteneder +R. M. Oudkerk Russel Owen Ondrej Palkovsky Mike Pall @@ -673,6 +675,7 @@ Monty Taylor Amy Taylor Tobias Thelen +James Thomas Robin Thomas Eric Tiedemann Tracy Tims Modified: python/branches/py3k-urllib/Misc/NEWS ============================================================================== --- python/branches/py3k-urllib/Misc/NEWS (original) +++ python/branches/py3k-urllib/Misc/NEWS Tue Jul 1 06:02:29 2008 @@ -4,14 +4,36 @@ (editors: check NEWS.help for information about editing NEWS using ReST.) +What's new in Python 3.0b2? +=========================== + +*Release date: XX-XXX-2008* + +Core and Builtins +----------------- + +- Issue #3236: Return small longs from PyLong_FromString. + +Library +------- + +- Issue #3145: help("modules whatever") failed when trying to load the source + code of every single module of the standard library, including invalid files + used in the test suite. + What's new in Python 3.0b1? =========================== -*Release date: XX-June-2008* +*Release date: 18-Jun-2008* Core and Builtins ----------------- +- Issue #3211: warnings.warn_explicit() did not guard against its 'registry' + argument being anything other than a dict or None. Also fixed a bug in error + handling when 'message' and 'category' were both set to None, triggering a + bus error. + - Issue #3100: Corrected a crash on deallocation of a subclassed weakref which holds the last (strong) reference to its referent. @@ -81,6 +103,17 @@ Library ------- +- Patch #3133: http.server.CGIHTTPRequestHandler did not work on windows. + +- a new ``urllib`` package was created. It consists of code from + ``urllib``, ``urllib2``, ``urlparse``, and ``robotparser``. The old + modules have all been removed. The new package has five submodules: + ``urllib.parse``, ``urllib.request``, ``urllib.response``, + ``urllib.error``, and ``urllib.robotparser``. The + ``urllib.request.urlopen()`` function uses the url opener from + ``urllib2``. (Note that the unittests have not been renamed for the + beta, but they will be renamed in the future.) + - rfc822 has been removed in favor of the email package. - mimetools has been removed in favor of the email package. Modified: python/branches/py3k-urllib/Misc/RPM/python-3.0.spec ============================================================================== --- python/branches/py3k-urllib/Misc/RPM/python-3.0.spec (original) +++ python/branches/py3k-urllib/Misc/RPM/python-3.0.spec Tue Jul 1 06:02:29 2008 @@ -34,7 +34,7 @@ %define name python #--start constants-- -%define version 3.0a5 +%define version 3.0b1 %define libver 3.0 #--end constants-- %define release 1pydotorg Modified: python/branches/py3k-urllib/Misc/cheatsheet ============================================================================== --- python/branches/py3k-urllib/Misc/cheatsheet (original) +++ python/branches/py3k-urllib/Misc/cheatsheet Tue Jul 1 06:02:29 2008 @@ -1889,7 +1889,6 @@ re Regular Expressions. reprlib Redo repr() but with limits on most sizes. rlcompleter Word completion for GNU readline 2.0. -robotparser Parse robots.txt files, useful for web spiders. sched A generally useful event scheduler class. shelve Manage shelves of pickled objects. shlex Lexical analyzer class for simple shell-like syntaxes. @@ -1920,8 +1919,9 @@ types Define names for all type symbols in the std interpreter. tzparse Parse a timezone specification. unicodedata Interface to unicode properties. -urllib Open an arbitrary URL. -urlparse Parse URLs according to latest draft of standard. +urllib.parse Parse URLs according to latest draft of standard. +urllib.request Open an arbitrary URL. +urllib.robotparser Parse robots.txt files, useful for web spiders. user Hook to allow user-specified customization code to run. uu UUencode/UUdecode. unittest Utilities for implementing unit testing. Modified: python/branches/py3k-urllib/Misc/developers.txt ============================================================================== --- python/branches/py3k-urllib/Misc/developers.txt (original) +++ python/branches/py3k-urllib/Misc/developers.txt Tue Jul 1 06:02:29 2008 @@ -17,6 +17,9 @@ Permissions History ------------------- +- Jesse Noller was given SVN access on 16 June 2008 by Georg Brandl, + for work on the multiprocessing module. + - Gregor Lingl was given SVN access on 10 June 2008 by MvL, for work on the turtle module. Modified: python/branches/py3k-urllib/Modules/_csv.c ============================================================================== --- python/branches/py3k-urllib/Modules/_csv.c (original) +++ python/branches/py3k-urllib/Modules/_csv.c Tue Jul 1 06:02:29 2008 @@ -533,6 +533,10 @@ self->field = PyMem_New(Py_UNICODE, self->field_size); } else { + if (self->field_size > INT_MAX / 2) { + PyErr_NoMemory(); + return 0; + } self->field_size *= 2; self->field = PyMem_Resize(self->field, Py_UNICODE, self->field_size); @@ -1038,6 +1042,12 @@ static int join_check_rec_size(WriterObj *self, int rec_len) { + + if (rec_len < 0 || rec_len > INT_MAX - MEM_INCR) { + PyErr_NoMemory(); + return 0; + } + if (rec_len > self->rec_size) { if (self->rec_size == 0) { self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; Modified: python/branches/py3k-urllib/Modules/_ctypes/callproc.c ============================================================================== --- python/branches/py3k-urllib/Modules/_ctypes/callproc.c (original) +++ python/branches/py3k-urllib/Modules/_ctypes/callproc.c Tue Jul 1 06:02:29 2008 @@ -1815,6 +1815,8 @@ return NULL; } shape = PyTuple_New(dict->ndim); + if (shape == NULL) + return NULL; for (i = 0; i < (int)dict->ndim; ++i) PyTuple_SET_ITEM(shape, i, PyLong_FromSsize_t(dict->shape[i])); Modified: python/branches/py3k-urllib/Modules/_heapqmodule.c ============================================================================== --- python/branches/py3k-urllib/Modules/_heapqmodule.c (original) +++ python/branches/py3k-urllib/Modules/_heapqmodule.c Tue Jul 1 06:02:29 2008 @@ -8,28 +8,10 @@ #include "Python.h" -/* Older implementations of heapq used Py_LE for comparisons. Now, it uses - Py_LT so it will match min(), sorted(), and bisect(). Unfortunately, some - client code (Twisted for example) relied on Py_LE, so this little function - restores compatability by trying both. -*/ static int cmp_lt(PyObject *x, PyObject *y) { - int cmp; - static PyObject *lt = NULL; - - if (lt == NULL) { - lt = PyUnicode_FromString("__lt__"); - if (lt == NULL) - return -1; - } - if (PyObject_HasAttr(x, lt)) - return PyObject_RichCompareBool(x, y, Py_LT); - cmp = PyObject_RichCompareBool(y, x, Py_LE); - if (cmp != -1) - cmp = 1 - cmp; - return cmp; + return PyObject_RichCompareBool(x, y, Py_LT); } static int Modified: python/branches/py3k-urllib/Modules/_struct.c ============================================================================== --- python/branches/py3k-urllib/Modules/_struct.c (original) +++ python/branches/py3k-urllib/Modules/_struct.c Tue Jul 1 06:02:29 2008 @@ -1383,6 +1383,12 @@ } } + /* check for overflow */ + if ((len + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) { + PyErr_NoMemory(); + return -1; + } + self->s_size = size; self->s_len = len; codes = PyMem_MALLOC((len + 1) * sizeof(formatcode)); Modified: python/branches/py3k-urllib/Modules/_threadmodule.c ============================================================================== --- python/branches/py3k-urllib/Modules/_threadmodule.c (original) +++ python/branches/py3k-urllib/Modules/_threadmodule.c Tue Jul 1 06:02:29 2008 @@ -293,7 +293,10 @@ } } - else if (self->dict != ldict) { + + /* The call to tp_init above may have caused another thread to run. + Install our ldict again. */ + if (self->dict != ldict) { Py_CLEAR(self->dict); Py_INCREF(ldict); self->dict = ldict; Modified: python/branches/py3k-urllib/Modules/arraymodule.c ============================================================================== --- python/branches/py3k-urllib/Modules/arraymodule.c (original) +++ python/branches/py3k-urllib/Modules/arraymodule.c Tue Jul 1 06:02:29 2008 @@ -421,6 +421,9 @@ if (op == NULL) { return NULL; } + op->ob_descr = descr; + op->allocated = size; + op->weakreflist = NULL; Py_SIZE(op) = size; if (size <= 0) { op->ob_item = NULL; @@ -428,13 +431,10 @@ else { op->ob_item = PyMem_NEW(char, nbytes); if (op->ob_item == NULL) { - PyObject_Del(op); + Py_DECREF(op); return PyErr_NoMemory(); } } - op->ob_descr = descr; - op->allocated = size; - op->weakreflist = NULL; op->ob_exports = 0; return (PyObject *) op; } @@ -642,6 +642,9 @@ PyErr_BadArgument(); return NULL; } + if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) { + return PyErr_NoMemory(); + } size = Py_SIZE(a) + Py_SIZE(b); np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr); if (np == NULL) { @@ -664,6 +667,9 @@ Py_ssize_t nbytes; if (n < 0) n = 0; + if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) { + return PyErr_NoMemory(); + } size = Py_SIZE(a) * n; np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr); if (np == NULL) @@ -808,11 +814,15 @@ "can only extend with array of same kind"); return -1; } + if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) || + ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) { + PyErr_NoMemory(); + return -1; + } size = Py_SIZE(self) + Py_SIZE(b); PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); if (self->ob_item == NULL) { - PyObject_Del(self); - PyErr_NoMemory(); + PyErr_NoMemory(); return -1; } memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize, @@ -849,6 +859,10 @@ if (n < 0) n = 0; items = self->ob_item; + if ((self->ob_descr->itemsize != 0) && + (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) { + return PyErr_NoMemory(); + } size = Py_SIZE(self) * self->ob_descr->itemsize; if (n == 0) { PyMem_FREE(items); @@ -857,6 +871,9 @@ self->allocated = 0; } else { + if (size > PY_SSIZE_T_MAX / n) { + return PyErr_NoMemory(); + } PyMem_Resize(items, char, n * size); if (items == NULL) return PyErr_NoMemory(); @@ -1138,6 +1155,10 @@ Py_INCREF(dict); } if (Py_SIZE(array) > 0) { + if (array->ob_descr->itemsize + > PY_SSIZE_T_MAX / Py_SIZE(array)) { + return PyErr_NoMemory(); + } result = Py_BuildValue("O(cy#)O", Py_TYPE(array), array->ob_descr->typecode, @@ -1311,6 +1332,9 @@ if ((*self->ob_descr->setitem)(self, Py_SIZE(self) - n + i, v) != 0) { Py_SIZE(self) -= n; + if (itemsize && (Py_SIZE(self) > PY_SSIZE_T_MAX / itemsize)) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, char, Py_SIZE(self) * itemsize); self->ob_item = item; @@ -1369,6 +1393,10 @@ n = n / itemsize; if (n > 0) { char *item = self->ob_item; + if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) || + ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize); if (item == NULL) { PyErr_NoMemory(); @@ -1394,8 +1422,12 @@ static PyObject * array_tostring(arrayobject *self, PyObject *unused) { - return PyBytes_FromStringAndSize(self->ob_item, - Py_SIZE(self) * self->ob_descr->itemsize); + if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) { + return PyBytes_FromStringAndSize(self->ob_item, + Py_SIZE(self) * self->ob_descr->itemsize); + } else { + return PyErr_NoMemory(); + } } PyDoc_STRVAR(tostring_doc, @@ -1424,6 +1456,9 @@ } if (n > 0) { Py_UNICODE *item = (Py_UNICODE *) self->ob_item; + if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) { + return PyErr_NoMemory(); + } PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n); if (item == NULL) { PyErr_NoMemory(); Modified: python/branches/py3k-urllib/Modules/audioop.c ============================================================================== --- python/branches/py3k-urllib/Modules/audioop.c (original) +++ python/branches/py3k-urllib/Modules/audioop.c Tue Jul 1 06:02:29 2008 @@ -829,7 +829,7 @@ audioop_tostereo(PyObject *self, PyObject *args) { signed char *cp, *ncp; - int len, size, val1, val2, val = 0; + int len, new_len, size, val1, val2, val = 0; double fac1, fac2, fval, maxval; PyObject *rv; int i; @@ -846,7 +846,14 @@ return 0; } - rv = PyBytes_FromStringAndSize(NULL, len*2); + new_len = len*2; + if (new_len < 0) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + + rv = PyBytes_FromStringAndSize(NULL, new_len); if ( rv == 0 ) return 0; ncp = (signed char *)PyBytes_AsString(rv); @@ -1009,7 +1016,7 @@ { signed char *cp; unsigned char *ncp; - int len, size, size2, val = 0; + int len, new_len, size, size2, val = 0; PyObject *rv; int i, j; @@ -1023,7 +1030,13 @@ return 0; } - rv = PyBytes_FromStringAndSize(NULL, (len/size)*size2); + new_len = (len/size)*size2; + if (new_len < 0) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + rv = PyBytes_FromStringAndSize(NULL, new_len); if ( rv == 0 ) return 0; ncp = (unsigned char *)PyBytes_AsString(rv); @@ -1059,6 +1072,7 @@ int chan, d, *prev_i, *cur_i, cur_o; PyObject *state, *samps, *str, *rv = NULL; int bytes_per_frame; + size_t alloc_size; weightA = 1; weightB = 0; @@ -1101,8 +1115,14 @@ inrate /= d; outrate /= d; - prev_i = (int *) malloc(nchannels * sizeof(int)); - cur_i = (int *) malloc(nchannels * sizeof(int)); + alloc_size = sizeof(int) * (unsigned)nchannels; + if (alloc_size < nchannels) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + prev_i = (int *) malloc(alloc_size); + cur_i = (int *) malloc(alloc_size); if (prev_i == NULL || cur_i == NULL) { (void) PyErr_NoMemory(); goto exit; @@ -1275,7 +1295,7 @@ unsigned char *cp; unsigned char cval; signed char *ncp; - int len, size, val; + int len, new_len, size, val; PyObject *rv; int i; @@ -1288,12 +1308,18 @@ return 0; } - rv = PyBytes_FromStringAndSize(NULL, len*size); + new_len = len*size; + if (new_len < 0) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + rv = PyBytes_FromStringAndSize(NULL, new_len); if ( rv == 0 ) return 0; ncp = (signed char *)PyBytes_AsString(rv); - for ( i=0; i < len*size; i += size ) { + for ( i=0; i < new_len; i += size ) { cval = *cp++; val = st_ulaw2linear16(cval); @@ -1343,7 +1369,7 @@ unsigned char *cp; unsigned char cval; signed char *ncp; - int len, size, val; + int len, new_len, size, val; PyObject *rv; int i; @@ -1356,12 +1382,18 @@ return 0; } - rv = PyBytes_FromStringAndSize(NULL, len*size); + new_len = len*size; + if (new_len < 0) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + rv = PyBytes_FromStringAndSize(NULL, new_len); if ( rv == 0 ) return 0; ncp = (signed char *)PyBytes_AsString(rv); - for ( i=0; i < len*size; i += size ) { + for ( i=0; i < new_len; i += size ) { cval = *cp++; val = st_alaw2linear16(cval); @@ -1486,7 +1518,7 @@ { signed char *cp; signed char *ncp; - int len, size, valpred, step, delta, index, sign, vpdiff; + int len, new_len, size, valpred, step, delta, index, sign, vpdiff; PyObject *rv, *str, *state; int i, inputbuffer = 0, bufferstep; @@ -1508,7 +1540,13 @@ } else if ( !PyArg_ParseTuple(state, "ii", &valpred, &index) ) return 0; - str = PyBytes_FromStringAndSize(NULL, len*size*2); + new_len = len*size*2; + if (new_len < 0) { + PyErr_SetString(PyExc_MemoryError, + "not enough memory for output buffer"); + return 0; + } + str = PyBytes_FromStringAndSize(NULL, new_len); if ( str == 0 ) return 0; ncp = (signed char *)PyBytes_AsString(str); @@ -1516,7 +1554,7 @@ step = stepsizeTable[index]; bufferstep = 0; - for ( i=0; i < len*size*2; i += size ) { + for ( i=0; i < new_len; i += size ) { /* Step 1 - get the delta value and compute next index */ if ( bufferstep ) { delta = inputbuffer & 0xf; Modified: python/branches/py3k-urllib/Modules/binascii.c ============================================================================== --- python/branches/py3k-urllib/Modules/binascii.c (original) +++ python/branches/py3k-urllib/Modules/binascii.c Tue Jul 1 06:02:29 2008 @@ -198,6 +198,8 @@ if ( !PyArg_ParseTuple(args, "t#:a2b_uu", &ascii_data, &ascii_len) ) return NULL; + assert(ascii_len >= 0); + /* First byte: binary data length (in bytes) */ bin_len = (*ascii_data++ - ' ') & 077; ascii_len--; @@ -355,6 +357,11 @@ if ( !PyArg_ParseTuple(args, "t#:a2b_base64", &ascii_data, &ascii_len) ) return NULL; + assert(ascii_len >= 0); + + if (ascii_len > PY_SSIZE_T_MAX - 3) + return PyErr_NoMemory(); + bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */ /* Allocate the buffer */ @@ -448,6 +455,9 @@ if ( !PyArg_ParseTuple(args, "s#:b2a_base64", &bin_data, &bin_len) ) return NULL; + + assert(bin_len >= 0); + if ( bin_len > BASE64_MAXBIN ) { PyErr_SetString(Error, "Too much data for base64 line"); return NULL; @@ -507,6 +517,11 @@ if ( !PyArg_ParseTuple(args, "t#:a2b_hqx", &ascii_data, &len) ) return NULL; + assert(len >= 0); + + if (len > PY_SSIZE_T_MAX - 2) + return PyErr_NoMemory(); + /* Allocate a string that is too big (fixed later) Add two to the initial length to prevent interning which would preclude subsequent resizing. */ @@ -574,6 +589,11 @@ if ( !PyArg_ParseTuple(args, "s#:rlecode_hqx", &in_data, &len) ) return NULL; + assert(len >= 0); + + if (len > PY_SSIZE_T_MAX / 2 - 2) + return PyErr_NoMemory(); + /* Worst case: output is twice as big as input (fixed later) */ if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) return NULL; @@ -627,6 +647,11 @@ if ( !PyArg_ParseTuple(args, "s#:b2a_hqx", &bin_data, &len) ) return NULL; + assert(len >= 0); + + if (len > PY_SSIZE_T_MAX / 2 - 2) + return PyErr_NoMemory(); + /* Allocate a buffer that is at least large enough */ if ( (rv=PyBytes_FromStringAndSize(NULL, len*2+2)) == NULL ) return NULL; @@ -669,9 +694,13 @@ if ( !PyArg_ParseTuple(args, "s#:rledecode_hqx", &in_data, &in_len) ) return NULL; + assert(in_len >= 0); + /* Empty string is a special case */ if ( in_len == 0 ) return PyBytes_FromStringAndSize("", 0); + else if (in_len > PY_SSIZE_T_MAX / 2) + return PyErr_NoMemory(); /* Allocate a buffer of reasonable size. Resized when needed */ out_len = in_len*2; @@ -697,6 +726,7 @@ #define OUTBYTE(b) \ do { \ if ( --out_len_left < 0 ) { \ + if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \ if (_PyBytes_Resize(&rv, 2*out_len) < 0) \ { Py_DECREF(rv); return NULL; } \ out_data = (unsigned char *)PyBytes_AS_STRING(rv) \ @@ -769,7 +799,7 @@ if ( !PyArg_ParseTuple(args, "s#i:crc_hqx", &bin_data, &len, &crc) ) return NULL; - while(len--) { + while(len-- > 0) { crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++]; } @@ -925,7 +955,7 @@ return NULL; crc = ~ crc; - while (len--) { + while (len-- > 0) { crc = crc_32_tab[(crc ^ *bin_data++) & 0xff] ^ (crc >> 8); /* Note: (crc >> 8) MUST zero fill on left */ } @@ -948,6 +978,10 @@ if (!PyArg_ParseTuple(args, "s#:b2a_hex", &argbuf, &arglen)) return NULL; + assert(arglen >= 0); + if (arglen > PY_SSIZE_T_MAX / 2) + return PyErr_NoMemory(); + retval = PyBytes_FromStringAndSize(NULL, arglen*2); if (!retval) return NULL; @@ -999,6 +1033,8 @@ if (!PyArg_ParseTuple(args, "s#:a2b_hex", &argbuf, &arglen)) return NULL; + assert(arglen >= 0); + /* XXX What should we do about strings with an odd length? Should * we add an implicit leading zero, or a trailing zero? For now, * raise an exception. Modified: python/branches/py3k-urllib/Modules/cjkcodecs/multibytecodec.c ============================================================================== --- python/branches/py3k-urllib/Modules/cjkcodecs/multibytecodec.c (original) +++ python/branches/py3k-urllib/Modules/cjkcodecs/multibytecodec.c Tue Jul 1 06:02:29 2008 @@ -172,13 +172,17 @@ static int expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t esize) { - Py_ssize_t orgpos, orgsize; + Py_ssize_t orgpos, orgsize, incsize; orgpos = (Py_ssize_t)((char *)buf->outbuf - PyBytes_AS_STRING(buf->outobj)); orgsize = PyBytes_GET_SIZE(buf->outobj); - if (_PyBytes_Resize(&buf->outobj, orgsize + ( - esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize)) == -1) + incsize = (esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize); + + if (orgsize > PY_SSIZE_T_MAX - incsize) + return -1; + + if (_PyBytes_Resize(&buf->outobj, orgsize + incsize) == -1) return -1; buf->outbuf = (unsigned char *)PyBytes_AS_STRING(buf->outobj) +orgpos; @@ -481,6 +485,12 @@ buf.excobj = NULL; buf.inbuf = buf.inbuf_top = *data; buf.inbuf_end = buf.inbuf_top + datalen; + + if (datalen > (PY_SSIZE_T_MAX - 16) / 2) { + PyErr_NoMemory(); + goto errorexit; + } + buf.outobj = PyBytes_FromStringAndSize(NULL, datalen * 2 + 16); if (buf.outobj == NULL) goto errorexit; @@ -743,6 +753,11 @@ origpending = ctx->pendingsize; if (origpending > 0) { + if (datalen > PY_SSIZE_T_MAX - ctx->pendingsize) { + PyErr_NoMemory(); + /* inbuf_tmp == NULL */ + goto errorexit; + } inbuf_tmp = PyMem_New(Py_UNICODE, datalen + ctx->pendingsize); if (inbuf_tmp == NULL) goto errorexit; @@ -805,9 +820,10 @@ Py_ssize_t npendings; npendings = (Py_ssize_t)(buf->inbuf_end - buf->inbuf); - if (npendings + ctx->pendingsize > MAXDECPENDING) { - PyErr_SetString(PyExc_UnicodeError, "pending buffer overflow"); - return -1; + if (npendings + ctx->pendingsize > MAXDECPENDING || + npendings > PY_SSIZE_T_MAX - ctx->pendingsize) { + PyErr_SetString(PyExc_UnicodeError, "pending buffer overflow"); + return -1; } memcpy(ctx->pending + ctx->pendingsize, buf->inbuf, npendings); ctx->pendingsize += npendings; @@ -1009,7 +1025,7 @@ PyObject *args, PyObject *kwargs) { MultibyteDecodeBuffer buf; - char *data, *wdata; + char *data, *wdata = NULL; Py_ssize_t wsize, finalsize = 0, size, origpending; int final = 0; @@ -1025,6 +1041,10 @@ wdata = data; } else { + if (size > PY_SSIZE_T_MAX - self->pendingsize) { + PyErr_NoMemory(); + goto errorexit; + } wsize = size + self->pendingsize; wdata = PyMem_Malloc(wsize); if (wdata == NULL) @@ -1244,6 +1264,10 @@ PyObject *ctr; char *ctrdata; + if (PyBytes_GET_SIZE(cres) > PY_SSIZE_T_MAX - self->pendingsize) { + PyErr_NoMemory(); + goto errorexit; + } rsize = PyBytes_GET_SIZE(cres) + self->pendingsize; ctr = PyBytes_FromStringAndSize(NULL, rsize); if (ctr == NULL) Modified: python/branches/py3k-urllib/Modules/datetimemodule.c ============================================================================== --- python/branches/py3k-urllib/Modules/datetimemodule.c (original) +++ python/branches/py3k-urllib/Modules/datetimemodule.c Tue Jul 1 06:02:29 2008 @@ -1111,6 +1111,8 @@ char sign; int none; + assert(buflen >= 1); + offset = call_utcoffset(tzinfo, tzinfoarg, &none); if (offset == -1 && PyErr_Occurred()) return -1; @@ -1250,6 +1252,11 @@ * a new format. Since computing the replacements for those codes * is expensive, don't unless they're actually used. */ + if (flen > INT_MAX - 1) { + PyErr_NoMemory(); + goto Done; + } + totalnew = flen + 1; /* realistic if no %z/%Z */ newfmt = PyBytes_FromStringAndSize(NULL, totalnew); if (newfmt == NULL) goto Done; Modified: python/branches/py3k-urllib/Modules/mathmodule.c ============================================================================== --- python/branches/py3k-urllib/Modules/mathmodule.c (original) +++ python/branches/py3k-urllib/Modules/mathmodule.c Tue Jul 1 06:02:29 2008 @@ -82,12 +82,17 @@ * should return a zero on underflow, and +- HUGE_VAL on * overflow, so testing the result for zero suffices to * distinguish the cases). + * + * On some platforms (Ubuntu/ia64) it seems that errno can be + * set to ERANGE for subnormal results that do *not* underflow + * to zero. So to be safe, we'll ignore ERANGE whenever the + * function result is less than one in absolute value. */ - if (x) + if (fabs(x) < 1.0) + result = 0; + else PyErr_SetString(PyExc_OverflowError, "math range error"); - else - result = 0; } else /* Unexpected math error */ @@ -176,16 +181,16 @@ PyFPE_END_PROTECT(r); if (Py_IS_NAN(r) && !Py_IS_NAN(x)) { PyErr_SetString(PyExc_ValueError, - "math domain error (invalid argument)"); + "math domain error"); /* invalid arg */ return NULL; } if (Py_IS_INFINITY(r) && Py_IS_FINITE(x)) { if (can_overflow) PyErr_SetString(PyExc_OverflowError, - "math range error (overflow)"); + "math range error"); /* overflow */ else PyErr_SetString(PyExc_ValueError, - "math domain error (singularity)"); + "math domain error"); /* singularity */ return NULL; } if (Py_IS_FINITE(r) && errno && is_error(r)) Modified: python/branches/py3k-urllib/Objects/dictobject.c ============================================================================== --- python/branches/py3k-urllib/Objects/dictobject.c (original) +++ python/branches/py3k-urllib/Objects/dictobject.c Tue Jul 1 06:02:29 2008 @@ -1845,7 +1845,7 @@ { Py_ssize_t res; - res = sizeof(PyDictObject) + sizeof(mp->ma_table); + res = sizeof(PyDictObject); if (mp->ma_table != mp->ma_smalltable) res = res + (mp->ma_mask + 1) * sizeof(PyDictEntry); return PyLong_FromSsize_t(res); Modified: python/branches/py3k-urllib/Objects/listobject.c ============================================================================== --- python/branches/py3k-urllib/Objects/listobject.c (original) +++ python/branches/py3k-urllib/Objects/listobject.c Tue Jul 1 06:02:29 2008 @@ -45,7 +45,16 @@ * system realloc(). * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ... */ - new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6) + newsize; + new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); + + /* check for integer overflow */ + if (new_allocated > PY_SIZE_MAX - newsize) { + PyErr_NoMemory(); + return -1; + } else { + new_allocated += newsize; + } + if (newsize == 0) new_allocated = 0; items = self->ob_item; @@ -118,8 +127,9 @@ return NULL; } nbytes = size * sizeof(PyObject *); - /* Check for overflow */ - if (nbytes / sizeof(PyObject *) != (size_t)size) + /* Check for overflow without an actual overflow, + * which can cause compiler to optimise out */ + if (size > PY_SIZE_MAX / sizeof(PyObject *)) return PyErr_NoMemory(); if (numfree) { numfree--; @@ -1323,6 +1333,10 @@ * we don't care what's in the block. */ merge_freemem(ms); + if (need > PY_SSIZE_T_MAX / sizeof(PyObject*)) { + PyErr_NoMemory(); + return -1; + } ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*)); if (ms->a) { ms->alloced = need; @@ -2415,6 +2429,8 @@ step = -step; } + assert(slicelength <= PY_SIZE_MAX / sizeof(PyObject*)); + garbage = (PyObject**) PyMem_MALLOC(slicelength*sizeof(PyObject*)); if (!garbage) { Modified: python/branches/py3k-urllib/Objects/longobject.c ============================================================================== --- python/branches/py3k-urllib/Objects/longobject.c (original) +++ python/branches/py3k-urllib/Objects/longobject.c Tue Jul 1 06:02:29 2008 @@ -1981,6 +1981,14 @@ goto onError; if (pend) *pend = str; + long_normalize(z); + if (ABS(Py_SIZE(z)) <= 1) { + long res = MEDIUM_VALUE(z); + if (-NSMALLPOSINTS <= res && res <= NSMALLPOSINTS) { + Py_DECREF(z); + return PyLong_FromLong(res); + } + } return (PyObject *) z; onError: Modified: python/branches/py3k-urllib/Objects/memoryobject.c ============================================================================== --- python/branches/py3k-urllib/Objects/memoryobject.c (original) +++ python/branches/py3k-urllib/Objects/memoryobject.c Tue Jul 1 06:02:29 2008 @@ -151,8 +151,11 @@ char *ptr; void (*func)(int, Py_ssize_t *, Py_ssize_t *); + if (view->ndim > PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) { + PyErr_NoMemory(); + return -1; + } - /* XXX(nnorwitz): need to check for overflow! */ indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view->ndim); if (indices == NULL) { PyErr_NoMemory(); Modified: python/branches/py3k-urllib/Objects/obmalloc.c ============================================================================== --- python/branches/py3k-urllib/Objects/obmalloc.c (original) +++ python/branches/py3k-urllib/Objects/obmalloc.c Tue Jul 1 06:02:29 2008 @@ -526,9 +526,9 @@ numarenas = maxarenas ? maxarenas << 1 : INITIAL_ARENA_OBJECTS; if (numarenas <= maxarenas) return NULL; /* overflow */ - nbytes = numarenas * sizeof(*arenas); - if (nbytes / sizeof(*arenas) != numarenas) + if (numarenas > PY_SIZE_MAX / sizeof(*arenas)) return NULL; /* overflow */ + nbytes = numarenas * sizeof(*arenas); arenaobj = (struct arena_object *)realloc(arenas, nbytes); if (arenaobj == NULL) return NULL; Modified: python/branches/py3k-urllib/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k-urllib/Objects/stringlib/formatter.h (original) +++ python/branches/py3k-urllib/Objects/stringlib/formatter.h Tue Jul 1 06:02:29 2008 @@ -313,8 +313,8 @@ as determined in _calc_integer_widths(). returns the pointer to where the digits go. */ static STRINGLIB_CHAR * -fill_number(STRINGLIB_CHAR *p_buf, const NumberFieldWidths *spec, - Py_ssize_t n_digits, STRINGLIB_CHAR fill_char) +fill_non_digits(STRINGLIB_CHAR *p_buf, const NumberFieldWidths *spec, + Py_ssize_t n_digits, STRINGLIB_CHAR fill_char) { STRINGLIB_CHAR* p_digits; @@ -557,18 +557,17 @@ pnumeric_chars += leading_chars_to_skip; } - /* Calculate the widths of the various leading and trailing parts */ - calc_number_widths(&spec, sign, n_digits, format); - if (format->type == 'n') /* Compute how many additional chars we need to allocate to hold the thousands grouping. */ - STRINGLIB_GROUPING(pnumeric_chars, n_digits, - pnumeric_chars+n_digits, + STRINGLIB_GROUPING(NULL, n_digits, n_digits, 0, &n_grouping_chars, 0); + /* Calculate the widths of the various leading and trailing parts */ + calc_number_widths(&spec, sign, n_digits + n_grouping_chars, format); + /* Allocate a new string to hold the result */ - result = STRINGLIB_NEW(NULL, spec.n_total + n_grouping_chars); + result = STRINGLIB_NEW(NULL, spec.n_total); if (!result) goto done; p = STRINGLIB_STR(result); @@ -587,21 +586,20 @@ } /* Insert the grouping, if any, after the uppercasing of 'X', so we can - ensure that grouping chars won't be affeted. */ - if (n_grouping_chars && format->type == 'n') { + ensure that grouping chars won't be affected. */ + if (n_grouping_chars) { /* We know this can't fail, since we've already reserved enough space. */ STRINGLIB_CHAR *pstart = p + n_leading_chars; - int r = STRINGLIB_GROUPING(pstart, n_digits, - pstart + n_digits, + int r = STRINGLIB_GROUPING(pstart, n_digits, n_digits, spec.n_total+n_grouping_chars-n_leading_chars, NULL, 0); assert(r); } - /* Fill in the non-digit parts */ - fill_number(p, &spec, n_digits, - format->fill_char == '\0' ? ' ' : format->fill_char); + /* Fill in the non-digit parts (padding, sign, etc.) */ + fill_non_digits(p, &spec, n_digits + n_grouping_chars, + format->fill_char == '\0' ? ' ' : format->fill_char); done: Py_XDECREF(tmp); @@ -739,9 +737,9 @@ if (result == NULL) goto done; - /* fill in the non-digit parts */ - fill_number(STRINGLIB_STR(result), &spec, n_digits, - format->fill_char == '\0' ? ' ' : format->fill_char); + /* Fill in the non-digit parts (padding, sign, etc.) */ + fill_non_digits(STRINGLIB_STR(result), &spec, n_digits, + format->fill_char == '\0' ? ' ' : format->fill_char); /* fill in the digit parts */ memmove(STRINGLIB_STR(result) + Modified: python/branches/py3k-urllib/Objects/stringlib/localeutil.h ============================================================================== --- python/branches/py3k-urllib/Objects/stringlib/localeutil.h (original) +++ python/branches/py3k-urllib/Objects/stringlib/localeutil.h Tue Jul 1 06:02:29 2008 @@ -8,10 +8,9 @@ /** * _Py_InsertThousandsGrouping: * @buffer: A pointer to the start of a string. - * @len: The length of the string. - * @plast: A pointer to the end of of the digits in the string. This - * may be before the end of the string (if the string contains - * decimals, for example). + * @n_buffer: The length of the string. + * @n_digits: The number of digits in the string, in which we want + * to put the grouping chars. * @buf_size: The maximum size of the buffer pointed to by buffer. * @count: If non-NULL, points to a variable that will receive the * number of characters we need to insert (and no formatting @@ -21,10 +20,11 @@ * string. * * Inserts thousand grouping characters (as defined in the current - * locale) into the string between buffer and plast. If count is - * non-NULL, don't do any formatting, just count the number of - * characters to insert. This is used by the caller to appropriately - * resize the buffer, if needed. + * locale) into the string between buffer and buffer+n_digits. If + * count is non-NULL, don't do any formatting, just count the number + * of characters to insert. This is used by the caller to + * appropriately resize the buffer, if needed. If count is non-NULL, + * buffer can be NULL (it is not dereferenced at all in that case). * * Return value: 0 on error, else 1. Note that no error can occur if * count is non-NULL. @@ -34,8 +34,8 @@ **/ int _Py_InsertThousandsGrouping(STRINGLIB_CHAR *buffer, - Py_ssize_t len, - STRINGLIB_CHAR *plast, + Py_ssize_t n_buffer, + Py_ssize_t n_digits, Py_ssize_t buf_size, Py_ssize_t *count, int append_zero_char) @@ -44,15 +44,22 @@ const char *grouping = locale_data->grouping; const char *thousands_sep = locale_data->thousands_sep; Py_ssize_t thousands_sep_len = strlen(thousands_sep); - STRINGLIB_CHAR *pend = buffer + len; /* current end of buffer */ - STRINGLIB_CHAR *pmax = buffer + buf_size; /* max of buffer */ + STRINGLIB_CHAR *pend = NULL; /* current end of buffer */ + STRINGLIB_CHAR *pmax = NULL; /* max of buffer */ char current_grouping; + Py_ssize_t remaining = n_digits; /* Number of chars remaining to + be looked at */ /* Initialize the character count, if we're just counting. */ if (count) *count = 0; + else { + /* We're not just counting, we're modifying buffer */ + pend = buffer + n_buffer; + pmax = buffer + buf_size; + } - /* Starting at plast and working right-to-left, keep track of + /* Starting at the end and working right-to-left, keep track of what grouping needs to be added and insert that. */ current_grouping = *grouping++; @@ -60,11 +67,11 @@ if (current_grouping == 0) return 1; - while (plast - buffer > current_grouping) { + while (remaining > current_grouping) { /* Always leave buffer and pend valid at the end of this loop, since we might leave with a return statement. */ - plast -= current_grouping; + remaining -= current_grouping; if (count) { /* We're only counting, not touching the memory. */ *count += thousands_sep_len; @@ -72,6 +79,8 @@ else { /* Do the formatting. */ + STRINGLIB_CHAR *plast = buffer + remaining; + /* Is there room to insert thousands_sep_len chars? */ if (pmax - pend < thousands_sep_len) /* No room. */ @@ -111,7 +120,7 @@ if (append_zero_char) { /* Append a zero character to mark the end of the string, if there's room. */ - if (pend - plast < 1) + if (pend - (buffer + remaining) < 1) /* No room, error. */ return 0; *pend = 0; Modified: python/branches/py3k-urllib/Objects/tupleobject.c ============================================================================== --- python/branches/py3k-urllib/Objects/tupleobject.c (original) +++ python/branches/py3k-urllib/Objects/tupleobject.c Tue Jul 1 06:02:29 2008 @@ -683,13 +683,25 @@ } +static PyObject * +tuple_sizeof(PyTupleObject *self) +{ + Py_ssize_t res; + + res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *); + return PyLong_FromSsize_t(res); +} + PyDoc_STRVAR(index_doc, "T.index(value, [start, [stop]]) -> integer -- return first index of value"); PyDoc_STRVAR(count_doc, "T.count(value) -> integer -- return number of occurrences of value"); +PyDoc_STRVAR(sizeof_doc, +"T.__sizeof__() -- size of T in memory, in bytes"); static PyMethodDef tuple_methods[] = { {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS}, + {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc}, {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc}, {"count", (PyCFunction)tuplecount, METH_O, count_doc}, {NULL, NULL} /* sentinel */ Modified: python/branches/py3k-urllib/PC/_msi.c ============================================================================== --- python/branches/py3k-urllib/PC/_msi.c (original) +++ python/branches/py3k-urllib/PC/_msi.c Tue Jul 1 06:02:29 2008 @@ -1065,5 +1065,5 @@ if (!MSIError) return NULL; PyModule_AddObject(m, "MSIError", MSIError); - return NULL; + return m; } Modified: python/branches/py3k-urllib/PCbuild/sqlite3.vcproj ============================================================================== --- python/branches/py3k-urllib/PCbuild/sqlite3.vcproj (original) +++ python/branches/py3k-urllib/PCbuild/sqlite3.vcproj Tue Jul 1 06:02:29 2008 @@ -305,6 +305,7 @@ /> PY_SIZE_MAX / sizeof(node)) { + return E_NOMEM; + } n = n1->n_child; n = (node *) PyObject_REALLOC(n, required_capacity * sizeof(node)); Modified: python/branches/py3k-urllib/Python/_warnings.c ============================================================================== --- python/branches/py3k-urllib/Python/_warnings.c (original) +++ python/branches/py3k-urllib/Python/_warnings.c Tue Jul 1 06:02:29 2008 @@ -280,6 +280,11 @@ PyObject *item = Py_None; const char *action; int rc; + + if (registry && !PyDict_Check(registry) && (registry != Py_None)) { + PyErr_SetString(PyExc_TypeError, "'registry' must be a dict"); + return NULL; + } /* Normalize module. */ if (module == NULL) { @@ -303,6 +308,8 @@ else { text = message; message = PyObject_CallFunction(category, "O", message); + if (message == NULL) + goto cleanup; } lineno_obj = PyLong_FromLong(lineno); @@ -314,7 +321,7 @@ if (key == NULL) goto cleanup; - if (registry != NULL) { + if ((registry != NULL) && (registry != Py_None)) { rc = already_warned(registry, key, 0); if (rc == -1) goto cleanup; @@ -336,12 +343,13 @@ is "always". */ rc = 0; if (strcmp(action, "always") != 0) { - if (registry != NULL && PyDict_SetItem(registry, key, Py_True) < 0) + if (registry != NULL && registry != Py_None && + PyDict_SetItem(registry, key, Py_True) < 0) goto cleanup; else if (strcmp(action, "ignore") == 0) goto return_none; else if (strcmp(action, "once") == 0) { - if (registry == NULL) { + if (registry == NULL || registry == Py_None) { registry = get_once_registry(); if (registry == NULL) goto cleanup; @@ -351,7 +359,7 @@ } else if (strcmp(action, "module") == 0) { /* registry[(text, category, 0)] = 1 */ - if (registry != NULL) + if (registry != NULL && registry != Py_None) rc = update_registry(registry, text, category, 0); } else if (strcmp(action, "default") != 0) { @@ -435,7 +443,7 @@ Py_XDECREF(text); Py_XDECREF(lineno_obj); Py_DECREF(module); - Py_DECREF(message); + Py_XDECREF(message); return result; /* Py_None or NULL. */ } Modified: python/branches/py3k-urllib/Python/asdl.c ============================================================================== --- python/branches/py3k-urllib/Python/asdl.c (original) +++ python/branches/py3k-urllib/Python/asdl.c Tue Jul 1 06:02:29 2008 @@ -5,8 +5,22 @@ asdl_seq_new(int size, PyArena *arena) { asdl_seq *seq = NULL; - size_t n = sizeof(asdl_seq) + - (size ? (sizeof(void *) * (size - 1)) : 0); + size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); + + /* check size is sane */ + if (size < 0 || size == INT_MIN || + (size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) { + PyErr_NoMemory(); + return NULL; + } + + /* check if size can be added safely */ + if (n > PY_SIZE_MAX - sizeof(asdl_seq)) { + PyErr_NoMemory(); + return NULL; + } + + n += sizeof(asdl_seq); seq = (asdl_seq *)PyArena_Malloc(arena, n); if (!seq) { @@ -22,8 +36,22 @@ asdl_int_seq_new(int size, PyArena *arena) { asdl_int_seq *seq = NULL; - size_t n = sizeof(asdl_seq) + - (size ? (sizeof(int) * (size - 1)) : 0); + size_t n = (size ? (sizeof(void *) * (size - 1)) : 0); + + /* check size is sane */ + if (size < 0 || size == INT_MIN || + (size && ((size - 1) > (PY_SIZE_MAX / sizeof(void *))))) { + PyErr_NoMemory(); + return NULL; + } + + /* check if size can be added safely */ + if (n > PY_SIZE_MAX - sizeof(asdl_seq)) { + PyErr_NoMemory(); + return NULL; + } + + n += sizeof(asdl_seq); seq = (asdl_int_seq *)PyArena_Malloc(arena, n); if (!seq) { Modified: python/branches/py3k-urllib/Python/ast.c ============================================================================== --- python/branches/py3k-urllib/Python/ast.c (original) +++ python/branches/py3k-urllib/Python/ast.c Tue Jul 1 06:02:29 2008 @@ -3145,6 +3145,9 @@ buf = (char *)s; u = NULL; } else { + /* check for integer overflow */ + if (len > PY_SIZE_MAX / 4) + return NULL; /* "\XX" may become "\u005c\uHHLL" (12 bytes) */ u = PyBytes_FromStringAndSize((char *)NULL, len * 4); if (u == NULL) Modified: python/branches/py3k-urllib/Python/compile.c ============================================================================== --- python/branches/py3k-urllib/Python/compile.c (original) +++ python/branches/py3k-urllib/Python/compile.c Tue Jul 1 06:02:29 2008 @@ -227,6 +227,10 @@ return ident; /* Don't mangle if class is just underscores */ } plen = Py_UNICODE_strlen(p); + + assert(1 <= PY_SSIZE_T_MAX - nlen); + assert(1 + nlen <= PY_SSIZE_T_MAX - plen); + ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen); if (!ident) return 0; @@ -635,6 +639,12 @@ size_t oldsize, newsize; oldsize = b->b_ialloc * sizeof(struct instr); newsize = oldsize << 1; + + if (oldsize > (PY_SIZE_MAX >> 1)) { + PyErr_NoMemory(); + return -1; + } + if (newsize == 0) { PyErr_NoMemory(); return -1; @@ -3711,6 +3721,10 @@ a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); if (!a->a_lnotab) return 0; + if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { + PyErr_NoMemory(); + return 0; + } a->a_postorder = (basicblock **)PyObject_Malloc( sizeof(basicblock *) * nblocks); if (!a->a_postorder) { @@ -3819,10 +3833,14 @@ nbytes = a->a_lnotab_off + 2 * ncodes; len = PyBytes_GET_SIZE(a->a_lnotab); if (nbytes >= len) { - if (len * 2 < nbytes) + if ((len <= INT_MAX / 2) && (len * 2 < nbytes)) len = nbytes; - else + else if (len <= INT_MAX / 2) len *= 2; + else { + PyErr_NoMemory(); + return 0; + } if (_PyBytes_Resize(&a->a_lnotab, len) < 0) return 0; } @@ -3841,10 +3859,14 @@ nbytes = a->a_lnotab_off + 2 * ncodes; len = PyBytes_GET_SIZE(a->a_lnotab); if (nbytes >= len) { - if (len * 2 < nbytes) + if ((len <= INT_MAX / 2) && len * 2 < nbytes) len = nbytes; - else + else if (len <= INT_MAX / 2) len *= 2; + else { + PyErr_NoMemory(); + return 0; + } if (_PyBytes_Resize(&a->a_lnotab, len) < 0) return 0; } @@ -3903,6 +3925,8 @@ if (i->i_lineno && !assemble_lnotab(a, i)) return 0; if (a->a_offset + size >= len) { + if (len > PY_SSIZE_T_MAX / 2) + return 0; if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0) return 0; } Modified: python/branches/py3k-urllib/Python/marshal.c ============================================================================== --- python/branches/py3k-urllib/Python/marshal.c (original) +++ python/branches/py3k-urllib/Python/marshal.c Tue Jul 1 06:02:29 2008 @@ -70,7 +70,7 @@ size = PyBytes_Size(p->str); newsize = size + size + 1024; if (newsize > 32*1024*1024) { - newsize = size + 1024*1024; + newsize = size + (size >> 3); /* 12.5% overallocation */ } if (_PyBytes_Resize(&p->str, newsize) != 0) { p->ptr = p->end = NULL; @@ -1191,7 +1191,7 @@ {NULL, NULL} /* sentinel */ }; -static struct PyModuleDef impmodule = { +static struct PyModuleDef marshalmodule = { PyModuleDef_HEAD_INIT, "marshal", NULL, @@ -1208,7 +1208,7 @@ PyMODINIT_FUNC PyMarshal_Init(void) { - PyObject *mod = PyModule_Create(&impmodule); + PyObject *mod = PyModule_Create(&marshalmodule); if (mod == NULL) return NULL; PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION); Modified: python/branches/py3k-urllib/Python/pystrtod.c ============================================================================== --- python/branches/py3k-urllib/Python/pystrtod.c (original) +++ python/branches/py3k-urllib/Python/pystrtod.c Tue Jul 1 06:02:29 2008 @@ -364,8 +364,8 @@ /* At this point, p points just past the right-most character we want to format. We need to add the grouping string for the characters between buffer and p. */ - return _PyBytes_InsertThousandsGrouping(buffer, len, p, - buf_size, NULL, 1); + return _PyBytes_InsertThousandsGrouping(buffer, len, p-buffer, + buf_size, NULL, 1); } /* see FORMATBUFLEN in unicodeobject.c */ Modified: python/branches/py3k-urllib/README ============================================================================== --- python/branches/py3k-urllib/README (original) +++ python/branches/py3k-urllib/README Tue Jul 1 06:02:29 2008 @@ -1,5 +1,5 @@ -This is Python version 3.0 alpha 5 -================================== +This is Python version 3.0 beta 1 +================================= For notes specific to this release, see RELNOTES in this directory. Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 @@ -22,7 +22,7 @@ ---------------- The release plan is to have a series of alpha releases in 2007 and 2008, -beta releases in 2008, and a final release in August 2008. The alpha +beta releases in 2008, and a final release in September 2008. The alpha releases are primarily aimed at developers who want a sneak peek at the new langauge, especially those folks who plan to port their code to Python 3000. The hope is that by the time of the final release, many Modified: python/branches/py3k-urllib/RELNOTES ============================================================================== --- python/branches/py3k-urllib/RELNOTES (original) +++ python/branches/py3k-urllib/RELNOTES Tue Jul 1 06:02:29 2008 @@ -6,6 +6,12 @@ Please report bugs to http://bugs.python.org/. +Version 3.0b1 - Release Date 18-Jun-2008 +---------------------------------------- + +Please search the bug tracker for critical issues in Python 3.0. + + Version 3.0a5 - Release Date 08-May-2008 ---------------------------------------- Modified: python/branches/py3k-urllib/Tools/buildbot/external-amd64.bat ============================================================================== --- python/branches/py3k-urllib/Tools/buildbot/external-amd64.bat (original) +++ python/branches/py3k-urllib/Tools/buildbot/external-amd64.bat Tue Jul 1 06:02:29 2008 @@ -12,7 +12,7 @@ ) if not exist tcltk64\bin\tk85g.dll ( - cd tk-8.5.2.1\win + cd tk-8.5.2.0\win nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.2.1 clean nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.2.1 all nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.2.1 install Modified: python/branches/py3k-urllib/Tools/faqwiz/faqwiz.py ============================================================================== --- python/branches/py3k-urllib/Tools/faqwiz/faqwiz.py (original) +++ python/branches/py3k-urllib/Tools/faqwiz/faqwiz.py Tue Jul 1 06:02:29 2008 @@ -138,8 +138,8 @@ value = cookies[COOKIE_NAME] except KeyError: return {} - import urllib - value = urllib.unquote(value) + import urllib.parse + value = urllib.parse.unquote(value) words = value.split('/') while len(words) < 3: words.append('') @@ -153,8 +153,8 @@ def send_my_cookie(ui): name = COOKIE_NAME value = "%s/%s/%s" % (ui.author, ui.email, ui.password) - import urllib - value = urllib.quote(value) + import urllib.parse + value = urllib.parse.quote(value) then = now + COOKIE_LIFETIME gmt = time.gmtime(then) path = os.environ.get('SCRIPT_NAME', '/cgi-bin/') Modified: python/branches/py3k-urllib/Tools/msi/msi.py ============================================================================== --- python/branches/py3k-urllib/Tools/msi/msi.py (original) +++ python/branches/py3k-urllib/Tools/msi/msi.py Tue Jul 1 06:02:29 2008 @@ -92,7 +92,8 @@ '_ctypes.pyd', '_ctypes_test.pyd', '_sqlite3.pyd', - '_hashlib.pyd' + '_hashlib.pyd', + '_multiprocessing.pyd' ] # Well-known component UUIDs Modified: python/branches/py3k-urllib/Tools/msi/msilib.py ============================================================================== --- python/branches/py3k-urllib/Tools/msi/msilib.py (original) +++ python/branches/py3k-urllib/Tools/msi/msilib.py Tue Jul 1 06:02:29 2008 @@ -284,7 +284,8 @@ def init_database(name, schema, ProductName, ProductCode, ProductVersion, - Manufacturer): + Manufacturer, + request_uac = False): try: os.unlink(name) except OSError: @@ -306,7 +307,11 @@ si.SetProperty(PID_AUTHOR, Manufacturer) si.SetProperty(PID_TEMPLATE, msi_type) si.SetProperty(PID_REVNUMBER, gen_uuid()) - si.SetProperty(PID_WORDCOUNT, 2) # long file names, compressed, original media + if request_uac: + wc = 2 # long file names, compressed, original media + else: + wc = 2 | 8 # +never invoke UAC + si.SetProperty(PID_WORDCOUNT, wc) si.SetProperty(PID_PAGECOUNT, 200) si.SetProperty(PID_APPNAME, "Python MSI Library") # XXX more properties Modified: python/branches/py3k-urllib/Tools/versioncheck/pyversioncheck.py ============================================================================== --- python/branches/py3k-urllib/Tools/versioncheck/pyversioncheck.py (original) +++ python/branches/py3k-urllib/Tools/versioncheck/pyversioncheck.py Tue Jul 1 06:02:29 2008 @@ -1,5 +1,5 @@ """pyversioncheck - Module to help with checking versions""" -import urllib +import urllib.request import email import sys @@ -47,7 +47,7 @@ if verbose >= VERBOSE_EACHFILE: print(' Checking %s'%url) try: - fp = urllib.urlopen(url) + fp = urllib.request.urlopen(url) except IOError as arg: if verbose >= VERBOSE_EACHFILE: print(' Cannot open:', arg) Modified: python/branches/py3k-urllib/Tools/webchecker/webchecker.py ============================================================================== --- python/branches/py3k-urllib/Tools/webchecker/webchecker.py (original) +++ python/branches/py3k-urllib/Tools/webchecker/webchecker.py Tue Jul 1 06:02:29 2008 @@ -113,13 +113,13 @@ import getopt import pickle -import urllib -import urlparse +import urllib.request +import urllib.parse as urlparse import sgmllib import cgi import mimetypes -import robotparser +from urllib import robotparser # Extract real version number if necessary if __version__[0] == '$': @@ -487,7 +487,7 @@ if url in self.name_table: return self.name_table[url] - scheme, path = urllib.splittype(url) + scheme, path = urllib.request.splittype(url) if scheme in ('mailto', 'news', 'javascript', 'telnet'): self.note(1, " Not checking %s URL" % scheme) return None @@ -733,13 +733,13 @@ return self.__url -class MyURLopener(urllib.FancyURLopener): +class MyURLopener(urllib.request.FancyURLopener): - http_error_default = urllib.URLopener.http_error_default + http_error_default = urllib.request.URLopener.http_error_default def __init__(*args): self = args[0] - urllib.FancyURLopener.__init__(*args) + urllib.request.FancyURLopener.__init__(*args) self.addheaders = [ ('User-agent', 'Python-webchecker/%s' % __version__), ] @@ -769,7 +769,7 @@ s.write('%s\n' % (q, q)) s.seek(0) return s - return urllib.FancyURLopener.open_file(self, url) + return urllib.request.FancyURLopener.open_file(self, url) class MyHTMLParser(sgmllib.SGMLParser): Modified: python/branches/py3k-urllib/Tools/webchecker/websucker.py ============================================================================== --- python/branches/py3k-urllib/Tools/webchecker/websucker.py (original) +++ python/branches/py3k-urllib/Tools/webchecker/websucker.py Tue Jul 1 06:02:29 2008 @@ -6,8 +6,8 @@ import os import sys -import urllib import getopt +import urllib.parse import webchecker @@ -87,11 +87,11 @@ self.message("didn't save %s: %s", path, str(msg)) def savefilename(self, url): - type, rest = urllib.splittype(url) - host, path = urllib.splithost(rest) + type, rest = urllib.parse.splittype(url) + host, path = urllib.parse.splithost(rest) path = path.lstrip("/") - user, host = urllib.splituser(host) - host, port = urllib.splitnport(host) + user, host = urllib.parse.splituser(host) + host, port = urllib.parse.splitnport(host) host = host.lower() if not path or path[-1] == "/": path = path + "index.html" Modified: python/branches/py3k-urllib/setup.py ============================================================================== --- python/branches/py3k-urllib/setup.py (original) +++ python/branches/py3k-urllib/setup.py Tue Jul 1 06:02:29 2008 @@ -656,6 +656,7 @@ # have issues on many platforms. I've temporarily # disabled 4.6 to see what the odd platform # buildbots say. + max_db_ver = (4, 7) # XXX(matthias.klose): test with 4.7 on some buildds min_db_ver = (3, 3) db_setup_debug = False # verbose debug prints from this script? @@ -1176,8 +1177,6 @@ Extension('_gestalt', ['_gestalt.c'], extra_link_args=['-framework', 'Carbon']) ) - else: - missing.append('_gestalt') self.extensions.extend(exts) From python-3000-checkins at python.org Tue Jul 1 06:07:17 2008 From: python-3000-checkins at python.org (senthil.kumaran) Date: Tue, 1 Jul 2008 06:07:17 +0200 (CEST) Subject: [Python-3000-checkins] r64610 - in python/branches/py3k-urllib: Doc/library/cgi.rst Doc/library/urllib.parse.rst Lib/cgi.py Lib/test/test_cgi.py Lib/test/test_urlparse.py Lib/urllib/parse.py Message-ID: <20080701040717.258401E4002@bag.python.org> Author: senthil.kumaran Date: Tue Jul 1 06:07:16 2008 New Revision: 64610 Log: issue600362 fixed in the branch Modified: python/branches/py3k-urllib/Doc/library/cgi.rst python/branches/py3k-urllib/Doc/library/urllib.parse.rst python/branches/py3k-urllib/Lib/cgi.py python/branches/py3k-urllib/Lib/test/test_cgi.py python/branches/py3k-urllib/Lib/test/test_urlparse.py python/branches/py3k-urllib/Lib/urllib/parse.py Modified: python/branches/py3k-urllib/Doc/library/cgi.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/cgi.rst (original) +++ python/branches/py3k-urllib/Doc/library/cgi.rst Tue Jul 1 06:07:16 2008 @@ -255,49 +255,7 @@ Parse a query in the environment or from a file (the file defaults to ``sys.stdin``). The *keep_blank_values* and *strict_parsing* parameters are - passed to :func:`parse_qs` unchanged. - - -.. function:: parse_qs(qs[, keep_blank_values[, strict_parsing]]) - - Parse a query string given as a string argument (data of type - :mimetype:`application/x-www-form-urlencoded`). Data are returned as a - dictionary. The dictionary keys are the unique query variable names and the - values are lists of values for each name. - - The optional argument *keep_blank_values* is a flag indicating whether blank - values in URL encoded queries should be treated as blank strings. A true value - indicates that blanks should be retained as blank strings. The default false - value indicates that blank values are to be ignored and treated as if they were - not included. - - The optional argument *strict_parsing* is a flag indicating what to do with - parsing errors. If false (the default), errors are silently ignored. If true, - errors raise a :exc:`ValueError` exception. - - Use the :func:`urllib.urlencode` function to convert such dictionaries into - query strings. - - -.. function:: parse_qsl(qs[, keep_blank_values[, strict_parsing]]) - - Parse a query string given as a string argument (data of type - :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of - name, value pairs. - - The optional argument *keep_blank_values* is a flag indicating whether blank - values in URL encoded queries should be treated as blank strings. A true value - indicates that blanks should be retained as blank strings. The default false - value indicates that blank values are to be ignored and treated as if they were - not included. - - The optional argument *strict_parsing* is a flag indicating what to do with - parsing errors. If false (the default), errors are silently ignored. If true, - errors raise a :exc:`ValueError` exception. - - Use the :func:`urllib.urlencode` function to convert such lists of pairs into - query strings. - + passed to :func:`urllib.parse.parse_qs` unchanged. .. function:: parse_multipart(fp, pdict) @@ -305,7 +263,7 @@ Arguments are *fp* for the input file and *pdict* for a dictionary containing other parameters in the :mailheader:`Content-Type` header. - Returns a dictionary just like :func:`parse_qs` keys are the field names, each + Returns a dictionary just like :func:`urllib.parse.parse_qs` keys are the field names, each value is a list of values for that field. This is easy to use but not much good if you are expecting megabytes to be uploaded --- in that case, use the :class:`FieldStorage` class instead which is much more flexible. Modified: python/branches/py3k-urllib/Doc/library/urllib.parse.rst ============================================================================== --- python/branches/py3k-urllib/Doc/library/urllib.parse.rst (original) +++ python/branches/py3k-urllib/Doc/library/urllib.parse.rst Tue Jul 1 06:07:16 2008 @@ -98,6 +98,46 @@ states that these are equivalent). +.. function:: parse_qs(qs[, keep_blank_values[, strict_parsing]]) + + Parse a query string given as a string argument (data of type + :mimetype:`application/x-www-form-urlencoded`). Data are returned as a + dictionary. The dictionary keys are the unique query variable names and the + values are lists of values for each name. + + The optional argument *keep_blank_values* is a flag indicating whether blank + values in URL encoded queries should be treated as blank strings. A true value + indicates that blanks should be retained as blank strings. The default false + value indicates that blank values are to be ignored and treated as if they were + not included. + + The optional argument *strict_parsing* is a flag indicating what to do with + parsing errors. If false (the default), errors are silently ignored. If true, + errors raise a :exc:`ValueError` exception. + + Use the :func:`urllib.parse.urlencode` function to convert such dictionaries into + query strings. + + +.. function:: parse_qsl(qs[, keep_blank_values[, strict_parsing]]) + + Parse a query string given as a string argument (data of type + :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of + name, value pairs. + + The optional argument *keep_blank_values* is a flag indicating whether blank + values in URL encoded queries should be treated as blank strings. A true value + indicates that blanks should be retained as blank strings. The default false + value indicates that blank values are to be ignored and treated as if they were + not included. + + The optional argument *strict_parsing* is a flag indicating what to do with + parsing errors. If false (the default), errors are silently ignored. If true, + errors raise a :exc:`ValueError` exception. + + Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into + query strings. + .. function:: urlsplit(urlstring[, default_scheme[, allow_fragments]]) This is similar to :func:`urlparse`, but does not split the params from the URL. Modified: python/branches/py3k-urllib/Lib/cgi.py ============================================================================== --- python/branches/py3k-urllib/Lib/cgi.py (original) +++ python/branches/py3k-urllib/Lib/cgi.py Tue Jul 1 06:07:16 2008 @@ -155,74 +155,6 @@ environ['QUERY_STRING'] = qs # XXX Shouldn't, really return parse_qs(qs, keep_blank_values, strict_parsing) - -def parse_qs(qs, keep_blank_values=0, strict_parsing=0): - """Parse a query given as a string argument. - - Arguments: - - qs: URL-encoded query string to be parsed - - keep_blank_values: flag indicating whether blank values in - URL encoded queries should be treated as blank strings. - A true value indicates that blanks should be retained as - blank strings. The default false value indicates that - blank values are to be ignored and treated as if they were - not included. - - strict_parsing: flag indicating what to do with parsing errors. - If false (the default), errors are silently ignored. - If true, errors raise a ValueError exception. - """ - dict = {} - for name, value in parse_qsl(qs, keep_blank_values, strict_parsing): - if name in dict: - dict[name].append(value) - else: - dict[name] = [value] - return dict - -def parse_qsl(qs, keep_blank_values=0, strict_parsing=0): - """Parse a query given as a string argument. - - Arguments: - - qs: URL-encoded query string to be parsed - - keep_blank_values: flag indicating whether blank values in - URL encoded queries should be treated as blank strings. A - true value indicates that blanks should be retained as blank - strings. The default false value indicates that blank values - are to be ignored and treated as if they were not included. - - strict_parsing: flag indicating what to do with parsing errors. If - false (the default), errors are silently ignored. If true, - errors raise a ValueError exception. - - Returns a list, as G-d intended. - """ - pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] - r = [] - for name_value in pairs: - if not name_value and not strict_parsing: - continue - nv = name_value.split('=', 1) - if len(nv) != 2: - if strict_parsing: - raise ValueError("bad query field: %r" % (name_value,)) - # Handle case of a control-name with no equal sign - if keep_blank_values: - nv.append('') - else: - continue - if len(nv[1]) or keep_blank_values: - name = urllib.parse.unquote(nv[0].replace('+', ' ')) - value = urllib.parse.unquote(nv[1].replace('+', ' ')) - r.append((name, value)) - - return r - - def parse_multipart(fp, pdict): """Parse multipart input. @@ -343,6 +275,10 @@ pdict[name] = value return key, pdict +# parse query string functions from urllib.parse +parse_qs = urllib.parse.parse_qs +parse_qsl = urllib.parse.parse_qsl + # Classes for field storage # ========================= Modified: python/branches/py3k-urllib/Lib/test/test_cgi.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_cgi.py (original) +++ python/branches/py3k-urllib/Lib/test/test_cgi.py Tue Jul 1 06:07:16 2008 @@ -56,20 +56,6 @@ # A list of test cases. Each test case is a a two-tuple that contains # a string with the query and a dictionary with the expected result. -parse_qsl_test_cases = [ - ("", []), - ("&", []), - ("&&", []), - ("=", [('', '')]), - ("=a", [('', 'a')]), - ("a", [('a', '')]), - ("a=", [('a', '')]), - ("a=", [('a', '')]), - ("&a=b", [('a', 'b')]), - ("a=a+b&b=b+c", [('a', 'a b'), ('b', 'b c')]), - ("a=1&a=2", [('a', '1'), ('a', '2')]), -] - parse_strict_test_cases = [ ("", ValueError("bad query field: ''")), ("&", ValueError("bad query field: ''")), @@ -129,10 +115,6 @@ class CgiTests(unittest.TestCase): - def test_qsl(self): - for orig, expect in parse_qsl_test_cases: - result = cgi.parse_qsl(orig, keep_blank_values=True) - self.assertEqual(result, expect, "Error parsing %s" % repr(orig)) def test_strict(self): for orig, expect in parse_strict_test_cases: Modified: python/branches/py3k-urllib/Lib/test/test_urlparse.py ============================================================================== --- python/branches/py3k-urllib/Lib/test/test_urlparse.py (original) +++ python/branches/py3k-urllib/Lib/test/test_urlparse.py Tue Jul 1 06:07:16 2008 @@ -7,6 +7,24 @@ RFC1808_BASE = "http://a/b/c/d;p?q#f" RFC2396_BASE = "http://a/b/c/d;p?q" +# parse query string test cases. Each test case is a two-tuple that contains a +# string with the query and a dictionary with the expected results. + +parse_qsl_test_cases = [ + ("", []), + ("&", []), + ("&&", []), + ("=", [('', '')]), + ("=a", [('', 'a')]), + ("a", [('a', '')]), + ("a=", [('a', '')]), + ("a=", [('a', '')]), + ("&a=b", [('a', 'b')]), + ("a=a+b&b=b+c", [('a', 'a b'), ('b', 'b c')]), + ("a=1&a=2", [('a', '1'), ('a', '2')]), +] + + class UrlParseTestCase(unittest.TestCase): def checkRoundtrips(self, url, parsed, split): @@ -309,6 +327,10 @@ # Issue 1637: http://foo.com?query is legal self.assertEqual(urllib.parse.urlparse("http://example.com?blahblah=/foo"), ('http', 'example.com', '', '', 'blahblah=/foo', '')) + def test_qsl(self): + for orig, expect in parse_qsl_test_cases: + result = urllib.parse.parse_qsl(orig, keep_blank_values=True) + self.assertEqual(result, expect, "Error parsing %s" % repr(orig)) def test_main(): support.run_unittest(UrlParseTestCase) Modified: python/branches/py3k-urllib/Lib/urllib/parse.py ============================================================================== --- python/branches/py3k-urllib/Lib/urllib/parse.py (original) +++ python/branches/py3k-urllib/Lib/urllib/parse.py Tue Jul 1 06:07:16 2008 @@ -5,7 +5,7 @@ """ __all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", - "urlsplit", "urlunsplit"] + "urlsplit", "urlunsplit","parse_qs","parse_qsl"] # A classification of schemes ('' means apply by default) uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap', @@ -338,6 +338,74 @@ return s.replace(' ', '+') return quote(s, safe) +def parse_qs(qs, keep_blank_values=0, strict_parsing=0): + """Parse a query given as a string argument. + + Arguments: + + qs: URL-encoded query string to be parsed + + keep_blank_values: flag indicating whether blank values in + URL encoded queries should be treated as blank strings. + A true value indicates that blanks should be retained as + blank strings. The default false value indicates that + blank values are to be ignored and treated as if they were + not included. + + strict_parsing: flag indicating what to do with parsing errors. + If false (the default), errors are silently ignored. + If true, errors raise a ValueError exception. + """ + dict = {} + for name, value in parse_qsl(qs, keep_blank_values, strict_parsing): + if name in dict: + dict[name].append(value) + else: + dict[name] = [value] + return dict + +def parse_qsl(qs, keep_blank_values=0, strict_parsing=0): + """Parse a query given as a string argument. + + Arguments: + + qs: URL-encoded query string to be parsed + + keep_blank_values: flag indicating whether blank values in + URL encoded queries should be treated as blank strings. A + true value indicates that blanks should be retained as blank + strings. The default false value indicates that blank values + are to be ignored and treated as if they were not included. + + strict_parsing: flag indicating what to do with parsing errors. If + false (the default), errors are silently ignored. If true, + errors raise a ValueError exception. + + Returns a list, as G-d intended. + """ + pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] + r = [] + for name_value in pairs: + if not name_value and not strict_parsing: + continue + nv = name_value.split('=', 1) + if len(nv) != 2: + if strict_parsing: + raise ValueError("bad query field: %r" % (name_value,)) + # Handle case of a control-name with no equal sign + if keep_blank_values: + nv.append('') + else: + continue + if len(nv[1]) or keep_blank_values: + name = unquote(nv[0].replace('+', ' ')) + value = unquote(nv[1].replace('+', ' ')) + r.append((name, value)) + + return r + + + def urlencode(query,doseq=0): """Encode a sequence of two-element tuples or dictionary into a URL query string. From python-3000-checkins at python.org Tue Jul 1 16:42:32 2008 From: python-3000-checkins at python.org (mark.summerfield) Date: Tue, 1 Jul 2008 16:42:32 +0200 (CEST) Subject: [Python-3000-checkins] r64615 - in python/branches/py3k/Doc: reference/datamodel.rst whatsnew/3.0.rst Message-ID: <20080701144232.13ED61E400D@bag.python.org> Author: mark.summerfield Date: Tue Jul 1 16:42:30 2008 New Revision: 64615 Log: - removed sentence about the new free format floating-point representation since I believe that's been abandoned. - added __round__() to datamodel page's list of numeric special methods. Modified: python/branches/py3k/Doc/reference/datamodel.rst python/branches/py3k/Doc/whatsnew/3.0.rst Modified: python/branches/py3k/Doc/reference/datamodel.rst ============================================================================== --- python/branches/py3k/Doc/reference/datamodel.rst (original) +++ python/branches/py3k/Doc/reference/datamodel.rst Tue Jul 1 16:42:30 2008 @@ -1803,14 +1803,17 @@ .. method:: object.__complex__(self) object.__int__(self) object.__float__(self) + object.__round__(self, [,n]) .. index:: builtin: complex builtin: int builtin: float + builtin: round - Called to implement the built-in functions :func:`complex`, :func:`int` - and :func:`float`. Should return a value of the appropriate type. + Called to implement the built-in functions :func:`complex`, + :func:`int`, :func:`float` and :func:`round`. Should return a value + of the appropriate type. .. method:: object.__index__(self) Modified: python/branches/py3k/Doc/whatsnew/3.0.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/3.0.rst (original) +++ python/branches/py3k/Doc/whatsnew/3.0.rst Tue Jul 1 16:42:30 2008 @@ -342,10 +342,6 @@ * :func:`exec` is now a function. -* There is a new free format floating point representation, which is based on - "Floating-Point Printer Sample Code", by Robert G. Burger. ``repr(11./5)`` - now returns ``2.2`` instead of ``2.2000000000000002``. - * The :meth:`__oct__` and :meth:`__hex__` special methods are removed -- :func:`oct` and :func:`hex` use :meth:`__index__` now to convert the argument to an integer. From python-3000-checkins at python.org Tue Jul 1 16:42:56 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 16:42:56 +0200 (CEST) Subject: [Python-3000-checkins] r64616 - python/branches/py3k/Makefile.pre.in Message-ID: <20080701144256.D1F5A1E400D@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 16:42:51 2008 New Revision: 64616 Log: fix syntax Modified: python/branches/py3k/Makefile.pre.in Modified: python/branches/py3k/Makefile.pre.in ============================================================================== --- python/branches/py3k/Makefile.pre.in (original) +++ python/branches/py3k/Makefile.pre.in Tue Jul 1 16:42:51 2008 @@ -1014,7 +1014,7 @@ fi; \ done $(LN) -fsn include/python$(VERSION) $(DESTDIR)$(prefix)/Headers - sed 's/%VERSION%/'"`$(RUNSHARED) ./$(BUILDPYTHON) -c 'import platform; print platform.python_version()'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(prefix)/Resources/Info.plist + sed 's/%VERSION%/'"`$(RUNSHARED) ./$(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(prefix)/Resources/Info.plist $(LN) -fsn $(VERSION) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/Current $(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/$(PYTHONFRAMEWORK) $(LN) -fsn Versions/Current/Headers $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers From python-3000-checkins at python.org Tue Jul 1 17:50:05 2008 From: python-3000-checkins at python.org (mark.summerfield) Date: Tue, 1 Jul 2008 17:50:05 +0200 (CEST) Subject: [Python-3000-checkins] r64617 - python/branches/py3k/Doc/library/stdtypes.rst Message-ID: <20080701155005.3699E1E4002@bag.python.org> Author: mark.summerfield Date: Tue Jul 1 17:50:04 2008 New Revision: 64617 Log: - No more 0L or similar. - Added cross-refs to fraction & decimal in numeric types. - Moved str.isdecimal() & str.isnumeric() into alphabetical order like all the other str methods; also massaged the text a bit to make it more consistent with the similar methods' texts. BTW The iterator.__iter__() docs seems to be out of step with functions.rst (where it now has an extra parameter). Modified: python/branches/py3k/Doc/library/stdtypes.rst Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Tue Jul 1 17:50:04 2008 @@ -46,7 +46,7 @@ * ``False`` -* zero of any numeric type, for example, ``0``, ``0L``, ``0.0``, ``0j``. +* zero of any numeric type, for example, ``0``, ``0.0``, ``0j``. * any empty sequence, for example, ``''``, ``()``, ``[]``. @@ -216,15 +216,17 @@ object: complex number pair: C; language -There are three distinct numeric types: :dfn:`integers`, :dfn:`floating point -numbers`, and :dfn:`complex numbers`. In addition, Booleans are a subtype of -integers. Integers have unlimited precision. Floating point numbers are -implemented using :ctype:`double` in C. All bets on their precision are off -unless you happen to know the machine you are working with. - -Complex numbers have a real and imaginary part, which are each implemented using -:ctype:`double` in C. To extract these parts from a complex number *z*, use -``z.real`` and ``z.imag``. +There are three distinct numeric types: :dfn:`integers`, :dfn:`floating +point numbers`, and :dfn:`complex numbers`. In addition, Booleans are a +subtype of integers. Integers have unlimited precision. Floating point +numbers are implemented using :ctype:`double` in C---all bets on their +precision are off unless you happen to know the machine you are working +with. Complex numbers have a real and imaginary part, which are each +implemented using :ctype:`double` in C. To extract these parts from a +complex number *z*, use ``z.real`` and ``z.imag``. (The standard library +includes additional numeric types, :mod:`fractions` that hold rationals, +and :mod:`decimal` that hold floating-point numbers with user-definable +precision.) .. index:: pair: numeric; literals @@ -356,6 +358,9 @@ | ``math.ceil(x)`` | the least Integral >= *x* | | +--------------------+--------------------------------+--------+ +For additional numeric operations see the :mod:`math` and :mod:`cmath` +modules. + .. XXXJH exceptions: overflow (when? what operations?) zerodivision @@ -756,6 +761,15 @@ one character, false otherwise. +.. method:: str.isdecimal() + + Return true if all characters in the string are decimal + characters and there is at least one character, false + otherwise. Decimal characters include digit characters, and all characters + that that can be used to form decimal-radix numbers, e.g. U+0660, + ARABIC-INDIC DIGIT ZERO. + + .. method:: str.isdigit() Return true if all characters in the string are digits and there is at least one @@ -774,6 +788,15 @@ least one cased character, false otherwise. +.. method:: str.isnumeric() + + Return true if all characters in the string are numeric + characters, and there is at least one character, false + otherwise. Numeric characters include digit characters, and all characters + that have the Unicode numeric value property, e.g. U+2155, + VULGAR FRACTION ONE FIFTH. + + .. method:: str.isprintable() Return true if all characters in the string are printable or the string is @@ -1017,22 +1040,6 @@ returned if *width* is less than ``len(s)``. -.. method:: str.isnumeric() - - Return ``True`` if there are only numeric characters in S, ``False`` - otherwise. Numeric characters include digit characters, and all characters - that have the Unicode numeric value property, e.g. U+2155, - VULGAR FRACTION ONE FIFTH. - - -.. method:: str.isdecimal() - - Return ``True`` if there are only decimal characters in S, ``False`` - otherwise. Decimal characters include digit characters, and all characters - that that can be used to form decimal-radix numbers, e.g. U+0660, - ARABIC-INDIC DIGIT ZERO. - - .. _old-string-formatting: From python-3000-checkins at python.org Tue Jul 1 20:23:10 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 20:23:10 +0200 (CEST) Subject: [Python-3000-checkins] r64618 - in python/branches/py3k: Mac/Demo Mac/IDLE/IDLE.app Mac/IDLE/IDLE.app/Contents Mac/IDLE/IDLE.app/Contents/Info.plist Mac/IDLE/IDLE.app/Contents/MacOS Mac/IDLE/IDLE.app/Contents/MacOS/IDLE Mac/IDLE/IDLE.app/Contents/MacOS/Python Mac/IDLE/IDLE.app/Contents/PkgInfo Mac/IDLE/IDLE.app/Contents/Resources Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py Mac/IDLE/Info.plist.in Mac/IDLE/Makefile.in Mac/IDLE/config-extensions.def Mac/IDLE/config-main.def Mac/Makefile.in Mac/PythonLauncher/Makefile.in Mac/PythonLauncher/Python Launcher.app Mac/PythonLauncher/Python Launcher.app/Contents Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo Mac/PythonLauncher/Python Launcher.app/Contents/Resources Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist Mac/README Mac/Tools/fixapplepython23.py Mac/scripts Makefile.pre.in Misc/NEWS configure configure.in Message-ID: <20080701182310.EF3D91E4002@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 20:23:09 2008 New Revision: 64618 Log: Hopefully fix make framework install on Mac (see 3174) Removal of the Mac modules broke many of the Mac scripts (including BuildApplet.py) so the building of the Python launcher and IDLE.app was broken. I manually copied built versions of those apps into Mac. Everything else which used Mac modules had to die. Added: python/branches/py3k/Mac/IDLE/IDLE.app/ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Info.plist (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/PkgInfo (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns (contents, props changed) python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib (contents, props changed) python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist (contents, props changed) Removed: python/branches/py3k/Mac/Demo/ python/branches/py3k/Mac/IDLE/Info.plist.in python/branches/py3k/Mac/IDLE/Makefile.in python/branches/py3k/Mac/IDLE/config-extensions.def python/branches/py3k/Mac/IDLE/config-main.def python/branches/py3k/Mac/scripts/ Modified: python/branches/py3k/Mac/Makefile.in python/branches/py3k/Mac/PythonLauncher/Makefile.in python/branches/py3k/Mac/README python/branches/py3k/Mac/Tools/fixapplepython23.py python/branches/py3k/Makefile.pre.in python/branches/py3k/Misc/NEWS python/branches/py3k/configure python/branches/py3k/configure.in Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Info.plist ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Info.plist Tue Jul 1 20:23:09 2008 @@ -0,0 +1,57 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + py + pyw + + CFBundleTypeIconFile + PythonSource.icns + CFBundleTypeName + Python Script + CFBundleTypeRole + Editor + + + CFBundleTypeExtensions + + pyc + pyo + + CFBundleTypeIconFile + PythonCompiled.icns + CFBundleTypeName + Python Bytecode Document + CFBundleTypeRole + Editor + + + CFBundleExecutable + IDLE + CFBundleGetInfoString + 2.6.0, ? 001-2006 Python Software Foundation + CFBundleIconFile + IDLE.icns + CFBundleIdentifier + org.python.IDLE + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + IDLE + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.6.0 + CFBundleSignature + ???? + CFBundleVersion + 2.6.0 + + Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE Tue Jul 1 20:23:09 2008 @@ -0,0 +1,23 @@ +#!/Library/Frameworks/Python.framework/Versions/3.0/Resources/Python.app/Contents/MacOS/Python + +import sys, os +execdir = os.path.dirname(sys.argv[0]) +executable = os.path.join(execdir, "Python") +resdir = os.path.join(os.path.dirname(execdir), "Resources") +libdir = os.path.join(os.path.dirname(execdir), "Frameworks") +mainprogram = os.path.join(resdir, "idlemain.py") + +sys.argv.insert(1, mainprogram) +if 0 or 0: + os.environ["PYTHONPATH"] = resdir + if 0: + os.environ["PYTHONHOME"] = resdir +else: + pypath = os.getenv("PYTHONPATH", "") + if pypath: + pypath = ":" + pypath + os.environ["PYTHONPATH"] = resdir + pypath +os.environ["PYTHONEXECUTABLE"] = executable +os.environ["DYLD_LIBRARY_PATH"] = libdir +os.environ["DYLD_FRAMEWORK_PATH"] = libdir +os.execve(executable, sys.argv, os.environ) Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python Tue Jul 1 20:23:09 2008 @@ -0,0 +1 @@ +link /Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python \ No newline at end of file Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/PkgInfo ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/PkgInfo Tue Jul 1 20:23:09 2008 @@ -0,0 +1 @@ +APPL???? \ No newline at end of file Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns ============================================================================== Binary file. No diff available. Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns ============================================================================== Binary file. No diff available. Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns ============================================================================== Binary file. No diff available. Added: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py Tue Jul 1 20:23:09 2008 @@ -0,0 +1,30 @@ +""" +Bootstrap script for IDLE as an application bundle. +""" +import sys, os + +from idlelib.PyShell import main + +# Change the current directory the user's home directory, that way we'll get +# a more useful default location in the open/save dialogs. +os.chdir(os.path.expanduser('~/Documents')) + + +# Make sure sys.executable points to the python interpreter inside the +# framework, instead of at the helper executable inside the application +# bundle (the latter works, but doesn't allow access to the window server) +if sys.executable.endswith('-32'): + sys.executable = os.path.join(sys.prefix, 'bin', 'python-32') +else: + sys.executable = os.path.join(sys.prefix, 'bin', 'python') + +# Look for the -psn argument that the launcher adds and remove it, it will +# only confuse the IDLE startup code. +for idx, value in enumerate(sys.argv): + if value.startswith('-psn_'): + del sys.argv[idx] + break + +#argvemulator.ArgvCollector().mainloop() +if __name__ == '__main__': + main() Deleted: python/branches/py3k/Mac/IDLE/Info.plist.in ============================================================================== --- python/branches/py3k/Mac/IDLE/Info.plist.in Tue Jul 1 20:23:09 2008 +++ (empty file) @@ -1,55 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - py - pyw - - CFBundleTypeIconFile - PythonSource.icns - CFBundleTypeName - Python Script - CFBundleTypeRole - Editor - - - CFBundleTypeExtensions - - pyc - pyo - - CFBundleTypeIconFile - PythonCompiled.icns - CFBundleTypeName - Python Bytecode Document - CFBundleTypeRole - Editor - - - CFBundleExecutable - IDLE - CFBundleGetInfoString - %VERSION%, ? 001-2006 Python Software Foundation - CFBundleIconFile - IDLE.icns - CFBundleIdentifier - org.python.IDLE - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - IDLE - CFBundlePackageType - APPL - CFBundleShortVersionString - %VERSION% - CFBundleVersion - %VERSION% - - Deleted: python/branches/py3k/Mac/IDLE/Makefile.in ============================================================================== --- python/branches/py3k/Mac/IDLE/Makefile.in Tue Jul 1 20:23:09 2008 +++ (empty file) @@ -1,60 +0,0 @@ -prefix=@prefix@ -CC=@CC@ -LD=@CC@ -BASECFLAGS=@BASECFLAGS@ -OPT=@OPT@ -CFLAGS=$(BASECFLAGS) $(OPT) -LDFLAGS=@LDFLAGS@ -srcdir= @srcdir@ -VERSION= @VERSION@ -UNIVERSALSDK=@UNIVERSALSDK@ -builddir= ../.. -PYTHONFRAMEWORK=@PYTHONFRAMEWORK@ - -RUNSHARED= @RUNSHARED@ -BUILDEXE= @BUILDEXEEXT@ -BUILDPYTHON= $(builddir)/python$(BUILDEXE) - -# Deployment target selected during configure, to be checked -# by distutils -MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@ - at EXPORT_MACOSX_DEPLOYMENT_TARGET@export MACOSX_DEPLOYMENT_TARGET - -BUNDLEBULDER=$(srcdir)/../../Lib/plat-mac/bundlebuilder.py - -PYTHONAPPSDIR=/Applications/$(PYTHONFRAMEWORK) $(VERSION) - -all: IDLE.app - -install: IDLE.app $(srcdir)/config-main.def $(srcdir)/config-extensions.def - test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" - -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" - cp -PR IDLE.app "$(DESTDIR)$(PYTHONAPPSDIR)" - touch "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" - cp $(srcdir)/config-main.def "$(DESTDIR)$(prefix)/lib/python$(VERSION)/idlelib/config-main.def" - cp $(srcdir)/config-extensions.def "$(DESTDIR)$(prefix)/lib/python$(VERSION)/idlelib/config-extensions.def" - -clean: - rm -rf IDLE.app - -IDLE.app: \ - $(srcdir)/../Icons/IDLE.icns $(srcdir)/idlemain.py \ - $(srcdir)/../Icons/PythonSource.icns \ - $(srcdir)/../Icons/PythonCompiled.icns Info.plist - rm -fr IDLE.app - $(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \ - --builddir=. \ - --name=IDLE \ - --link-exec \ - --plist=Info.plist \ - --mainprogram=$(srcdir)/idlemain.py \ - --iconfile=$(srcdir)/../Icons/IDLE.icns \ - --resource=$(srcdir)/../Icons/PythonSource.icns \ - --resource=$(srcdir)/../Icons/PythonCompiled.icns \ - --python=$(prefix)/Resources/Python.app/Contents/MacOS/Python \ - build - - -Info.plist: $(srcdir)/Info.plist.in - sed 's/%VERSION%/'"`$(RUNSHARED) $(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`"'/g' < $(srcdir)/Info.plist.in > Info.plist - Deleted: python/branches/py3k/Mac/IDLE/config-extensions.def ============================================================================== --- python/branches/py3k/Mac/IDLE/config-extensions.def Tue Jul 1 20:23:09 2008 +++ (empty file) @@ -1,88 +0,0 @@ -# config-extensions.def -# -# IDLE reads several config files to determine user preferences. This -# file is the default configuration file for IDLE extensions settings. -# -# Each extension must have at least one section, named after the extension -# module. This section must contain an 'enable' item (=1 to enable the -# extension, =0 to disable it), it may contain 'enable_editor' or 'enable_shell' -# items, to apply it only to editor/shell windows, and may also contain any -# other general configuration items for the extension. -# -# Each extension must define at least one section named ExtensionName_bindings -# or ExtensionName_cfgBindings. If present, ExtensionName_bindings defines -# virtual event bindings for the extension that are not user re-configurable. -# If present, ExtensionName_cfgBindings defines virtual event bindings for the -# extension that may be sensibly re-configured. -# -# If there are no keybindings for a menus' virtual events, include lines like -# <>= (See [CodeContext], below.) -# -# Currently it is necessary to manually modify this file to change extension -# key bindings and default values. To customize, create -# ~/.idlerc/config-extensions.cfg and append the appropriate customized -# section(s). Those sections will override the defaults in this file. -# -# Note: If a keybinding is already in use when the extension is -# loaded, the extension's virtual event's keybinding will be set to ''. -# -# See config-keys.def for notes on specifying keys and extend.txt for -# information on creating IDLE extensions. - -[FormatParagraph] -enable=1 -[FormatParagraph_cfgBindings] -format-paragraph= - -[AutoExpand] -enable=1 -[AutoExpand_cfgBindings] -expand-word= - -[ZoomHeight] -enable=1 -[ZoomHeight_cfgBindings] -zoom-height= - -[ScriptBinding] -enable=1 -[ScriptBinding_cfgBindings] -run-module= -check-module= - -[CallTips] -enable=1 -[CallTips_cfgBindings] -force-open-calltip= -[CallTips_bindings] -try-open-calltip= -refresh-calltip= - -[ParenMatch] -enable=1 -style= expression -flash-delay= 500 -bell= 1 -[ParenMatch_cfgBindings] -flash-paren= -[ParenMatch_bindings] -paren-closed= - -[AutoComplete] -enable=1 -popupwait=2000 -[AutoComplete_cfgBindings] -force-open-completions= -[AutoComplete_bindings] -autocomplete= -try-open-completions= - -[CodeContext] -enable=1 -enable_shell=0 -numlines=3 -visible=0 -bgcolor=LightGray -fgcolor=Black -[CodeContext_bindings] -toggle-code-context= Deleted: python/branches/py3k/Mac/IDLE/config-main.def ============================================================================== --- python/branches/py3k/Mac/IDLE/config-main.def Tue Jul 1 20:23:09 2008 +++ (empty file) @@ -1,79 +0,0 @@ -# IDLE reads several config files to determine user preferences. This -# file is the default config file for general idle settings. -# -# When IDLE starts, it will look in -# the following two sets of files, in order: -# -# default configuration -# --------------------- -# config-main.def the default general config file -# config-extensions.def the default extension config file -# config-highlight.def the default highlighting config file -# config-keys.def the default keybinding config file -# -# user configuration -# ------------------- -# ~/.idlerc/config-main.cfg the user general config file -# ~/.idlerc/config-extensions.cfg the user extension config file -# ~/.idlerc/config-highlight.cfg the user highlighting config file -# ~/.idlerc/config-keys.cfg the user keybinding config file -# -# On Windows2000 and Windows XP the .idlerc directory is at -# Documents and Settings\\.idlerc -# -# On Windows98 it is at c:\.idlerc -# -# Any options the user saves through the config dialog will be saved to -# the relevant user config file. Reverting any general setting to the -# default causes that entry to be wiped from the user file and re-read -# from the default file. User highlighting themes or keybinding sets are -# retained unless specifically deleted within the config dialog. Choosing -# one of the default themes or keysets just applies the relevant settings -# from the default file. -# -# Additional help sources are listed in the [HelpFiles] section and must be -# viewable by a web browser (or the Windows Help viewer in the case of .chm -# files). These sources will be listed on the Help menu. The pattern is -# -# You can't use a semi-colon in a menu item or path. The path will be platform -# specific because of path separators, drive specs etc. -# -# It is best to use the Configuration GUI to set up additional help sources! -# Example: -#1 = My Extra Help Source;/usr/share/doc/foo/index.html -#2 = Another Help Source;/path/to/another.pdf - -[General] -editor-on-startup= 0 -autosave= 0 -print-command-posix=lpr %s -print-command-win=start /min notepad /p %s -delete-exitfunc= 1 - -[EditorWindow] -width= 80 -height= 40 -font= courier -font-size= 10 -font-bold= 0 -encoding= none - -[FormatParagraph] -paragraph=70 - -[Indent] -use-spaces= 1 -num-spaces= 4 - -[Theme] -default= 1 -name= IDLE Classic - -[Keys] -default= 1 -name= IDLE Classic OSX - -[History] -cyclic=1 - -[HelpFiles] Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Tue Jul 1 20:23:09 2008 @@ -45,8 +45,8 @@ DOCINDEX=$(DOCDIR)/"Documentation idx" compileall=$(srcdir)/../Lib/compileall.py -installapps: install_Python install_BuildApplet install_PythonLauncher \ - install_IDLE checkapplepython install_pythonw install_versionedtools +installapps: install_PythonLauncher install_IDLE checkapplepython install_pythonw \ + install_versionedtools install_pythonw: pythonw $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)" @@ -159,73 +159,10 @@ $(INSTALL_PROGRAM) $(STRIPFLAG) $(BUILDPYTHON) "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)" install_IDLE: - cd IDLE && make install - -install_BuildApplet: - $(RUNSHARED) $(BUILDPYTHON) $(srcdir)/scripts/BuildApplet.py \ - --destroot "$(DESTDIR)" \ - --python $(INSTALLED_PYTHONAPP) \ - --output "$(DESTDIR)$(PYTHONAPPSDIR)/Build Applet.app" \ - $(srcdir)/scripts/BuildApplet.py - -MACLIBDEST=$(LIBDEST)/plat-mac -MACTOOLSDEST=$(prefix)/Mac/Tools -MACTOOLSSRC=$(srcdir)/Mac/Tools -MACTOOLSSUBDIRS=IDE - -installmacsubtree: - @for i in $(MACTOOLSDEST); \ - do \ - if test ! -d $(DESTDIR)$$i; then \ - echo "Creating directory $(DESTDIR)$$i"; \ - $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ - else true; \ - fi; \ - done - @for d in $(MACTOOLSSUBDIRS); \ - do \ - a=$(MACTOOLSSRC)/$$d; \ - if test ! -d $$a; then continue; else true; fi; \ - b=$(DESTDIR)$(MACTOOLSDEST)/$$d; \ - if test ! -d $$b; then \ - echo "Creating directory $$b"; \ - $(INSTALL) -d -m $(DIRMODE) $$b; \ - else true; \ - fi; \ - done - @for d in $(MACTOOLSSUBDIRS); \ - do \ - a=$(MACTOOLSSRC)/$$d; \ - if test ! -d $$a; then continue; else true; fi; \ - b=$(DESTDIR)$(MACTOOLSDEST)/$$d; \ - for i in $$a/*; \ - do \ - case $$i in \ - *CVS) ;; \ - *.svn) ;; \ - *.py[co]) ;; \ - *.orig) ;; \ - *~) ;; \ - *.rsrc) \ - echo $(CPMAC) $$i $$b ; \ - $(CPMAC) $$i $$b ; \ - ;; \ - *) \ - if test -d $$i; then continue; fi; \ - if test -x $$i; then \ - echo $(INSTALL_SCRIPT) $$i $$b; \ - $(INSTALL_SCRIPT) $$i $$b; \ - else \ - echo $(INSTALL_DATA) $$i $$b; \ - $(INSTALL_DATA) $$i $$b; \ - fi;; \ - esac; \ - done; \ - done - - - $(RUNSHARED) $(BUILDPYTHON) -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) - $(RUNSHARED) $(BUILDPYTHON) -O -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) + test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" + -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" + cp -PR IDLE/IDLE.app "$(DESTDIR)$(PYTHONAPPSDIR)" + touch "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" $(INSTALLED_PYTHONAPP): install_Python @@ -248,7 +185,6 @@ clean: rm pythonw cd PythonLauncher && make clean - cd IDLE && make clean Makefile: $(srcdir)/Makefile.in ../config.status cd .. && CONFIG_FILES=Mac/Makefile CONFIG_HEADERS= $(SHELL) ./config.status Modified: python/branches/py3k/Mac/PythonLauncher/Makefile.in ============================================================================== --- python/branches/py3k/Mac/PythonLauncher/Makefile.in (original) +++ python/branches/py3k/Mac/PythonLauncher/Makefile.in Tue Jul 1 20:23:09 2008 @@ -24,59 +24,8 @@ PYTHONAPPSDIR=/Applications/$(PYTHONFRAMEWORK) $(VERSION) OBJECTS=FileSettings.o MyAppDelegate.o MyDocument.o PreferencesWindowController.o doscript.o main.o -all: Python\ Launcher.app - -install: Python\ Launcher.app +install: test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" cp -r "Python Launcher.app" "$(DESTDIR)$(PYTHONAPPSDIR)" touch "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" - -clean: - rm -f *.o "Python Launcher" - rm -rf "Python Launcher.app" - -Python\ Launcher.app: Info.plist \ - Python\ Launcher $(srcdir)/../Icons/PythonLauncher.icns \ - $(srcdir)/../Icons/PythonSource.icns \ - $(srcdir)/../Icons/PythonCompiled.icns \ - $(srcdir)/factorySettings.plist - rm -fr "Python Launcher.app" - $(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \ - --builddir=. \ - --name="Python Launcher" \ - --executable="Python Launcher" \ - --iconfile=$(srcdir)/../Icons/PythonLauncher.icns \ - --bundle-id=org.python.PythonLauncher \ - --resource=$(srcdir)/../Icons/PythonSource.icns \ - --resource=$(srcdir)/../Icons/PythonCompiled.icns \ - --resource=$(srcdir)/English.lproj \ - --resource=$(srcdir)/factorySettings.plist \ - --plist Info.plist \ - build - find "Python Launcher.app" -name '.svn' -print0 | xargs -0 rm -r - - -FileSettings.o: $(srcdir)/FileSettings.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/FileSettings.m - -MyAppDelegate.o: $(srcdir)/MyAppDelegate.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyAppDelegate.m - -MyDocument.o: $(srcdir)/MyDocument.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyDocument.m - -PreferencesWindowController.o: $(srcdir)/PreferencesWindowController.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/PreferencesWindowController.m - -doscript.o: $(srcdir)/doscript.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/doscript.m - -main.o: $(srcdir)/main.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/main.m - -Python\ Launcher: $(OBJECTS) - $(CC) $(LDFLAGS) -o "Python Launcher" $(OBJECTS) -framework AppKit -framework Carbon - -Info.plist: $(srcdir)/Info.plist.in - sed 's/%VERSION%/'"`$(RUNSHARED) $(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`"'/g' < $(srcdir)/Info.plist.in > Info.plist Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist Tue Jul 1 20:23:09 2008 @@ -0,0 +1,65 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + py + pyw + + CFBundleTypeIconFile + PythonSource.icns + CFBundleTypeName + Python Script + CFBundleTypeRole + Viewer + NSDocumentClass + MyDocument + + + CFBundleTypeExtensions + + pyc + pyo + + CFBundleTypeIconFile + PythonCompiled.icns + CFBundleTypeName + Python Bytecode Document + CFBundleTypeRole + Viewer + NSDocumentClass + MyDocument + + + CFBundleExecutable + Python Launcher + CFBundleGetInfoString + 2.6.0, ? 001-2006 Python Software Foundation + CFBundleIconFile + PythonLauncher.icns + CFBundleIdentifier + org.python.PythonLauncher + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Python Launcher + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.6.0 + CFBundleSignature + PytL + CFBundleVersion + 2.6.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo Tue Jul 1 20:23:09 2008 @@ -0,0 +1 @@ +APPLPytL \ No newline at end of file Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf Tue Jul 1 20:23:09 2008 @@ -0,0 +1,30 @@ +{\rtf1\mac\ansicpg10000\cocoartf100 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\f1\b0 \ + Jack Jansen\ +\ + +\f0\b Human Interface Design: +\f1\b0 \ + Jack Jansen\ +\ + +\f0\b Testing: +\f1\b0 \ + Jack Jansen\ + Pythonmac-SIG at python.org\ +\ + +\f0\b Documentation: +\f1\b0 \ + Missing\ +\ + +\f0\b With special thanks to: +\f1\b0 \ + Guido, of course\ +} \ No newline at end of file Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,12 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {showPreferences = id; }; + CLASS = MyAppDelegate; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,21 @@ + + + + + IBDocumentLocation + 99 33 356 240 0 0 800 578 + IBEditorPositions + + 29 + 82 396 318 44 0 0 800 578 + + IBFramework Version + 263.2 + IBOpenObjects + + 29 + + IBSystem Version + 5S66 + + Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,26 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {"do_apply" = id; "do_cancel" = id; "do_reset" = id; "do_run" = id; }; + CLASS = MyDocument; + LANGUAGE = ObjC; + OUTLETS = { + commandline = NSTextField; + debug = NSButton; + honourhashbang = NSButton; + inspect = NSButton; + interpreter = NSTextField; + nosite = NSButton; + optimize = NSButton; + others = NSTextField; + scriptargs = NSTextField; + tabs = NSButton; + verbose = NSButton; + "with_terminal" = NSButton; + }; + SUPERCLASS = NSDocument; + } + ); + IBVersion = 1; +} \ No newline at end of file Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 398 60 356 240 0 0 1024 746 + IBFramework Version + 291.0 + IBOpenObjects + + 5 + + IBSystem Version + 6L60 + + Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,26 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {"do_apply" = id; "do_filetype" = id; "do_reset" = id; }; + CLASS = PreferencesWindowController; + LANGUAGE = ObjC; + OUTLETS = { + commandline = NSTextField; + debug = NSButton; + filetype = NSPopUpButton; + honourhashbang = NSButton; + inspect = NSButton; + interpreter = NSTextField; + nosite = NSButton; + optimize = NSButton; + others = NSTextField; + tabs = NSButton; + verbose = NSButton; + "with_terminal" = NSButton; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib Tue Jul 1 20:23:09 2008 @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 565 235 519 534 0 0 1280 1002 + IBFramework Version + 364.0 + IBOpenObjects + + 5 + + IBSystem Version + 7H63 + + Added: python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist ============================================================================== --- (empty file) +++ python/branches/py3k/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist Tue Jul 1 20:23:09 2008 @@ -0,0 +1,87 @@ + + + + + Python GUI Script + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/bin/pythonw + /sw/bin/pythonw + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + Python Script + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/local/bin/python + /usr/bin/pythonw + /usr/bin/python + /sw/bin/pythonw + /sw/bin/python + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + Python Bytecode Document + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/local/bin/python + /usr/bin/pythonw + /usr/bin/python + /sw/bin/pythonw + /sw/bin/python + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + + Modified: python/branches/py3k/Mac/README ============================================================================== --- python/branches/py3k/Mac/README (original) +++ python/branches/py3k/Mac/README Tue Jul 1 20:23:09 2008 @@ -123,11 +123,6 @@ script to set runtime options. These options can be set once and for all through PythonLauncher's preferences dialog. -"BuildApplet.app" creates an applet from a Python script. Drop the script on it -and out comes a full-featured MacOS application. There is much more to this, -to be supplied later. Some useful (but outdated) info can be found in -Mac/Demo. - The commandline scripts /usr/local/bin/python and pythonw can be used to run non-GUI and GUI python scripts from the command line, respectively. Modified: python/branches/py3k/Mac/Tools/fixapplepython23.py ============================================================================== --- python/branches/py3k/Mac/Tools/fixapplepython23.py (original) +++ python/branches/py3k/Mac/Tools/fixapplepython23.py Tue Jul 1 20:23:09 2008 @@ -14,7 +14,7 @@ """ import sys import os -import gestalt +import gestalt as _gestalt MAKEFILE='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/Makefile' CHANGES=(( Modified: python/branches/py3k/Makefile.pre.in ============================================================================== --- python/branches/py3k/Makefile.pre.in (original) +++ python/branches/py3k/Makefile.pre.in Tue Jul 1 20:23:09 2008 @@ -1026,7 +1026,6 @@ # install (which includes python-config) happy. frameworkinstallmaclib: ln -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/python$(VERSION)/config/libpython$(VERSION).a" - cd Mac && $(MAKE) installmacsubtree DESTDIR="$(DESTDIR)" # This installs the IDE, the Launcher and other apps into /Applications frameworkinstallapps: Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Tue Jul 1 20:23:09 2008 @@ -21,6 +21,14 @@ code of every single module of the standard library, including invalid files used in the test suite. +Tools/Demos +----------- + +- The Mac/Demos directory has been removed + +- All of the Mac scripts have been removed (including BuildApplet.py) + + What's new in Python 3.0b1? =========================== Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Tue Jul 1 20:23:09 2008 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 63697 . +# From configure.in Revision: 64085 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -1938,8 +1938,6 @@ ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile" - ac_config_files="$ac_config_files Mac/IDLE/Makefile" - ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist" ac_config_files="$ac_config_files Mac/Resources/app/Info.plist" @@ -2021,7 +2019,7 @@ # On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined, # even though select is a POSIX function. Reported by J. Ribbens. # Reconfirmed for OpenBSD 3.3 by Zachary Hamm, for 3.4 by Jason Ish. - OpenBSD/2.* | OpenBSD/3.[0123456789] | OpenBSD/4.[0]) + OpenBSD/2.* | OpenBSD/3.[0123456789] | OpenBSD/4.[0123]) define_xopen_source=no # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is # also defined. This can be overridden by defining _BSD_SOURCE @@ -2073,6 +2071,11 @@ Darwin/[789].*) define_xopen_source=no ;; + # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from + # defining NI_NUMERICHOST. + QNX/6.3.2) + define_xopen_source=no + ;; esac @@ -3871,6 +3874,10 @@ LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; Monterey64*) LINKCC="$LINKCC -L/usr/lib/ia64l64";; + QNX*) + # qcc must be used because the other compilers do not + # support -N. + LINKCC=qcc;; esac fi { echo "$as_me:$LINENO: result: $LINKCC" >&5 @@ -5408,6 +5415,7 @@ + for ac_header in asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \ fcntl.h grp.h \ ieeefp.h io.h langinfo.h libintl.h ncurses.h poll.h process.h pthread.h \ @@ -5416,7 +5424,7 @@ sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \ sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/statvfs.h sys/stat.h \ -sys/time.h \ +sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h @@ -12891,7 +12899,7 @@ fi fi ;; - Linux*|GNU*) LDSHARED='$(CC) -shared';; + Linux*|GNU*|QNX*) LDSHARED='$(CC) -shared';; BSD/OS*/4*) LDSHARED="gcc -shared";; FreeBSD*) if [ "`$CC -dM -E - &5 @@ -24736,7 +24751,6 @@ "pyconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS pyconfig.h" ;; "Mac/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/Makefile" ;; "Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;; - "Mac/IDLE/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/IDLE/Makefile" ;; "Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;; "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;; "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;; Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Tue Jul 1 20:23:09 2008 @@ -141,7 +141,6 @@ # files: AC_CONFIG_FILES(Mac/Makefile) AC_CONFIG_FILES(Mac/PythonLauncher/Makefile) - AC_CONFIG_FILES(Mac/IDLE/Makefile) AC_CONFIG_FILES(Mac/Resources/framework/Info.plist) AC_CONFIG_FILES(Mac/Resources/app/Info.plist) esac From python-3000-checkins at python.org Tue Jul 1 21:10:52 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 21:10:52 +0200 (CEST) Subject: [Python-3000-checkins] r64619 - python/branches/py3k/Doc/library/subprocess.rst Message-ID: <20080701191052.E83271E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 21:10:52 2008 New Revision: 64619 Log: #2683: communicate() takes bytes. Modified: python/branches/py3k/Doc/library/subprocess.rst Modified: python/branches/py3k/Doc/library/subprocess.rst ============================================================================== --- python/branches/py3k/Doc/library/subprocess.rst (original) +++ python/branches/py3k/Doc/library/subprocess.rst Tue Jul 1 21:10:52 2008 @@ -102,7 +102,7 @@ This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects :attr:`stdout`, - :attr:`stdin` and :attr:`stderr` are not updated by the communicate() method. + :attr:`stdin` and :attr:`stderr` are not updated by the :meth:`communicate` method. The *startupinfo* and *creationflags*, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance @@ -215,7 +215,7 @@ Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional - *input* argument should be a string to be sent to the child process, or + *input* argument should be a byte string to be sent to the child process, or ``None``, if no data should be sent to the child. :meth:`communicate` returns a tuple ``(stdout, stderr)``. From python-3000-checkins at python.org Tue Jul 1 21:12:34 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 21:12:34 +0200 (CEST) Subject: [Python-3000-checkins] r64620 - python/branches/py3k/Doc/c-api/unicode.rst Message-ID: <20080701191234.E586A1E400C@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 21:12:34 2008 New Revision: 64620 Log: document PyUnicode_CompareWithASCIIString Modified: python/branches/py3k/Doc/c-api/unicode.rst Modified: python/branches/py3k/Doc/c-api/unicode.rst ============================================================================== --- python/branches/py3k/Doc/c-api/unicode.rst (original) +++ python/branches/py3k/Doc/c-api/unicode.rst Tue Jul 1 21:12:34 2008 @@ -869,6 +869,12 @@ respectively. +.. cfunction:: int PyUnicode_CompareWithASCIIString(PyObject *uni, char *string) + + Compare a unicode object, *uni*, with *string* and return -1, 0, 1 for less + than, equal, and greater than, respectively. + + .. cfunction:: int PyUnicode_RichCompare(PyObject *left, PyObject *right, int op) Rich compare two unicode strings and return one of the following: From python-3000-checkins at python.org Tue Jul 1 21:28:43 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 21:28:43 +0200 (CEST) Subject: [Python-3000-checkins] r64621 - in python/branches/py3k: Lib/subprocess.py Lib/test/test_subprocess.py Misc/NEWS Message-ID: <20080701192843.C78AF1E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 21:28:43 2008 New Revision: 64621 Log: #2683: Popen.communicate() argument must be bytes. Modified: python/branches/py3k/Lib/subprocess.py python/branches/py3k/Lib/test/test_subprocess.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Lib/subprocess.py ============================================================================== --- python/branches/py3k/Lib/subprocess.py (original) +++ python/branches/py3k/Lib/subprocess.py Tue Jul 1 21:28:43 2008 @@ -883,8 +883,6 @@ if self.stdin: if input is not None: - if isinstance(input, str): - input = input.encode() self.stdin.write(input) self.stdin.close() @@ -1129,10 +1127,6 @@ def _communicate(self, input): - if self.stdin: - if isinstance(input, str): # Unicode - input = input.encode("utf-8") # XXX What else? - input = bytes(input) read_set = [] write_set = [] stdout = None # Return Modified: python/branches/py3k/Lib/test/test_subprocess.py ============================================================================== --- python/branches/py3k/Lib/test/test_subprocess.py (original) +++ python/branches/py3k/Lib/test/test_subprocess.py Tue Jul 1 21:28:43 2008 @@ -302,7 +302,7 @@ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = p.communicate("banana") + (stdout, stderr) = p.communicate(b"banana") self.assertEqual(stdout, b"banana") self.assertEqual(remove_stderr_debug_decorations(stderr), b"pineapple") @@ -420,7 +420,7 @@ stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - data = p.communicate("lime")[0] + data = p.communicate(b"lime")[0] self.assertEqual(data, b"lime") Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Tue Jul 1 21:28:43 2008 @@ -17,6 +17,9 @@ Library ------- +- Issue #2683: Fix inconsistency in subprocess.Popen.communicate(): the + argument now must be a bytes object in any case. + - Issue #3145: help("modules whatever") failed when trying to load the source code of every single module of the standard library, including invalid files used in the test suite. From python-3000-checkins at python.org Tue Jul 1 21:56:01 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 21:56:01 +0200 (CEST) Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py Message-ID: <20080701195601.35FC51E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 21:56:00 2008 New Revision: 64624 Log: Fix a few urllib bugs (NameErrors). Also directly import names from the various urllib submodules, saves attribute lookup and is much cleaner. Modified: python/branches/py3k/Lib/urllib/parse.py python/branches/py3k/Lib/urllib/request.py Modified: python/branches/py3k/Lib/urllib/parse.py ============================================================================== --- python/branches/py3k/Lib/urllib/parse.py (original) +++ python/branches/py3k/Lib/urllib/parse.py Tue Jul 1 21:56:00 2008 @@ -416,11 +416,11 @@ # urllib.parse.unquote('abc%20def') -> 'abc def' # quote('abc def') -> 'abc%20def') -def toBytes(url): - """toBytes(u"URL") --> 'URL'.""" +def to_bytes(url): + """to_bytes(u"URL") --> 'URL'.""" # Most URL schemes require ASCII. If that changes, the conversion # can be relaxed. - # XXX get rid of toBytes() + # XXX get rid of to_bytes() if isinstance(url, str): try: url = url.encode("ASCII").decode() Modified: python/branches/py3k/Lib/urllib/request.py ============================================================================== --- python/branches/py3k/Lib/urllib/request.py (original) +++ python/branches/py3k/Lib/urllib/request.py Tue Jul 1 21:56:00 2008 @@ -94,10 +94,14 @@ import socket import sys import time -import urllib.parse, urllib.error, urllib.response import bisect -from io import StringIO +from urllib.error import URLError, HTTPError, ContentTooShortError +from urllib.parse import ( + urlparse, urlsplit, urljoin, unwrap, quote, unquote, + splittype, splithost, splitport, splituser, splitpasswd, + splitattr, splitquery, splitvalue, to_bytes) +from urllib.response import addinfourl, addclosehook # check for SSL try: @@ -146,7 +150,7 @@ """ url = request.get_full_url() - host = urllib.parse.urlparse(url)[1] + host = urlparse(url)[1] if host == "": host = request.get_header("Host", "") @@ -159,7 +163,7 @@ def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False): # unwrap('') --> 'type://host/path' - self.__original = urllib.parse.unwrap(url) + self.__original = unwrap(url) self.type = None # self.__r_type is what's left after doing the splittype self.host = None @@ -208,16 +212,16 @@ def get_type(self): if self.type is None: - self.type, self.__r_type = urllib.parse.splittype(self.__original) + self.type, self.__r_type = splittype(self.__original) if self.type is None: raise ValueError("unknown url type: %s" % self.__original) return self.type def get_host(self): if self.host is None: - self.host, self.__r_host = urllib.parse.splithost(self.__r_type) + self.host, self.__r_host = splithost(self.__r_type) if self.host: - self.host = urllib.parse.unquote(self.host) + self.host = unquote(self.host) return self.host def get_selector(self): @@ -475,7 +479,7 @@ class HTTPDefaultErrorHandler(BaseHandler): def http_error_default(self, req, fp, code, msg, hdrs): - raise urllib.error.HTTPError(req.get_full_url(), code, msg, hdrs, fp) + raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) class HTTPRedirectHandler(BaseHandler): # maximum number of redirections to any single URL @@ -498,8 +502,7 @@ m = req.get_method() if (not (code in (301, 302, 303, 307) and m in ("GET", "HEAD") or code in (301, 302, 303) and m == "POST")): - raise urllib.error.HTTPError(req.get_full_url(), - code, msg, headers, fp) + raise HTTPError(req.get_full_url(), code, msg, headers, fp) # Strictly (according to RFC 2616), 301 or 302 in response to # a POST MUST NOT cause a redirection without confirmation @@ -529,7 +532,7 @@ newurl = headers["uri"] else: return - newurl = urllib.parse.urljoin(req.get_full_url(), newurl) + newurl = urljoin(req.get_full_url(), newurl) # XXX Probably want to forget about the state of the current # request, although that might interact poorly with other @@ -544,8 +547,8 @@ visited = new.redirect_dict = req.redirect_dict if (visited.get(newurl, 0) >= self.max_repeats or len(visited) >= self.max_redirections): - raise urllib.error.HTTPError(req.get_full_url(), code, - self.inf_msg + msg, headers, fp) + raise HTTPError(req.get_full_url(), code, + self.inf_msg + msg, headers, fp) else: visited = new.redirect_dict = req.redirect_dict = {} visited[newurl] = visited.get(newurl, 0) + 1 @@ -614,7 +617,7 @@ ('http', 'joe', 'password', 'proxy.example.com') """ - scheme, r_scheme = urllib.parse.splittype(proxy) + scheme, r_scheme = splittype(proxy) if not r_scheme.startswith("/"): # authority scheme = None @@ -629,9 +632,9 @@ if end == -1: end = None authority = r_scheme[2:end] - userinfo, hostport = urllib.parse.splituser(authority) + userinfo, hostport = splituser(authority) if userinfo is not None: - user, password = urllib.parse.splitpasswd(userinfo) + user, password = splitpasswd(userinfo) else: user = password = None return scheme, user, password, hostport @@ -656,11 +659,11 @@ if proxy_type is None: proxy_type = orig_type if user and password: - user_pass = '%s:%s' % (urllib.parse.unquote(user), - urllib.parse.unquote(password)) + user_pass = '%s:%s' % (unquote(user), + unquote(password)) creds = base64.b64encode(user_pass.encode()).decode("ascii") req.add_header('Proxy-authorization', 'Basic ' + creds) - hostport = urllib.parse.unquote(hostport) + hostport = unquote(hostport) req.set_proxy(hostport, proxy_type) if orig_type == proxy_type: # let other handlers take care of it @@ -703,7 +706,7 @@ def reduce_uri(self, uri, default_port=True): """Accept authority or URI and extract only the authority and path.""" # note HTTP URLs do not have a userinfo component - parts = urllib.parse.urlsplit(uri) + parts = urlsplit(uri) if parts[1]: # URI scheme = parts[0] @@ -714,7 +717,7 @@ scheme = None authority = uri path = '/' - host, port = urllib.parse.splitport(authority) + host, port = splitport(authority) if default_port and port is None and scheme is not None: dport = {"http": 80, "https": 443, @@ -851,9 +854,8 @@ # prompting for the information. Crap. This isn't great # but it's better than the current 'repeat until recursion # depth exceeded' approach - raise urllib.error.HTTPError(req.get_full_url(), 401, - "digest auth failed", - headers, None) + raise HTTPError(req.get_full_url(), 401, "digest auth failed", + headers, None) else: self.retried += 1 if authreq: @@ -924,7 +926,7 @@ respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) else: # XXX handle auth-int. - raise urllib.error.URLError("qop '%s' is not supported." % qop) + raise URLError("qop '%s' is not supported." % qop) # XXX should the partial digests be encoded too? @@ -966,7 +968,7 @@ handler_order = 490 # before Basic auth def http_error_401(self, req, fp, code, msg, headers): - host = urllib.parse.urlparse(req.get_full_url())[1] + host = urlparse(req.get_full_url())[1] retry = self.http_error_auth_reqed('www-authenticate', host, req, headers) self.reset_retry_count() @@ -996,7 +998,7 @@ def do_request_(self, request): host = request.get_host() if not host: - raise urllib.error.URLError('no host given') + raise URLError('no host given') if request.has_data(): # POST data = request.get_data() @@ -1008,8 +1010,8 @@ request.add_unredirected_header( 'Content-length', '%d' % len(data)) - scheme, sel = urllib.parse.splittype(request.get_selector()) - sel_host, sel_path = urllib.parse.splithost(sel) + scheme, sel = splittype(request.get_selector()) + sel_host, sel_path = splithost(sel) if not request.has_header('Host'): request.add_unredirected_header('Host', sel_host or host) for name, value in self.parent.addheaders: @@ -1025,13 +1027,13 @@ http_class must implement the HTTPConnection API from http.client. The addinfourl return value is a file-like object. It also has methods and attributes including: - - info(): return a mimetools.Message object for the headers + - info(): return a email Message object for the headers - geturl(): return the original request URL - code: HTTP status code """ host = req.get_host() if not host: - raise urllib.error.URLError('no host given') + raise URLError('no host given') h = http_class(host, timeout=req.timeout) # will parse host:port headers = dict(req.headers) @@ -1053,9 +1055,9 @@ h.request(req.get_method(), req.get_selector(), req.data, headers) r = h.getresponse() except socket.error as err: # XXX what error? - raise urllib.error.URLError(err) + raise URLError(err) - resp = urllib.response.addinfourl(r.fp, r.msg, req.get_full_url()) + resp = addinfourl(r.fp, r.msg, req.get_full_url()) resp.code = r.status resp.msg = r.reason return resp @@ -1097,7 +1099,7 @@ class UnknownHandler(BaseHandler): def unknown_open(self, req): type = req.get_type() - raise urllib.error.URLError('unknown url type: %s' % type) + raise URLError('unknown url type: %s' % type) def parse_keqv_list(l): """Parse list of key=value strings where keys are not duplicated.""" @@ -1189,15 +1191,14 @@ 'Content-type: %s\nContent-length: %d\nLast-modified: %s\n' % (mtype or 'text/plain', size, modified)) if host: - host, port = urllib.parse.splitport(host) + host, port = splitport(host) if not host or \ (not port and _safe_gethostbyname(host) in self.get_names()): - return urllib.response.addinfourl(open(localfile, 'rb'), - headers, 'file:'+file) + return addinfourl(open(localfile, 'rb'), headers, 'file:'+file) except OSError as msg: # users shouldn't expect OSErrors coming from urlopen() - raise urllib.error.URLError(msg) - raise urllib.error.URLError('file not on local host') + raise URLError(msg) + raise URLError('file not on local host') def _safe_gethostbyname(host): try: @@ -1211,30 +1212,30 @@ import mimetypes host = req.get_host() if not host: - raise urllib.error.URLError('ftp error: no host given') - host, port = urllib.parse.splitport(host) + raise URLError('ftp error: no host given') + host, port = splitport(host) if port is None: port = ftplib.FTP_PORT else: port = int(port) # username/password handling - user, host = urllib.parse.splituser(host) + user, host = splituser(host) if user: - user, passwd = urllib.parse.splitpasswd(user) + user, passwd = splitpasswd(user) else: passwd = None - host = urllib.parse.unquote(host) - user = urllib.parse.unquote(user or '') - passwd = urllib.parse.unquote(passwd or '') + host = unquote(host) + user = unquote(user or '') + passwd = unquote(passwd or '') try: host = socket.gethostbyname(host) except socket.error as msg: - raise urllib.error.URLError(msg) - path, attrs = urllib.parse.splitattr(req.get_selector()) + raise URLError(msg) + path, attrs = splitattr(req.get_selector()) dirs = path.split('/') - dirs = list(map(urllib.parse.unquote, dirs)) + dirs = list(map(unquote, dirs)) dirs, file = dirs[:-1], dirs[-1] if dirs and not dirs[0]: dirs = dirs[1:] @@ -1242,7 +1243,7 @@ fw = self.connect_ftp(user, passwd, host, port, dirs, req.timeout) type = file and 'I' or 'D' for attr in attrs: - attr, value = urllib.parse.splitvalue(attr) + attr, value = splitvalue(attr) if attr.lower() == 'type' and \ value in ('a', 'A', 'i', 'I', 'd', 'D'): type = value.upper() @@ -1254,9 +1255,9 @@ if retrlen is not None and retrlen >= 0: headers += "Content-length: %d\n" % retrlen headers = email.message_from_string(headers) - return urllib.response.addinfourl(fp, headers, req.get_full_url()) + return addinfourl(fp, headers, req.get_full_url()) except ftplib.all_errors as msg: - exc = urllib.error.URLError('ftp error: %s' % msg) + exc = URLError('ftp error: %s' % msg) raise exc.with_traceback(sys.exc_info()[2]) def connect_ftp(self, user, passwd, host, port, dirs, timeout): @@ -1323,12 +1324,12 @@ 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 urllib.parse.unquote(pathname) + 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 urllib.parse.quote(pathname) + return quote(pathname) # This really consists of two pieces: # (1) a class which handles opening of all sorts of URLs @@ -1402,18 +1403,18 @@ # External interface def open(self, fullurl, data=None): """Use URLopener().open(file) instead of open(file, 'r').""" - fullurl = urllib.parse.unwrap(urllib.parse.toBytes(fullurl)) + fullurl = unwrap(to_bytes(fullurl)) if self.tempcache and fullurl in self.tempcache: filename, headers = self.tempcache[fullurl] fp = open(filename, 'rb') - return urllib.response.addinfourl(fp, headers, fullurl) - urltype, url = urllib.parse.splittype(fullurl) + 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 = urllib.parse.splittype(proxy) - host, selector = urllib.parse.splithost(proxyhost) + urltype, proxyhost = splittype(proxy) + host, selector = splithost(proxyhost) url = (host, fullurl) # Signal special case to open_*() else: proxy = None @@ -1435,28 +1436,28 @@ def open_unknown(self, fullurl, data=None): """Overridable interface to open unknown URL type.""" - type, url = urllib.parse.splittype(fullurl) + 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 = urllib.parse.splittype(fullurl) + 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 = urllib.parse.unwrap(urllib.parse.toBytes(url)) + url = unwrap(to_bytes(url)) if self.tempcache and url in self.tempcache: return self.tempcache[url] - type, url1 = urllib.parse.splittype(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() del fp - return url2pathname(urllib.parse.splithost(url1)[1]), hdrs + return url2pathname(splithost(url1)[1]), hdrs except IOError as msg: pass fp = self.open(url, data) @@ -1465,10 +1466,10 @@ tfp = open(filename, 'wb') else: import tempfile - garbage, path = urllib.parse.splittype(url) - garbage, path = urllib.parse.splithost(path or "") - path, garbage = urllib.parse.splitquery(path or "") - path, garbage = urllib.parse.splitattr(path or "") + 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) @@ -1500,7 +1501,7 @@ # raise exception if actual size does not match content-length header if size >= 0 and read < size: - raise urllib.error.ContentTooShortError( + raise ContentTooShortError( "retrieval incomplete: got only %i out of %i bytes" % (read, size), result) @@ -1524,25 +1525,25 @@ user_passwd = None proxy_passwd= None if isinstance(url, str): - host, selector = urllib.parse.splithost(url) + host, selector = splithost(url) if host: - user_passwd, host = urllib.parse.splituser(host) - host = urllib.parse.unquote(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 = urllib.parse.splituser(host) + proxy_passwd, host = splituser(host) # now we proceed with the url we want to obtain - urltype, rest = urllib.parse.splittype(selector) + urltype, rest = splittype(selector) url = rest user_passwd = None if urltype.lower() != 'http': realhost = None else: - realhost, rest = urllib.parse.splithost(rest) + realhost, rest = splithost(rest) if realhost: - user_passwd, realhost = urllib.parse.splituser(realhost) + user_passwd, realhost = splituser(realhost) if user_passwd: selector = "%s://%s%s" % (urltype, realhost, rest) if proxy_bypass(realhost): @@ -1587,14 +1588,13 @@ response = http_conn.getresponse() except http.client.BadStatusLine: # something went wrong with the HTTP status line - raise urllib.error.URLError("http protocol error: bad status line") + raise URLError("http protocol error: bad status line") # According to RFC 2616, "2xx" code indicates that the client's # request was successfully received, understood, and accepted. if 200 <= response.status < 300: - return urllib.response.addinfourl(response.fp, response.msg, - "http:" + url, - response.status) + return addinfourl(response.fp, response.msg, "http:" + url, + response.status) else: return self.http_error( url, response.fp, @@ -1624,7 +1624,7 @@ """Default error handler: close the connection and raise IOError.""" void = fp.read() fp.close() - raise urllib.error.HTTPError(url, errcode, errmsg, headers, None) + raise HTTPError(url, errcode, errmsg, headers, None) if _have_ssl: def _https_connection(self, host): @@ -1649,7 +1649,7 @@ """Use local file.""" import mimetypes, email.utils from io import StringIO - host, file = urllib.parse.splithost(url) + host, file = splithost(url) localname = url2pathname(file) try: stats = os.stat(localname) @@ -1665,16 +1665,14 @@ urlfile = file if file[:1] == '/': urlfile = 'file://' + file - return urllib.response.addinfourl(open(localname, 'rb'), - headers, urlfile) - host, port = urllib.parse.splitport(host) + 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 urllib.response.addinfourl(open(localname, 'rb'), - headers, urlfile) + return addinfourl(open(localname, 'rb'), headers, urlfile) raise URLError('local file error', 'not on local host') def open_ftp(self, url): @@ -1683,23 +1681,23 @@ raise URLError('ftp error', 'proxy support for ftp protocol currently not implemented') import mimetypes from io import StringIO - host, path = urllib.parse.splithost(url) + host, path = splithost(url) if not host: raise URLError('ftp error', 'no host given') - host, port = urllib.parse.splitport(host) - user, host = urllib.parse.splituser(host) - if user: user, passwd = urllib.parse.splitpasswd(user) + host, port = splitport(host) + user, host = splituser(host) + if user: user, passwd = splitpasswd(user) else: passwd = None - host = urllib.parse.unquote(host) - user = urllib.parse.unquote(user or '') - passwd = urllib.parse.unquote(passwd or '') + host = unquote(host) + user = unquote(user or '') + passwd = unquote(passwd or '') host = socket.gethostbyname(host) if not port: import ftplib port = ftplib.FTP_PORT else: port = int(port) - path, attrs = urllib.parse.splitattr(path) - path = urllib.parse.unquote(path) + 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:] @@ -1720,7 +1718,7 @@ if not file: type = 'D' else: type = 'I' for attr in attrs: - attr, value = urllib.parse.splitvalue(attr) + attr, value = splitvalue(attr) if attr.lower() == 'type' and \ value in ('a', 'A', 'i', 'I', 'd', 'D'): type = value.upper() @@ -1732,7 +1730,7 @@ if retrlen is not None and retrlen >= 0: headers += "Content-Length: %d\n" % retrlen headers = email.message_from_string(headers) - return urllib.response.addinfourl(fp, headers, "ftp:" + url) + return addinfourl(fp, headers, "ftp:" + url) except ftperrors() as msg: raise URLError('ftp error', msg).with_traceback(sys.exc_info()[2]) @@ -1767,14 +1765,15 @@ import base64 data = base64.decodestring(data) else: - data = urllib.parse.unquote(data) + data = unquote(data) msg.append('Content-Length: %d' % len(data)) msg.append('') msg.append(data) msg = '\n'.join(msg) - headers = mimetools.message_from_string(msg) + headers = email.message_from_string(msg) + f = io.StringIO(msg) #f.fileno = None # needed for addinfourl - return urllib.response.addinfourl(f, headers, url) + return addinfourl(f, headers, url) class FancyURLopener(URLopener): @@ -1788,7 +1787,7 @@ def http_error_default(self, url, fp, errcode, errmsg, headers): """Default error handling -- don't raise an exception.""" - return urllib.response.addinfourl(fp, headers, "http:" + url, errcode) + return addinfourl(fp, headers, "http:" + url, errcode) def http_error_302(self, url, fp, errcode, errmsg, headers, data=None): """Error 302 -- relocated (temporarily).""" @@ -1816,7 +1815,7 @@ void = fp.read() fp.close() # In case the server sent a relative URL, join with original: - newurl = basejoin(self.type + ":" + url, newurl) + newurl = urljoin(self.type + ":" + url, newurl) return self.open(newurl) def http_error_301(self, url, fp, errcode, errmsg, headers, data=None): @@ -1879,16 +1878,16 @@ return getattr(self,name)(url, realm, data) def retry_proxy_http_basic_auth(self, url, realm, data=None): - host, selector = urllib.parse.splithost(url) + host, selector = splithost(url) newurl = 'http://' + host + selector proxy = self.proxies['http'] - urltype, proxyhost = urllib.parse.splittype(proxy) - proxyhost, proxyselector = urllib.parse.splithost(proxyhost) + 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 = "%s:%s@%s" % (urllib.parse.quote(user, safe=''), + proxyhost = "%s:%s@%s" % (quote(user, safe=''), quote(passwd, safe=''), proxyhost) self.proxies['http'] = 'http://' + proxyhost + proxyselector if data is None: @@ -1897,16 +1896,16 @@ return self.open(newurl, data) def retry_proxy_https_basic_auth(self, url, realm, data=None): - host, selector = urllib.parse.splithost(url) + host, selector = splithost(url) newurl = 'https://' + host + selector proxy = self.proxies['https'] - urltype, proxyhost = urllib.parse.splittype(proxy) - proxyhost, proxyselector = urllib.parse.splithost(proxyhost) + 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 = "%s:%s@%s" % (urllib.parse.quote(user, safe=''), + proxyhost = "%s:%s@%s" % (quote(user, safe=''), quote(passwd, safe=''), proxyhost) self.proxies['https'] = 'https://' + proxyhost + proxyselector if data is None: @@ -1915,12 +1914,12 @@ return self.open(newurl, data) def retry_http_basic_auth(self, url, realm, data=None): - host, selector = urllib.parse.splithost(url) + 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 = "%s:%s@%s" % (urllib.parse.quote(user, safe=''), + host = "%s:%s@%s" % (quote(user, safe=''), quote(passwd, safe=''), host) newurl = 'http://' + host + selector if data is None: @@ -1929,12 +1928,12 @@ return self.open(newurl, data) def retry_https_basic_auth(self, url, realm, data=None): - host, selector = urllib.parse.splithost(url) + 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 = "%s:%s@%s" % (urllib.parse.quote(user, safe=''), + host = "%s:%s@%s" % (quote(user, safe=''), quote(passwd, safe=''), host) newurl = 'https://' + host + selector if data is None: @@ -1995,10 +1994,10 @@ _noheaders = None def noheaders(): - """Return an empty mimetools.Message object.""" + """Return an empty email Message object.""" global _noheaders if _noheaders is None: - _noheaders = mimetools.message_from_string("") + _noheaders = email.message_from_string("") return _noheaders @@ -2043,7 +2042,8 @@ conn = self.ftp.ntransfercmd(cmd) except ftplib.error_perm as reason: if str(reason)[:3] != '550': - raise urllib.error.URLError('ftp error', reason).with_traceback(sys.exc_info()[2]) + raise URLError('ftp error', reason).with_traceback( + sys.exc_info()[2]) if not conn: # Set transfer mode to ASCII! self.ftp.voidcmd('TYPE A') @@ -2054,7 +2054,7 @@ try: self.ftp.cwd(file) except ftplib.error_perm as reason: - raise urllib.error.URLError('ftp error', reason) from reason + raise URLError('ftp error', reason) from reason finally: self.ftp.cwd(pwd) cmd = 'LIST ' + file @@ -2063,8 +2063,7 @@ conn = self.ftp.ntransfercmd(cmd) self.busy = 1 # Pass back both a suitably decorated object and a retrieval length - return (urllib.response.addclosehook(conn[0].makefile('rb'), - self.endtransfer), conn[1]) + return (addclosehook(conn[0].makefile('rb'), self.endtransfer), conn[1]) def endtransfer(self): if not self.busy: return @@ -2112,7 +2111,7 @@ if no_proxy == '*': return 1 # strip port off host - hostonly, port = urllib.parse.splitport(host) + hostonly, port = splitport(host) # check if the host ends with any of the DNS suffixes for name in no_proxy.split(','): if name and (hostonly.endswith(name) or host.endswith(name)): @@ -2236,7 +2235,7 @@ if not proxyEnable or not proxyOverride: return 0 # try to make a host list from name and IP address. - rawHost, port = urllib.parse.splitport(host) + rawHost, port = splitport(host) host = [rawHost] try: addr = socket.gethostbyname(rawHost) From python-3000-checkins at python.org Tue Jul 1 22:03:27 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 22:03:27 +0200 (CEST) Subject: [Python-3000-checkins] r64626 - in python/branches/py3k: Lib/test/test_syntax.py Python/ast.c Message-ID: <20080701200327.AD2B21E4002@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 22:03:27 2008 New Revision: 64626 Log: Merged revisions 64622 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64622 | benjamin.peterson | 2008-07-01 14:34:52 -0500 (Tue, 01 Jul 2008) | 1 line #3219 repeated keyword arguments aren't allowed in function calls anymore ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_syntax.py python/branches/py3k/Python/ast.c Modified: python/branches/py3k/Lib/test/test_syntax.py ============================================================================== --- python/branches/py3k/Lib/test/test_syntax.py (original) +++ python/branches/py3k/Lib/test/test_syntax.py Tue Jul 1 22:03:27 2008 @@ -470,6 +470,12 @@ ... SyntaxError: invalid syntax + +>>> f(a=23, a=234) +Traceback (most recent call last): + ... +SyntaxError: keyword argument repeated + """ import re Modified: python/branches/py3k/Python/ast.c ============================================================================== --- python/branches/py3k/Python/ast.c (original) +++ python/branches/py3k/Python/ast.c Tue Jul 1 22:03:27 2008 @@ -1968,7 +1968,8 @@ } else { keyword_ty kw; - identifier key; + identifier key, tmp; + int k; /* CHILD(ch, 0) is test, but must be an identifier? */ e = ast_for_expr(c, CHILD(ch, 0)); @@ -1989,6 +1990,13 @@ return NULL; } key = e->v.Name.id; + for (k = 0; k < nkeywords; k++) { + tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg; + if (!PyUnicode_Compare(tmp, key)) { + ast_error(CHILD(ch, 0), "keyword argument repeated"); + return NULL; + } + } e = ast_for_expr(c, CHILD(ch, 2)); if (!e) return NULL; From fdrake at acm.org Tue Jul 1 22:04:14 2008 From: fdrake at acm.org (Fred Drake) Date: Tue, 1 Jul 2008 16:04:14 -0400 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: <20080701195601.35FC51E4002@bag.python.org> References: <20080701195601.35FC51E4002@bag.python.org> Message-ID: <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> On Jul 1, 2008, at 3:56 PM, georg.brandl wrote: > Author: georg.brandl ... > Also directly import names from the various urllib submodules, > saves attribute lookup and is much cleaner. This is highly subjective. Do we want to be doing this in the standard library? I'd certainly suggest that such style changes should be made in separate commits than bugfixes. -Fred -- Fred Drake From python-3000-checkins at python.org Tue Jul 1 22:08:02 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 22:08:02 +0200 (CEST) Subject: [Python-3000-checkins] r64627 - python/branches/py3k/Doc/library/stdtypes.rst Message-ID: <20080701200802.899241E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 22:08:02 2008 New Revision: 64627 Log: #3220: improve bytes docs a bit. Modified: python/branches/py3k/Doc/library/stdtypes.rst Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Tue Jul 1 22:08:02 2008 @@ -512,17 +512,21 @@ also string-specific methods described in the :ref:`string-methods` section. Bytes and bytearray objects contain single bytes -- the former is immutable -while the latter is a mutable sequence. Bytes objects can be constructed from -literals too; use a ``b`` prefix with normal string syntax: ``b'xyzzy'``. To -construct byte arrays, use the :func:`bytearray` function. +while the latter is a mutable sequence. Bytes objects can be constructed the +constructor, :func:`bytes`, and from literals; use a ``b`` prefix with normal +string syntax: ``b'xyzzy'``. To construct byte arrays, use the +:func:`bytearray` function. .. warning:: While string objects are sequences of characters (represented by strings of length 1), bytes and bytearray objects are sequences of *integers* (between 0 and 255), representing the ASCII value of single bytes. That means that for - a bytes or bytearray object *b*, ``b[0]`` will be an integer, while ``b[0:1]`` - will be a bytes or bytearray object of length 1. + a bytes or bytearray object *b*, ``b[0]`` will be an integer, while + ``b[0:1]`` will be a bytes or bytearray object of length 1. The + representation of bytes objects uses the literal format (``b'...'``) since it + is generally more useful than e.g. ``bytes([50, 19, 100])``. You can always + convert a bytes object into a list of integers using ``list(b)``. Also, while in previous Python versions, byte strings and Unicode strings could be exchanged for each other rather freely (barring encoding issues), @@ -1413,15 +1417,14 @@ The bytes and bytearray types have an additional class method: .. method:: bytes.fromhex(string) + bytearray.fromhex(string) - This :class:`bytes` class method returns a bytes object, decoding the given - string object. The string must contain two hexadecimal digits per byte, spaces - are ignored. + This :class:`bytes` class method returns a bytes or bytearray object, + decoding the given string object. The string must contain two hexadecimal + digits per byte, spaces are ignored. - Example:: - - >>> bytes.fromhex('f0 f1f2 ') - b'\xf0\xf1\xf2' + >>> bytes.fromhex('f0 f1f2 ') + b'\xf0\xf1\xf2' .. XXX verify/document translate() semantics! From python-3000-checkins at python.org Tue Jul 1 22:21:28 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 22:21:28 +0200 (CEST) Subject: [Python-3000-checkins] r64631 - python/branches/py3k/Misc/NEWS Message-ID: <20080701202128.98EDB1E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 22:21:28 2008 New Revision: 64631 Log: Add some full stops. Modified: python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Tue Jul 1 22:21:28 2008 @@ -27,9 +27,9 @@ Tools/Demos ----------- -- The Mac/Demos directory has been removed +- The Mac/Demos directory has been removed. -- All of the Mac scripts have been removed (including BuildApplet.py) +- All of the Mac scripts have been removed (including BuildApplet.py). What's new in Python 3.0b1? From python-3000-checkins at python.org Tue Jul 1 22:26:37 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 1 Jul 2008 22:26:37 +0200 (CEST) Subject: [Python-3000-checkins] r64632 - python/branches/py3k/Lib/test/test_metaclass.py Message-ID: <20080701202637.108E51E4015@bag.python.org> Author: benjamin.peterson Date: Tue Jul 1 22:26:36 2008 New Revision: 64632 Log: fix test_metaclass Modified: python/branches/py3k/Lib/test/test_metaclass.py Modified: python/branches/py3k/Lib/test/test_metaclass.py ============================================================================== --- python/branches/py3k/Lib/test/test_metaclass.py (original) +++ python/branches/py3k/Lib/test/test_metaclass.py Tue Jul 1 22:26:36 2008 @@ -128,7 +128,7 @@ ... Traceback (most recent call last): [...] - TypeError: __build_class__() got multiple values for keyword argument 'metaclass' + SyntaxError: keyword argument repeated >>> Another way. From g.brandl at gmx.net Tue Jul 1 22:28:45 2008 From: g.brandl at gmx.net (Georg Brandl) Date: Tue, 01 Jul 2008 22:28:45 +0200 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> References: <20080701195601.35FC51E4002@bag.python.org> <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> Message-ID: Fred Drake schrieb: > On Jul 1, 2008, at 3:56 PM, georg.brandl wrote: >> Author: georg.brandl > .... >> Also directly import names from the various urllib submodules, >> saves attribute lookup and is much cleaner. > > This is highly subjective. Do we want to be doing this in the > standard library? While I'm opposed to sweeping stdlib refactorings, this is an exception because a) the urllib package was only recently created, b) the imports are from other urllib submodules and therefore should be easy to understand and c) it mirrors what was done in urllib2.py. > I'd certainly suggest that such style changes should be made in > separate commits than bugfixes. You're right, I should have done this. Georg From python-3000-checkins at python.org Tue Jul 1 22:40:00 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 22:40:00 +0200 (CEST) Subject: [Python-3000-checkins] r64634 - in python/branches/py3k: Doc/library/functions.rst Python/bltinmodule.c Message-ID: <20080701204000.0A8401E4002@bag.python.org> Author: georg.brandl Date: Tue Jul 1 22:39:59 2008 New Revision: 64634 Log: #3191: fix round() docs and docstring. Modified: python/branches/py3k/Doc/library/functions.rst python/branches/py3k/Python/bltinmodule.c Modified: python/branches/py3k/Doc/library/functions.rst ============================================================================== --- python/branches/py3k/Doc/library/functions.rst (original) +++ python/branches/py3k/Doc/library/functions.rst Tue Jul 1 22:39:59 2008 @@ -964,11 +964,15 @@ .. function:: round(x[, n]) Return the floating point value *x* rounded to *n* digits after the decimal - point. If *n* is omitted, it defaults to zero. Values are rounded to the + point. If *n* is omitted, it defaults to zero. Delegates to + ``x.__round__(n)``. + + For the built-in types supporting :func:`round`, values are rounded to the closest multiple of 10 to the power minus *n*; if two multiples are equally close, rounding is done toward the even choice (so, for example, both - ``round(0.5)`` and ``round(-0.5)`` are ``0``, and ``round(1.5)`` is - ``2``). Delegates to ``x.__round__(n)``. + ``round(0.5)`` and ``round(-0.5)`` are ``0``, and ``round(1.5)`` is ``2``). + The return value is an integer if called with one argument, otherwise of the + same type as *x*. .. function:: set([iterable]) Modified: python/branches/py3k/Python/bltinmodule.c ============================================================================== --- python/branches/py3k/Python/bltinmodule.c (original) +++ python/branches/py3k/Python/bltinmodule.c Tue Jul 1 22:39:59 2008 @@ -1726,8 +1726,8 @@ "round(number[, ndigits]) -> floating point number\n\ \n\ Round a number to a given precision in decimal digits (default 0 digits).\n\ -This returns an int when called with one argument, otherwise a float.\n\ -Precision may be negative."); +This returns an int when called with one argument, otherwise a the\n\ +same type as the number. ndigits may be negative."); static PyObject * From fdrake at acm.org Tue Jul 1 22:41:35 2008 From: fdrake at acm.org (Fred Drake) Date: Tue, 1 Jul 2008 16:41:35 -0400 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: References: <20080701195601.35FC51E4002@bag.python.org> <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> Message-ID: <06FB6B1B-063C-42AA-9E49-CCF0808363D3@acm.org> On Jul 1, 2008, at 4:28 PM, Georg Brandl wrote: > While I'm opposed to sweeping stdlib refactorings, this is an > exception because a) the urllib package was only recently created, I'm not objecting to a refactoring; that would work just fine for the new package. > b) the imports are from other urllib submodules and therefore > should be easy to understand and c) it mirrors what was done > in urllib2.py. What I am objecting to is the assertion that importing names directly into the global namespace for a module is in any way "cleaner". That's a style issue, and I don't think there's anything approximating consensus on the matter. -Fred -- Fred Drake From python-3000-checkins at python.org Tue Jul 1 22:46:09 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Tue, 1 Jul 2008 22:46:09 +0200 (CEST) Subject: [Python-3000-checkins] r64636 - python/branches/py3k Message-ID: <20080701204609.80F3F1E401A@bag.python.org> Author: georg.brandl Date: Tue Jul 1 22:46:09 2008 New Revision: 64636 Log: Blocked revisions 64635 via svnmerge ........ r64635 | georg.brandl | 2008-07-01 22:45:09 +0200 (Tue, 01 Jul 2008) | 2 lines #1523853: add note about fread(). ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Tue Jul 1 22:48:50 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Tue, 1 Jul 2008 22:48:50 +0200 (CEST) Subject: [Python-3000-checkins] r64637 - python/branches/py3k Message-ID: <20080701204850.860481E4002@bag.python.org> Author: amaury.forgeotdarc Date: Tue Jul 1 22:48:50 2008 New Revision: 64637 Log: Blocked revisions 64633 via svnmerge ........ r64633 | amaury.forgeotdarc | 2008-07-01 22:38:04 +0200 (mar., 01 juil. 2008) | 5 lines #3242: fix a crash in "print", if sys.stdout is set to a custom object, whose write() method installs another sys.stdout. Will backport. ........ Modified: python/branches/py3k/ (props changed) From g.brandl at gmx.net Tue Jul 1 22:53:42 2008 From: g.brandl at gmx.net (Georg Brandl) Date: Tue, 01 Jul 2008 22:53:42 +0200 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: <06FB6B1B-063C-42AA-9E49-CCF0808363D3@acm.org> References: <20080701195601.35FC51E4002@bag.python.org> <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> <06FB6B1B-063C-42AA-9E49-CCF0808363D3@acm.org> Message-ID: Fred Drake schrieb: > On Jul 1, 2008, at 4:28 PM, Georg Brandl wrote: >> While I'm opposed to sweeping stdlib refactorings, this is an >> exception because a) the urllib package was only recently created, > > I'm not objecting to a refactoring; that would work just fine for the > new package. > >> b) the imports are from other urllib submodules and therefore >> should be easy to understand and c) it mirrors what was done >> in urllib2.py. > > What I am objecting to is the assertion that importing names directly > into the global namespace for a module is in any way "cleaner". > That's a style issue, and I don't think there's anything approximating > consensus on the matter. OK, cleaner is perhaps the wrong word, forgive me for badly expressing myself :) What I meant is what I tried to explain in point b) -- since the imported names all refer to urllib-specific things, they do not cause confusion if you come across them unadorned in the source. Georg From guido at python.org Tue Jul 1 22:57:33 2008 From: guido at python.org (Guido van Rossum) Date: Tue, 1 Jul 2008 13:57:33 -0700 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: References: <20080701195601.35FC51E4002@bag.python.org> <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> <06FB6B1B-063C-42AA-9E49-CCF0808363D3@acm.org> Message-ID: On Tue, Jul 1, 2008 at 1:53 PM, Georg Brandl wrote: > Fred Drake schrieb: > >> On Jul 1, 2008, at 4:28 PM, Georg Brandl wrote: >> >>> While I'm opposed to sweeping stdlib refactorings, this is an >>> exception because a) the urllib package was only recently created, >>> >> >> I'm not objecting to a refactoring; that would work just fine for the new >> package. >> >> b) the imports are from other urllib submodules and therefore >>> should be easy to understand and c) it mirrors what was done >>> in urllib2.py. >>> >> >> What I am objecting to is the assertion that importing names directly >> into the global namespace for a module is in any way "cleaner". That's a >> style issue, and I don't think there's anything approximating consensus on >> the matter. >> > > OK, cleaner is perhaps the wrong word, forgive me for badly expressing > myself :) What I meant is what I tried to explain in point b) -- since > the imported names all refer to urllib-specific things, they do not > cause confusion if you come across them unadorned in the source. > For comparison, the Google style guide for Python code specifically forbids this particular style, motivated by making it clearer where things come from. -- --Guido van Rossum (home page: http://www.python.org/~guido/) -------------- next part -------------- An HTML attachment was scrubbed... URL: From fdrake at acm.org Tue Jul 1 23:15:02 2008 From: fdrake at acm.org (Fred Drake) Date: Tue, 1 Jul 2008 17:15:02 -0400 Subject: [Python-3000-checkins] r64624 - in python/branches/py3k/Lib/urllib: parse.py request.py In-Reply-To: References: <20080701195601.35FC51E4002@bag.python.org> <8450E9B2-F6C4-4914-BF4B-956C5F97C6F3@acm.org> <06FB6B1B-063C-42AA-9E49-CCF0808363D3@acm.org> Message-ID: <373A7CCF-2F31-48B7-8E42-AC76A54400F0@acm.org> On Jul 1, 2008, at 4:57 PM, Guido van Rossum wrote: > For comparison, the Google style guide for Python code specifically > forbids this particular style, motivated by making it clearer where > things come from. This is nice to know. We don't do this for Zope Corp code either, for the same reason. Existing Zope 3 code regularly gets "fixed" in this regard before substantial changes are made, though there's no pro-active changes made on this basis. -Fred -- Fred Drake From python-3000-checkins at python.org Wed Jul 2 03:57:57 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Wed, 2 Jul 2008 03:57:57 +0200 (CEST) Subject: [Python-3000-checkins] r64650 - python/branches/py3k Message-ID: <20080702015757.701E71E4002@bag.python.org> Author: brett.cannon Date: Wed Jul 2 03:57:57 2008 New Revision: 64650 Log: Blocked revisions 64649 via svnmerge ........ r64649 | brett.cannon | 2008-07-01 18:57:08 -0700 (Tue, 01 Jul 2008) | 8 lines Handle urllib's renaming for Python 3.0: * Deprecate urllib.urlopen() in favor of urllib2.urlopen() for 3.0. * Update docs to mention split/rename of the module and deprecation of urlopen(). Changes to lib2to3 are in a separate commit. Work is for issue #2885. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 2 16:44:55 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 16:44:55 +0200 (CEST) Subject: [Python-3000-checkins] r64658 - python/branches/py3k/Doc/reference/datamodel.rst Message-ID: <20080702144455.1C2BF1E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 16:44:54 2008 New Revision: 64658 Log: add an entry for object.__dir__ Modified: python/branches/py3k/Doc/reference/datamodel.rst Modified: python/branches/py3k/Doc/reference/datamodel.rst ============================================================================== --- python/branches/py3k/Doc/reference/datamodel.rst (original) +++ python/branches/py3k/Doc/reference/datamodel.rst Wed Jul 2 16:44:54 2008 @@ -1314,6 +1314,11 @@ should only be implemented if ``del obj.name`` is meaningful for the object. +.. method:: object.__dir__(self) + + Called when :func:`dir` is called on the object. A list must be returned. + + .. _descriptors: Implementing Descriptors From python-3000-checkins at python.org Wed Jul 2 17:15:37 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 17:15:37 +0200 (CEST) Subject: [Python-3000-checkins] r64659 - python/branches/py3k Message-ID: <20080702151537.4C4A01E4028@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 17:15:37 2008 New Revision: 64659 Log: Blocked revisions 64398,64400,64437,64456,64462,64511 via svnmerge ........ r64398 | barry.warsaw | 2008-06-18 20:48:07 -0500 (Wed, 18 Jun 2008) | 1 line Bumping to 2.6b1 ........ r64400 | barry.warsaw | 2008-06-18 21:31:54 -0500 (Wed, 18 Jun 2008) | 1 line Post release changes ........ r64437 | andrew.kuchling | 2008-06-20 19:17:22 -0500 (Fri, 20 Jun 2008) | 1 line Correct two versionchanged directives, to improve the 'changes' output ........ r64456 | facundo.batista | 2008-06-22 11:11:34 -0500 (Sun, 22 Jun 2008) | 4 lines Trying to see if the @ in a path is causing the issue in the shutil.rmtree() in the trunk.loewis-sun buildbot. ........ r64462 | facundo.batista | 2008-06-22 13:23:55 -0500 (Sun, 22 Jun 2008) | 4 lines Trying to see if the problem in Martin's buildot is at directory creation time... ........ r64511 | raymond.hettinger | 2008-06-24 10:58:53 -0500 (Tue, 24 Jun 2008) | 1 line Issue 3189: Py3k DeprecationWarning in difflib ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 2 18:11:43 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 18:11:43 +0200 (CEST) Subject: [Python-3000-checkins] r64660 - in python/branches/py3k: Doc/library/math.rst Lib/logging/config.py Lib/test/test_site.py Lib/test/test_slice.py Modules/_cursesmodule.c Modules/mathmodule.c Objects/sliceobject.c Message-ID: <20080702161143.748221E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 18:11:42 2008 New Revision: 64660 Log: Merged revisions 64365,64370,64406,64408-64409,64412,64416-64417,64420-64421,64425-64428 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64365 | raymond.hettinger | 2008-06-17 19:56:57 -0500 (Tue, 17 Jun 2008) | 1 line Fix double decref. ........ r64370 | mark.dickinson | 2008-06-18 04:20:17 -0500 (Wed, 18 Jun 2008) | 2 lines Typo fix ........ r64406 | andrew.kuchling | 2008-06-19 09:02:30 -0500 (Thu, 19 Jun 2008) | 1 line Only include update_lines_cols() function when it's actually going to be used ........ r64408 | amaury.forgeotdarc | 2008-06-19 14:57:39 -0500 (Thu, 19 Jun 2008) | 2 lines test_macos can be skipped on non-mac platforms. ........ r64409 | andrew.kuchling | 2008-06-19 15:33:31 -0500 (Thu, 19 Jun 2008) | 1 line Put threading in front of thread ........ r64412 | amaury.forgeotdarc | 2008-06-19 16:17:12 -0500 (Thu, 19 Jun 2008) | 3 lines In test_site, correctly escape backslashes in path names. This allows the test to pass when the username begins with a lowercase 't'... ........ r64416 | vinay.sajip | 2008-06-19 17:40:17 -0500 (Thu, 19 Jun 2008) | 2 lines Bug #3136: fileConfig()'s disabling of old loggers is now conditional via an optional disable_existing_loggers parameter, but the default value is such that the old behaviour is preserved. Thanks to Leandro Lucarella for the patch. ........ r64417 | vinay.sajip | 2008-06-19 17:41:08 -0500 (Thu, 19 Jun 2008) | 1 line Updated with fix for #3136. ........ r64420 | andrew.kuchling | 2008-06-19 21:05:57 -0500 (Thu, 19 Jun 2008) | 1 line Various items ........ r64421 | andrew.kuchling | 2008-06-19 21:11:42 -0500 (Thu, 19 Jun 2008) | 1 line Fix comment typos ........ r64425 | andrew.kuchling | 2008-06-20 06:39:54 -0500 (Fri, 20 Jun 2008) | 1 line Various items ........ r64426 | mark.dickinson | 2008-06-20 09:53:43 -0500 (Fri, 20 Jun 2008) | 4 lines Issue #3004: Minor fix to slice.indices(). slice(-10).indices(9) now returns (0, 0, 1) instead of (0, -1, 1), and slice(None, 10, -1).indices(10) returns (9, 9, -1) instead of (9, 10, -1). ........ r64427 | mark.dickinson | 2008-06-20 10:17:41 -0500 (Fri, 20 Jun 2008) | 2 lines Fix outdated count of the number of new math module functions. ........ r64428 | mark.dickinson | 2008-06-20 10:26:19 -0500 (Fri, 20 Jun 2008) | 2 lines Fix another typo in math_sum comment ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/math.rst python/branches/py3k/Lib/logging/config.py python/branches/py3k/Lib/test/test_site.py python/branches/py3k/Lib/test/test_slice.py python/branches/py3k/Modules/_cursesmodule.c python/branches/py3k/Modules/mathmodule.c python/branches/py3k/Objects/sliceobject.c Modified: python/branches/py3k/Doc/library/math.rst ============================================================================== --- python/branches/py3k/Doc/library/math.rst (original) +++ python/branches/py3k/Doc/library/math.rst Wed Jul 2 18:11:42 2008 @@ -43,7 +43,7 @@ .. function:: factorial(x) - Return *x* factorial. Raises :exc:`ValueError` if *x* is not intergral or + Return *x* factorial. Raises :exc:`ValueError` if *x* is not integral or is negative. .. function:: floor(x) Modified: python/branches/py3k/Lib/logging/config.py ============================================================================== --- python/branches/py3k/Lib/logging/config.py (original) +++ python/branches/py3k/Lib/logging/config.py Wed Jul 2 18:11:42 2008 @@ -49,7 +49,7 @@ # _listener holds the server object doing the listening _listener = None -def fileConfig(fname, defaults=None): +def fileConfig(fname, defaults=None, disable_existing_loggers=1): """ Read the logging configuration from a ConfigParser-format file. @@ -79,7 +79,7 @@ del logging._handlerList[:] # Handlers add themselves to logging._handlers handlers = _install_handlers(cp, formatters) - _install_loggers(cp, handlers) + _install_loggers(cp, handlers, disable_existing_loggers) finally: logging._releaseLock() @@ -167,7 +167,7 @@ return handlers -def _install_loggers(cp, handlers): +def _install_loggers(cp, handlers, disable_existing_loggers): """Create and install loggers""" # configure the root first @@ -252,7 +252,7 @@ logger.level = logging.NOTSET logger.handlers = [] logger.propagate = 1 - else: + elif disable_existing_loggers: logger.disabled = 1 Modified: python/branches/py3k/Lib/test/test_site.py ============================================================================== --- python/branches/py3k/Lib/test/test_site.py (original) +++ python/branches/py3k/Lib/test/test_site.py Wed Jul 2 18:11:42 2008 @@ -101,17 +101,17 @@ self.assert_(usersite in sys.path) rc = subprocess.call([sys.executable, '-c', - 'import sys; sys.exit("%s" in sys.path)' % usersite]) + 'import sys; sys.exit(%r in sys.path)' % usersite]) self.assertEqual(rc, 1) rc = subprocess.call([sys.executable, '-s', '-c', - 'import sys; sys.exit("%s" in sys.path)' % usersite]) + 'import sys; sys.exit(%r in sys.path)' % usersite]) self.assertEqual(rc, 0) env = os.environ.copy() env["PYTHONNOUSERSITE"] = "1" rc = subprocess.call([sys.executable, '-c', - 'import sys; sys.exit("%s" in sys.path)' % usersite], + 'import sys; sys.exit(%r in sys.path)' % usersite], env=env) self.assertEqual(rc, 0) Modified: python/branches/py3k/Lib/test/test_slice.py ============================================================================== --- python/branches/py3k/Lib/test/test_slice.py (original) +++ python/branches/py3k/Lib/test/test_slice.py Wed Jul 2 18:11:42 2008 @@ -82,6 +82,20 @@ self.assertEqual(slice(None, None, -1).indices(10), (9, -1, -1)) self.assertEqual(slice(None, None, -2).indices(10), (9, -1, -2)) self.assertEqual(slice(3, None, -2).indices(10), (3, -1, -2)) + # issue 3004 tests + self.assertEqual(slice(None, -9).indices(10), (0, 1, 1)) + self.assertEqual(slice(None, -10).indices(10), (0, 0, 1)) + self.assertEqual(slice(None, -11).indices(10), (0, 0, 1)) + self.assertEqual(slice(None, -10, -1).indices(10), (9, 0, -1)) + self.assertEqual(slice(None, -11, -1).indices(10), (9, -1, -1)) + self.assertEqual(slice(None, -12, -1).indices(10), (9, -1, -1)) + self.assertEqual(slice(None, 9).indices(10), (0, 9, 1)) + self.assertEqual(slice(None, 10).indices(10), (0, 10, 1)) + self.assertEqual(slice(None, 11).indices(10), (0, 10, 1)) + self.assertEqual(slice(None, 8, -1).indices(10), (9, 8, -1)) + self.assertEqual(slice(None, 9, -1).indices(10), (9, 9, -1)) + self.assertEqual(slice(None, 10, -1).indices(10), (9, 9, -1)) + self.assertEqual( slice(-100, 100 ).indices(10), slice(None).indices(10) Modified: python/branches/py3k/Modules/_cursesmodule.c ============================================================================== --- python/branches/py3k/Modules/_cursesmodule.c (original) +++ python/branches/py3k/Modules/_cursesmodule.c Wed Jul 2 18:11:42 2008 @@ -2380,6 +2380,7 @@ /* Internal helper used for updating curses.LINES, curses.COLS, _curses.LINES * and _curses.COLS */ +#if defined(HAVE_CURSES_RESIZETERM) || defined(HAVE_CURSES_RESIZE_TERM) static int update_lines_cols(void) { @@ -2424,6 +2425,7 @@ Py_DECREF(m); return 1; } +#endif #ifdef HAVE_CURSES_RESIZETERM static PyObject * Modified: python/branches/py3k/Modules/mathmodule.c ============================================================================== --- python/branches/py3k/Modules/mathmodule.c (original) +++ python/branches/py3k/Modules/mathmodule.c Wed Jul 2 18:11:42 2008 @@ -382,11 +382,11 @@ sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the overflow of the first partial sum. - Note 3: The itermediate values lo, yr, and hi are declared volatile so - aggressive compilers won't algebraicly reduce lo to always be exactly 0.0. + Note 3: The intermediate values lo, yr, and hi are declared volatile so + aggressive compilers won't algebraically reduce lo to always be exactly 0.0. Also, the volatile declaration forces the values to be stored in memory as regular doubles instead of extended long precision (80-bit) values. This - prevents double rounding because any addition or substraction of two doubles + prevents double rounding because any addition or subtraction of two doubles can be resolved exactly into double-sized hi and lo values. As long as the hi value gets forced into a double before yr and lo are computed, the extra bits in downstream extended precision operations (x87 for example) will be @@ -614,7 +614,6 @@ error: Py_DECREF(result); - Py_XDECREF(iobj); return NULL; } Modified: python/branches/py3k/Objects/sliceobject.c ============================================================================== --- python/branches/py3k/Objects/sliceobject.c (original) +++ python/branches/py3k/Objects/sliceobject.c Wed Jul 2 18:11:42 2008 @@ -169,8 +169,9 @@ else { if (!_PyEval_SliceIndex(r->stop, stop)) return -1; if (*stop < 0) *stop += length; - if (*stop < 0) *stop = -1; - if (*stop > length) *stop = length; + if (*stop < 0) *stop = (*step < 0) ? -1 : 0; + if (*stop >= length) + *stop = (*step < 0) ? length - 1 : length; } if ((*step < 0 && *stop >= *start) From python-3000-checkins at python.org Wed Jul 2 18:18:39 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 18:18:39 +0200 (CEST) Subject: [Python-3000-checkins] r64661 - python/branches/py3k Message-ID: <20080702161839.AB6DB1E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 18:18:39 2008 New Revision: 64661 Log: I'm blocking all these whatsnew revisions, so I can just manually sync it with 2.6; merging it has gotten quite out of hand Blocked revisions 64429,64436,64498,64572 via svnmerge ........ r64429 | georg.brandl | 2008-06-20 14:28:18 -0500 (Fri, 20 Jun 2008) | 2 lines Change references to the new math functions to generate proper x-refs. ........ r64436 | andrew.kuchling | 2008-06-20 18:43:12 -0500 (Fri, 20 Jun 2008) | 1 line Various items ........ r64498 | mark.dickinson | 2008-06-24 06:08:58 -0500 (Tue, 24 Jun 2008) | 4 lines Change description of float('nan') feature; NaNs don't care much about signs, and float('nan'), float('+nan') and float('-nan') actually all generate the exact same NaN value. ........ r64572 | benjamin.peterson | 2008-06-28 08:18:14 -0500 (Sat, 28 Jun 2008) | 1 line fix typo ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 2 18:19:29 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 18:19:29 +0200 (CEST) Subject: [Python-3000-checkins] r64662 - python/branches/py3k/Doc/whatsnew/2.6.rst Message-ID: <20080702161929.A66951E4012@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 18:19:28 2008 New Revision: 64662 Log: sync whatsnew with 2.6 Modified: python/branches/py3k/Doc/whatsnew/2.6.rst Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Wed Jul 2 18:19:28 2008 @@ -1,5 +1,5 @@ **************************** - What's New in Python 2.6 + What's New in Python 2.6 **************************** .. XXX add trademark info for Apple, Microsoft, SourceForge. @@ -10,42 +10,42 @@ .. $Id: whatsnew26.tex 55746 2007-06-02 18:33:53Z neal.norwitz $ Rules for maintenance: - + * Anyone can add text to this document. Do not spend very much time on the wording of your changes, because your text will probably get rewritten to some degree. - + * The maintainer will go through Misc/NEWS periodically and add changes; it's therefore more important to add your changes to Misc/NEWS than to this file. - + * This is not a complete list of every single change; completeness is the purpose of Misc/NEWS. Some changes I consider too small or esoteric to include. If such a change is added to the text, I'll just remove it. (This is another reason you shouldn't spend too much time on writing your addition.) - + * If you want to draw your new text to the attention of the maintainer, add 'XXX' to the beginning of the paragraph or section. - + * It's OK to just add a fragmentary note about a change. For example: "XXX Describe the transmogrify() function added to the socket module." The maintainer will research the change and write the necessary text. - + * You can comment out your additions if you like, but it's not necessary (especially when a final release is some months away). - + * Credit the author of a patch or bugfix. Just the name is sufficient; the e-mail address isn't necessary. - + * It's helpful to add the bug/patch number in a parenthetical comment. - + XXX Describe the transmogrify() function added to the socket module. (Contributed by P.Y. Developer; :issue:`12345`.) - + This saves the maintainer some effort going through the SVN logs when researching a change. @@ -74,7 +74,7 @@ ================ The development cycle for Python 2.6 also saw the release of the first -alphas of Python 3.0, and the development of 3.0 has influenced +alphas of Python 3.0, and the development of 3.0 has influenced a number of features in 2.6. Python 3.0 is a far-ranging redesign of Python that breaks @@ -83,7 +83,7 @@ Python 3.0. However, not all the changes in 3.0 necessarily break compatibility. In cases where new features won't cause existing code to break, they've been backported to 2.6 and are described in this -document in the appropriate place. Some of the 3.0-derived features +document in the appropriate place. Some of the 3.0-derived features are: * A :meth:`__complex__` method for converting objects to a complex number. @@ -94,8 +94,8 @@ A new command-line switch, :option:`-3`, enables warnings about features that will be removed in Python 3.0. You can run code with this switch to see how much work will be necessary to port -code to 3.0. The value of this switch is available -to Python code as the boolean variable ``sys.py3kwarning``, +code to 3.0. The value of this switch is available +to Python code as the boolean variable :data:`sys.py3kwarning`, and to C extension code as :cdata:`Py_Py3kWarningFlag`. Python 3.0 adds several new built-in functions and change the @@ -116,9 +116,9 @@ Development Changes ================================================== -While 2.6 was being developed, the Python development process -underwent two significant changes: the developer group -switched from SourceForge's issue tracker to a customized +While 2.6 was being developed, the Python development process +underwent two significant changes: the developer group +switched from SourceForge's issue tracker to a customized Roundup installation, and the documentation was converted from LaTeX to reStructuredText. @@ -135,34 +135,34 @@ therefore posted a call for issue trackers, asking volunteers to set up different products and import some of the bugs and patches from SourceForge. Four different trackers were examined: Atlassian's `Jira -`__, -`Launchpad `__, -`Roundup `__, and -`Trac `__. +`__, +`Launchpad `__, +`Roundup `__, and +`Trac `__. The committee eventually settled on Jira and Roundup as the two candidates. Jira is a commercial product that -offers a no-cost hosted instance to free-software projects; Roundup +offers a no-cost hosted instance to free-software projects; Roundup is an open-source project that requires volunteers to administer it and a server to host it. After posting a call for volunteers, a new Roundup installation was set up at http://bugs.python.org. One installation of Roundup can host multiple trackers, and this server now also hosts issue trackers -for Jython and for the Python web site. It will surely find +for Jython and for the Python web site. It will surely find other uses in the future. Where possible, this edition of "What's New in Python" links to the bug/patch item for each change. -Hosting is kindly provided by -`Upfront Systems `__ +Hosting is kindly provided by +`Upfront Systems `__ of Stellenbosch, South Africa. Martin von Loewis put a lot of effort into importing existing bugs and patches from -SourceForge; his scripts for this import operation are at +SourceForge; his scripts for this import operation are at http://svn.python.org/view/tracker/importer/. .. seealso:: - http://bugs.python.org + http://bugs.python.org The Python bug tracker. http://bugs.jython.org: @@ -189,8 +189,8 @@ Unfortunately, converting LaTeX to HTML is fairly complicated, and Fred L. Drake Jr., the Python documentation editor for many years, spent a lot of time wrestling the conversion process into shape. -Occasionally people would suggest converting the documentation into -SGML or, later, XML, but performing a good conversion is a major task +Occasionally people would suggest converting the documentation into +SGML or, later, XML, but performing a good conversion is a major task and no one pursued the task to completion. During the 2.6 development cycle, Georg Brandl put a substantial @@ -222,7 +222,7 @@ statement an optional feature, to be enabled by a ``from __future__ import with_statement`` directive. In 2.6 the statement no longer needs to be specially enabled; this means that :keyword:`with` is now always a -keyword. The rest of this section is a copy of the corresponding +keyword. The rest of this section is a copy of the corresponding section from "What's New in Python 2.5" document; if you read it back when Python 2.5 came out, you can skip the rest of this section. @@ -518,7 +518,7 @@ :pep:`370` - Per-user ``site-packages`` Directory PEP written and implemented by Christian Heimes. - + .. ====================================================================== .. _pep-0371: @@ -526,13 +526,27 @@ PEP 371: The ``multiprocessing`` Package ===================================================== -XXX write this. +.. XXX I think this still needs help + +:mod:`multiprocessing` makes it easy to distribute work over multiple processes. +Its API is similiar to that of :mod:`threading`. For example:: + + from multiprocessing import Process + + def long_hard_task(n): + print n * 43 + + for i in range(10): + Process(target=long_hard_task, args=(i)).start() + +will multiply the numbers between 0 and 10 times 43 and print out the result +concurrently. .. seealso:: - :pep:`371` - Per-user ``site-packages`` Directory + :pep:`371` - Addition of the multiprocessing package PEP written by Jesse Noller and Richard Oudkerk; - implemented by Jesse Noller. + implemented by Richard Oudkerk and Jesse Noller. .. ====================================================================== @@ -554,7 +568,7 @@ # Use the named keyword arguments uid = 'root' - + 'User ID: {uid} Last seen: {last_login}'.format(uid='root', last_login = '5 Mar 2008 07:20') -> 'User ID: root Last seen: 5 Mar 2008 07:20' @@ -563,8 +577,8 @@ format("Empty dict: {{}}") -> "Empty dict: {}" -Field names can be integers indicating positional arguments, such as -``{0}``, ``{1}``, etc. or names of keyword arguments. You can also +Field names can be integers indicating positional arguments, such as +``{0}``, ``{1}``, etc. or names of keyword arguments. You can also supply compound field names that read attributes or access dictionary keys:: import sys @@ -617,7 +631,7 @@ = (For numeric types only) Pad after the sign. ================ ============================================ -Format specifiers can also include a presentation type, which +Format specifiers can also include a presentation type, which controls how the value is formatted. For example, floating-point numbers can be formatted as a general number or in exponential notation: @@ -627,8 +641,7 @@ '3.750000e+00' A variety of presentation types are available. Consult the 2.6 -documentation for a complete list (XXX add link, once it's in the 2.6 -docs), but here's a sample:: +documentation for a :ref:`complete list `; here's a sample:: 'b' - Binary. Outputs the number in base 2. 'c' - Character. Converts the integer to the corresponding @@ -680,10 +693,10 @@ ===================================================== The ``print`` statement becomes the :func:`print` function in Python 3.0. -Making :func:`print` a function makes it easier to change -by doing 'def print(...)' or importing a new function from somewhere else. +Making :func:`print` a function makes it easier to change +by doing 'def print(...)' or importing a new function from somewhere else. -Python 2.6 has a ``__future__`` import that removes ``print`` as language +Python 2.6 has a ``__future__`` import that removes ``print`` as language syntax, letting you use the functional form instead. For example:: from __future__ import print_function @@ -697,7 +710,7 @@ * **args**: positional arguments whose values will be printed out. * **sep**: the separator, which will be printed between arguments. - * **end**: the ending text, which will be printed after all of the + * **end**: the ending text, which will be printed after all of the arguments have been output. * **file**: the file object to which the output will be sent. @@ -713,7 +726,7 @@ PEP 3110: Exception-Handling Changes ===================================================== -One error that Python programmers occasionally make +One error that Python programmers occasionally make is the following:: try: @@ -721,11 +734,11 @@ except TypeError, ValueError: ... -The author is probably trying to catch both +The author is probably trying to catch both :exc:`TypeError` and :exc:`ValueError` exceptions, but this code -actually does something different: it will catch +actually does something different: it will catch :exc:`TypeError` and bind the resulting exception object -to the local name ``"ValueError"``. The correct code +to the local name ``"ValueError"``. The correct code would have specified a tuple:: try: @@ -738,7 +751,7 @@ node that's a tuple. Python 3.0 changes the syntax to make this unambiguous by replacing -the comma with the word "as". To catch an exception and store the +the comma with the word "as". To catch an exception and store the exception object in the variable ``exc``, you must write:: try: @@ -763,14 +776,14 @@ PEP 3112: Byte Literals ===================================================== -Python 3.0 adopts Unicode as the language's fundamental string type, and -denotes 8-bit literals differently, either as ``b'string'`` -or using a :class:`bytes` constructor. For future compatibility, +Python 3.0 adopts Unicode as the language's fundamental string type and +denotes 8-bit literals differently, either as ``b'string'`` +or using a :class:`bytes` constructor. For future compatibility, Python 2.6 adds :class:`bytes` as a synonym for the :class:`str` type, and it also supports the ``b''`` notation. There's also a ``__future__`` import that causes all string literals -to become Unicode strings. This means that ``\u`` escape sequences +to become Unicode strings. This means that ``\u`` escape sequences can be used to include Unicode characters:: @@ -781,7 +794,38 @@ print len(s) # 12 Unicode characters - +At the C level, Python 3.0 will rename the existing 8-bit +string type, called :ctype:`PyStringObject` in Python 2.x, +to :ctype:`PyBytesObject`. Python 2.6 uses ``#define`` +to support using the names :cfunc:`PyBytesObject`, +:cfunc:`PyBytes_Check`, :cfunc:`PyBytes_FromStringAndSize`, +and all the other functions and macros used with strings. + +Instances of the :class:`bytes` type are immutable just +as strings are. A new :class:`bytearray` type stores a mutable +sequence of bytes:: + + >>> bytearray([65, 66, 67]) + bytearray(b'ABC') + >>> b = bytearray(u'\u21ef\u3244', 'utf-8') + >>> b + bytearray(b'\xe2\x87\xaf \xe3\x89\x84') + >>> b[0] = '\xe3' + >>> b + bytearray(b'\xe3\x87\xaf \xe3\x89\x84') + >>> unicode(str(b), 'utf-8') + u'\u31ef \u3244' + +Byte arrays support most of the methods of string types, such as +:meth:`startswith`/:meth:`endswith`, :meth:`find`/:meth:`rfind`, +and some of the methods of lists, such as :meth:`append`, +:meth:`pop`, and :meth:`reverse`. + + >>> b = bytearray('ABC') + >>> b.append('d') + >>> b.append(ord('e')) + >>> b + bytearray(b'ABCde') .. seealso:: @@ -806,7 +850,7 @@ the :mod:`io` module: * :class:`RawIOBase`: defines raw I/O operations: :meth:`read`, - :meth:`readinto`, + :meth:`readinto`, :meth:`write`, :meth:`seek`, :meth:`tell`, :meth:`truncate`, and :meth:`close`. Most of the methods of this class will often map to a single system call. @@ -819,36 +863,36 @@ .. XXX should 2.6 register them in io.py? -* :class:`BufferedIOBase`: is an abstract base class that - buffers data in memory to reduce the number of +* :class:`BufferedIOBase`: is an abstract base class that + buffers data in memory to reduce the number of system calls used, making I/O processing more efficient. - It supports all of the methods of :class:`RawIOBase`, + It supports all of the methods of :class:`RawIOBase`, and adds a :attr:`raw` attribute holding the underlying raw object. There are four concrete classes implementing this ABC: - :class:`BufferedWriter` and + :class:`BufferedWriter` and :class:`BufferedReader` for objects that only support writing or reading and don't support random access, :class:`BufferedRandom` for objects that support the :meth:`seek` method for random access, - and :class:`BufferedRWPair` for objects such as TTYs that have + and :class:`BufferedRWPair` for objects such as TTYs that have both read and write operations that act upon unconnected streams of data. * :class:`TextIOBase`: Provides functions for reading and writing strings (remember, strings will be Unicode in Python 3.0), - and supporting universal newlines. :class:`TextIOBase` defines - the :meth:`readline` method and supports iteration upon - objects. + and supporting universal newlines. :class:`TextIOBase` defines + the :meth:`readline` method and supports iteration upon + objects. There are two concrete implementations. :class:`TextIOWrapper` wraps a buffered I/O object, supporting all of the methods for - text I/O and adding a :attr:`buffer` attribute for access + text I/O and adding a :attr:`buffer` attribute for access to the underlying object. :class:`StringIO` simply buffers everything in memory without ever writing anything to disk. (In current 2.6 alpha releases, :class:`io.StringIO` is implemented in - pure Python, so it's pretty slow. You should therefore stick with the - existing :mod:`StringIO` module or :mod:`cStringIO` for now. At some + pure Python, so it's pretty slow. You should therefore stick with the + existing :mod:`StringIO` module or :mod:`cStringIO` for now. At some point Python 3.0's :mod:`io` module will be rewritten into C for speed, and perhaps the C implementation will be backported to the 2.x releases.) @@ -856,7 +900,7 @@ In Python 2.6, the underlying implementations haven't been restructured to build on top of the :mod:`io` module's classes. The -module is being provided to make it easier to write code that's +module is being provided to make it easier to write code that's forward-compatible with 3.0, and to save developers the effort of writing their own implementations of buffering and text I/O. @@ -875,7 +919,7 @@ ===================================================== The buffer protocol is a C-level API that lets Python types -exchange pointers into their internal representations. A +exchange pointers into their internal representations. A memory-mapped file can be viewed as a buffer of characters, for example, and this lets another module such as :mod:`re` treat memory-mapped files as a string of characters to be searched. @@ -883,19 +927,19 @@ The primary users of the buffer protocol are numeric-processing packages such as NumPy, which can expose the internal representation of arrays so that callers can write data directly into an array instead -of going through a slower API. This PEP updates the buffer protocol in light of experience +of going through a slower API. This PEP updates the buffer protocol in light of experience from NumPy development, adding a number of new features -such as indicating the shape of an array, +such as indicating the shape of an array, locking memory . -The most important new C API function is +The most important new C API function is ``PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)``, which takes an object and a set of flags, and fills in the -``Py_buffer`` structure with information +``Py_buffer`` structure with information about the object's memory representation. Objects -can use this operation to lock memory in place +can use this operation to lock memory in place while an external caller could be modifying the contents, -so there's a corresponding +so there's a corresponding ``PyObject_ReleaseBuffer(PyObject *obj, Py_buffer *view)`` to indicate that the external caller is done. @@ -903,7 +947,7 @@ constraints upon the memory returned. Some examples are: * :const:`PyBUF_WRITABLE` indicates that the memory must be writable. - + * :const:`PyBUF_LOCK` requests a read-only or exclusive lock on the memory. * :const:`PyBUF_C_CONTIGUOUS` and :const:`PyBUF_F_CONTIGUOUS` @@ -917,7 +961,7 @@ :pep:`3118` - Revising the buffer protocol PEP written by Travis Oliphant and Carl Banks; implemented by Travis Oliphant. - + .. ====================================================================== @@ -929,16 +973,16 @@ Some object-oriented languages such as Java support interfaces: declarations that a class has a given set of methods or supports a given access protocol. Abstract Base Classes (or ABCs) are an equivalent feature for Python. The ABC -support consists of an :mod:`abc` module containing a metaclass called +support consists of an :mod:`abc` module containing a metaclass called :class:`ABCMeta`, special handling of this metaclass by the :func:`isinstance` and :func:`issubclass` built-ins, and a collection of basic ABCs that the Python developers think will be widely useful. -Let's say you have a particular class and wish to know whether it supports +Let's say you have a particular class and wish to know whether it supports dictionary-style access. The phrase "dictionary-style" is vague, however. -It probably means that accessing items with ``obj[1]`` works. -Does it imply that setting items with ``obj[2] = value`` works? +It probably means that accessing items with ``obj[1]`` works. +Does it imply that setting items with ``obj[2] = value`` works? Or that the object will have :meth:`keys`, :meth:`values`, and :meth:`items` methods? What about the iterative variants such as :meth:`iterkeys`? :meth:`copy` and :meth:`update`? Iterating over the object with :func:`iter`? @@ -947,7 +991,7 @@ module. :class:`Iterable` indicates that a class defines :meth:`__iter__`, and :class:`Container` means the class supports ``x in y`` expressions by defining a :meth:`__contains__` method. The basic dictionary interface of -getting items, setting items, and +getting items, setting items, and :meth:`keys`, :meth:`values`, and :meth:`items`, is defined by the :class:`MutableMapping` ABC. @@ -955,22 +999,22 @@ to indicate they support that ABC's interface:: import collections - + class Storage(collections.MutableMapping): ... -Alternatively, you could write the class without deriving from +Alternatively, you could write the class without deriving from the desired ABC and instead register the class by calling the ABC's :meth:`register` method:: import collections - + class Storage: ... - + collections.MutableMapping.register(Storage) - + For classes that you write, deriving from the ABC is probably clearer. The :meth:`register` method is useful when you've written a new ABC that can describe an existing type or class, or if you want @@ -983,8 +1027,8 @@ PrintableType.register(float) PrintableType.register(str) -Classes should obey the semantics specified by an ABC, but -Python can't check this; it's up to the class author to +Classes should obey the semantics specified by an ABC, but +Python can't check this; it's up to the class author to understand the ABC's requirements and to implement the code accordingly. To check whether an object supports a particular interface, you can @@ -992,11 +1036,11 @@ def func(d): if not isinstance(d, collections.MutableMapping): - raise ValueError("Mapping object expected, not %r" % d) + raise ValueError("Mapping object expected, not %r" % d) -(Don't feel that you must now begin writing lots of checks as in the -above example. Python has a strong tradition of duck-typing, where -explicit type-checking isn't done and code simply calls methods on +(Don't feel that you must now begin writing lots of checks as in the +above example. Python has a strong tradition of duck-typing, where +explicit type-checking isn't done and code simply calls methods on an object, trusting that those methods will be there and raising an exception if they aren't. Be judicious in checking for ABCs and only do it where it helps.) @@ -1008,46 +1052,46 @@ class Drawable(): __metaclass__ = ABCMeta - + def draw(self, x, y, scale=1.0): pass def draw_doubled(self, x, y): self.draw(x, y, scale=2.0) - + class Square(Drawable): def draw(self, x, y, scale): ... - + In the :class:`Drawable` ABC above, the :meth:`draw_doubled` method renders the object at twice its size and can be implemented in terms of other methods described in :class:`Drawable`. Classes implementing -this ABC therefore don't need to provide their own implementation +this ABC therefore don't need to provide their own implementation of :meth:`draw_doubled`, though they can do so. An implementation -of :meth:`draw` is necessary, though; the ABC can't provide -a useful generic implementation. You -can apply the ``@abstractmethod`` decorator to methods such as -:meth:`draw` that must be implemented; Python will -then raise an exception for classes that +of :meth:`draw` is necessary, though; the ABC can't provide +a useful generic implementation. You +can apply the ``@abstractmethod`` decorator to methods such as +:meth:`draw` that must be implemented; Python will +then raise an exception for classes that don't define the method:: class Drawable(): __metaclass__ = ABCMeta - + @abstractmethod def draw(self, x, y, scale): pass -Note that the exception is only raised when you actually +Note that the exception is only raised when you actually try to create an instance of a subclass without the method:: >>> s=Square() Traceback (most recent call last): File "", line 1, in TypeError: Can't instantiate abstract class Square with abstract methods draw - >>> + >>> Abstract data attributes can be declared using the ``@abstractproperty`` decorator:: @@ -1055,7 +1099,7 @@ def readonly(self): return self._x -Subclasses must then define a :meth:`readonly` property +Subclasses must then define a :meth:`readonly` property .. seealso:: @@ -1076,7 +1120,7 @@ adds support for binary (base-2) integer literals, signalled by a "0b" or "0B" prefix. -Python 2.6 doesn't drop support for a leading 0 signalling +Python 2.6 doesn't drop support for a leading 0 signalling an octal number, but it does add support for "0o" and "0b":: >>> 0o21, 2*8 + 1 @@ -1084,8 +1128,8 @@ >>> 0b101111 47 -The :func:`oct` built-in still returns numbers -prefixed with a leading zero, and a new :func:`bin` +The :func:`oct` built-in still returns numbers +prefixed with a leading zero, and a new :func:`bin` built-in returns the binary representation for a number:: >>> oct(42) @@ -1161,36 +1205,36 @@ round off the results or introduce tiny errors that may break the commutativity and associativity properties; inexact numbers may perform such rounding or introduce small errors. Integers, long -integers, and rational numbers are exact, while floating-point +integers, and rational numbers are exact, while floating-point and complex numbers are inexact. :class:`Complex` is a subclass of :class:`Number`. Complex numbers can undergo the basic operations of addition, subtraction, multiplication, division, and exponentiation, and you can retrieve the -real and imaginary parts and obtain a number's conjugate. Python's built-in +real and imaginary parts and obtain a number's conjugate. Python's built-in complex type is an implementation of :class:`Complex`. -:class:`Real` further derives from :class:`Complex`, and adds -operations that only work on real numbers: :func:`floor`, :func:`trunc`, -rounding, taking the remainder mod N, floor division, -and comparisons. +:class:`Real` further derives from :class:`Complex`, and adds +operations that only work on real numbers: :func:`floor`, :func:`trunc`, +rounding, taking the remainder mod N, floor division, +and comparisons. :class:`Rational` numbers derive from :class:`Real`, have :attr:`numerator` and :attr:`denominator` properties, and can be converted to floats. Python 2.6 adds a simple rational-number class, -:class:`Fraction`, in the :mod:`fractions` module. (It's called -:class:`Fraction` instead of :class:`Rational` to avoid +:class:`Fraction`, in the :mod:`fractions` module. (It's called +:class:`Fraction` instead of :class:`Rational` to avoid a name clash with :class:`numbers.Rational`.) :class:`Integral` numbers derive from :class:`Rational`, and -can be shifted left and right with ``<<`` and ``>>``, -combined using bitwise operations such as ``&`` and ``|``, +can be shifted left and right with ``<<`` and ``>>``, +combined using bitwise operations such as ``&`` and ``|``, and can be used as array indexes and slice boundaries. In Python 3.0, the PEP slightly redefines the existing built-ins :func:`round`, :func:`math.floor`, :func:`math.ceil`, and adds a new -one, :func:`math.trunc`, that's been backported to Python 2.6. -:func:`math.trunc` rounds toward zero, returning the closest +one, :func:`math.trunc`, that's been backported to Python 2.6. +:func:`math.trunc` rounds toward zero, returning the closest :class:`Integral` that's between the function's argument and zero. .. seealso:: @@ -1201,16 +1245,16 @@ `Scheme's numerical tower `__, from the Guile manual. `Scheme's number datatypes `__ from the R5RS Scheme specification. - + The :mod:`fractions` Module -------------------------------------------------- -To fill out the hierarchy of numeric types, a rational-number class -has been added as the :mod:`fractions` module. Rational numbers are -represented as a fraction, and can exactly represent -numbers such as two-thirds that floating-point numbers can only -approximate. +To fill out the hierarchy of numeric types, a rational-number class is +provided by the :mod:`fractions` module. Rational numbers store their +values as a numerator and denominator forming a fraction, and can +exactly represent numbers such as ``2/3`` that floating-point numbers +can only approximate. The :class:`Fraction` constructor takes two :class:`Integral` values that will be the numerator and denominator of the resulting fraction. :: @@ -1225,8 +1269,8 @@ >>> a/b Fraction(5, 3) -To help in converting floating-point numbers to rationals, -the float type now has a :meth:`as_integer_ratio()` method that returns +To help in converting floating-point numbers to rationals, +the float type now has a :meth:`as_integer_ratio()` method that returns the numerator and denominator for a fraction that evaluates to the same floating-point value:: @@ -1253,13 +1297,21 @@ Here are all of the changes that Python 2.6 makes to the core Python language. +* The :func:`hasattr` function was catching and ignoring all errors, + under the assumption that they meant a :meth:`__getattr__` method + was failing somewhere and the return value of :func:`hasattr` would + therefore be ``False``. This logic shouldn't be applied to + :exc:`KeyboardInterrupt` and :exc:`SystemExit`, however; Python 2.6 + will no longer discard such exceptions when :func:`hasattr` + encounters them. (Fixed by Benjamin Peterson; :issue:`2196`.) + * When calling a function using the ``**`` syntax to provide keyword arguments, you are no longer required to use a Python dictionary; any mapping will now work:: >>> def f(**kw): ... print sorted(kw) - ... + ... >>> ud=UserDict.UserDict() >>> ud['a'] = 1 >>> ud['b'] = 'string' @@ -1289,21 +1341,21 @@ * Properties now have three attributes, :attr:`getter`, :attr:`setter` and :attr:`deleter`, that are useful shortcuts for - adding or modifying a getter, setter or deleter function to an + adding or modifying a getter, setter or deleter function to an existing property. You would use them like this:: class C(object): - @property - def x(self): - return self._x - - @x.setter - def x(self, value): - self._x = value - - @x.deleter - def x(self): - del self._x + @property + def x(self): + return self._x + + @x.setter + def x(self, value): + self._x = value + + @x.deleter + def x(self): + del self._x class D(C): @C.x.getter @@ -1314,51 +1366,65 @@ def x(self, value): self._x = value / 2 +* Several methods of the built-in set types now accept multiple iterables: + :meth:`intersection`, + :meth:`intersection_update`, + :meth:`union`, :meth:`update`, + :meth:`difference` and :meth:`difference_update`. -* C functions and methods that use - :cfunc:`PyComplex_AsCComplex` will now accept arguments that - have a :meth:`__complex__` method. In particular, the functions in the - :mod:`cmath` module will now accept objects with this method. - This is a backport of a Python 3.0 change. - (Contributed by Mark Dickinson; :issue:`1675423`.) + :: + + >>> s=set('1234567890') + >>> s.intersection('abc123', 'cdf246') # Intersection between all inputs + set(['2']) + >>> s.difference('246', '789') + set(['1', '0', '3', '5']) + + (Contributed by Raymond Hettinger.) - A numerical nicety: when creating a complex number from two floats - on systems that support signed zeros (-0 and +0), the - :func:`complex` constructor will now preserve the sign - of the zero. (:issue:`1507`) +* A numerical nicety: when creating a complex number from two floats + on systems that support signed zeros (-0 and +0), the + :func:`complex` constructor will now preserve the sign + of the zero. (Fixed by Mark T. Dickinson; :issue:`1507`) * More floating-point features were also added. The :func:`float` function - will now turn the strings ``+nan`` and ``-nan`` into the corresponding - IEEE 754 Not A Number values, and ``+inf`` and ``-inf`` into - positive or negative infinity. This works on any platform with + will now turn the string ``nan`` into an + IEEE 754 Not A Number value, and ``+inf`` and ``-inf`` into + positive or negative infinity. This works on any platform with IEEE 754 semantics. (Contributed by Christian Heimes; :issue:`1635`.) Other functions in the :mod:`math` module, :func:`isinf` and :func:`isnan`, return true if their floating-point argument is infinite or Not A Number. (:issue:`1640`) -* The :mod:`math` module has seven new functions, and the existing +* The :mod:`math` module has a number of new functions, and the existing functions have been improved to give more consistent behaviour across platforms, especially with respect to handling of floating-point exceptions and IEEE 754 special values. - The new functions are: + The new functions are: - * :func:`isinf` and :func:`isnan` determine whether a given float is - a (positive or negative) infinity or a NaN (Not a Number), - respectively. + * :func:`~math.isinf` and :func:`~math.isnan` determine whether a given float + is a (positive or negative) infinity or a NaN (Not a Number), respectively. - * ``copysign(x, y)`` copies the sign bit of an IEEE 754 number, + * :func:`~math.copysign` copies the sign bit of an IEEE 754 number, returning the absolute value of *x* combined with the sign bit of *y*. For example, ``math.copysign(1, -0.0)`` returns -1.0. (Contributed by Christian Heimes.) - * The inverse hyperbolic functions :func:`acosh`, :func:`asinh` and - :func:`atanh`. + * :func:`~math.factorial` computes the factorial of a number. + (Contributed by Raymond Hettinger; :issue:`2138`.) - * The function :func:`log1p`, returning the natural logarithm of - *1+x* (base *e*). + * :func:`~math.sum` adds up the stream of numbers from an iterable, + and is careful to avoid loss of precision by calculating partial sums. + (Contributed by Jean Brouwers; :issue:`2819`.) - There's also a new :func:`trunc` function as a result of the + * The inverse hyperbolic functions :func:`~math.acosh`, :func:`~math.asinh` + and :func:`~math.atanh`. + + * The function :func:`~math.log1p`, returning the natural logarithm of *1+x* + (base *e*). + + There's also a new :func:`trunc` built-in function as a result of the backport of `PEP 3141's type hierarchy for numbers <#pep-3141>`__. The existing math functions have been modified to follow the @@ -1375,31 +1441,31 @@ (Contributed by Christian Heimes and Mark Dickinson.) * Changes to the :class:`Exception` interface - as dictated by :pep:`352` continue to be made. For 2.6, + as dictated by :pep:`352` continue to be made. For 2.6, the :attr:`message` attribute is being deprecated in favor of the :attr:`args` attribute. -* The :exc:`GeneratorExit` exception now subclasses - :exc:`BaseException` instead of :exc:`Exception`. This means +* The :exc:`GeneratorExit` exception now subclasses + :exc:`BaseException` instead of :exc:`Exception`. This means that an exception handler that does ``except Exception:`` - will not inadvertently catch :exc:`GeneratorExit`. + will not inadvertently catch :exc:`GeneratorExit`. (Contributed by Chad Austin; :issue:`1537`.) -* Generator objects now have a :attr:`gi_code` attribute that refers to - the original code object backing the generator. +* Generator objects now have a :attr:`gi_code` attribute that refers to + the original code object backing the generator. (Contributed by Collin Winter; :issue:`1473257`.) * The :func:`compile` built-in function now accepts keyword arguments as well as positional parameters. (Contributed by Thomas Wouters; :issue:`1444529`.) -* The :func:`complex` constructor now accepts strings containing +* The :func:`complex` constructor now accepts strings containing parenthesized complex numbers, letting ``complex(repr(cmplx))`` will now round-trip values. For example, ``complex('(3+4j)')`` now returns the value (3+4j). (:issue:`1491866`) -* The string :meth:`translate` method now accepts ``None`` as the - translation table parameter, which is treated as the identity +* The string :meth:`translate` method now accepts ``None`` as the + translation table parameter, which is treated as the identity transformation. This makes it easier to carry out operations that only delete characters. (Contributed by Bengt Richter; :issue:`1193128`.) @@ -1408,7 +1474,7 @@ method on the objects it receives. This method must return a list of strings containing the names of valid attributes for the object, and lets the object control the value that :func:`dir` produces. - Objects that have :meth:`__getattr__` or :meth:`__getattribute__` + Objects that have :meth:`__getattr__` or :meth:`__getattribute__` methods can use this to advertise pseudo-attributes they will honor. (:issue:`1591665`) @@ -1436,12 +1502,12 @@ * Type objects now have a cache of methods that can reduce the amount of work required to find the correct method implementation for a particular class; once cached, the interpreter doesn't need to - traverse base classes to figure out the right method to call. - The cache is cleared if a base class or the class itself is modified, - so the cache should remain correct even in the face of Python's dynamic + traverse base classes to figure out the right method to call. + The cache is cleared if a base class or the class itself is modified, + so the cache should remain correct even in the face of Python's dynamic nature. - (Original optimization implemented by Armin Rigo, updated for - Python 2.6 by Kevin Jacobs; :issue:`1700288`.) + (Original optimization implemented by Armin Rigo, updated for + Python 2.6 by Kevin Jacobs; :issue:`1700288`.) * All of the functions in the :mod:`struct` module have been rewritten in C, thanks to work at the Need For Speed sprint. @@ -1452,7 +1518,7 @@ these types. (Contributed by Neal Norwitz.) * Unicode strings now use faster code for detecting - whitespace and line breaks; this speeds up the :meth:`split` method + whitespace and line breaks; this speeds up the :meth:`split` method by about 25% and :meth:`splitlines` by 35%. (Contributed by Antoine Pitrou.) Memory usage is reduced by using pymalloc for the Unicode string's data. @@ -1469,9 +1535,9 @@ .. ====================================================================== -.. _new-26-interactive: +.. _new-26-interpreter: -Interactive Interpreter Changes +Interpreter Changes ------------------------------- Two command-line options have been reserved for use by other Python @@ -1482,6 +1548,25 @@ Jython, or IronPython. If either option is used with Python 2.6, the interpreter will report that the option isn't currently used. +It's now possible to prevent Python from writing :file:`.pyc` or +:file:`.pyo` files on importing a module by supplying the :option:`-B` +switch to the Python interpreter, or by setting the +:envvar:`PYTHONDONTWRITEBYTECODE` environment variable before running +the interpreter. This setting is available to Python programs as the +``sys.dont_write_bytecode`` variable, and can be changed by Python +code to modify the interpreter's behaviour. (Contributed by Neal +Norwitz and Georg Brandl.) + +The encoding used for standard input, output, and standard error can +be specified by setting the :envvar:`PYTHONIOENCODING` environment +variable before running the interpreter. The value should be a string +in the form ``**encoding**`` or ``**encoding**:**errorhandler**``. +The **encoding** part specifies the encoding's name, e.g. ``utf-8`` or +``latin-1``; the optional **errorhandler** part specifies +what to do with characters that can't be handled by the encoding, +and should be one of "error", "ignore", or "replace". (Contributed +by Martin von Loewis.) + .. ====================================================================== New, Improved, and Deprecated Modules @@ -1493,23 +1578,11 @@ complete list of changes, or look through the Subversion logs for all the details. -* (3.0-warning mode) Python 3.0 will feature a reorganized standard - library; many outdated modules are being dropped, - and some modules are being renamed or moved into packages. - Python 2.6 running in 3.0-warning mode will warn about these modules +* (3.0-warning mode) Python 3.0 will feature a reorganized standard + library; many outdated modules are being dropped. + Python 2.6 running in 3.0-warning mode will warn about these modules when they are imported. - The modules that have been renamed are: - - * :mod:`ConfigParser` has become :mod:`configparser`. - * :mod:`copy_reg` has become :mod:`copyreg`. - * :mod:`htmlentitydefs` has become :mod:`html.entities`. - * :mod:`HTMLParser` has become :mod:`html.parser`. - * :mod:`repr` (the module) has become :mod:`reprlib`. - * :mod:`SocketServer` has become :mod:`socketserver`. - * :mod:`Tkinter` has become the :mod:`tkinter` package. - * :mod:`Queue` has become :mod:`queue`. - The list of deprecated modules is: :mod:`audiodev`, :mod:`bgenlocations`, @@ -1526,6 +1599,7 @@ :mod:`imgfile`, :mod:`linuxaudiodev`, :mod:`mhlib`, + :mod:`mimetools`, :mod:`multifile`, :mod:`new`, :mod:`popen2`, @@ -1598,6 +1672,11 @@ :mod:`videoreader`, :mod:`WAIT`. +* The :mod:`asyncore` and :mod:`asynchat` modules are + being actively maintained again, and a number of patches and bugfixes + were applied. (Maintained by Josiah Carlson; see :issue:`1736190` for + one patch.) + * The :mod:`bsddb.dbshelve` module now uses the highest pickling protocol available, instead of restricting itself to protocol 1. (Contributed by W. Barnes; :issue:`1551443`.) @@ -1606,18 +1685,18 @@ thanks to Mark Dickinson and Christian Heimes, that added some new features and greatly improved the accuracy of the computations. - Five new functions were added: + Five new functions were added: * :func:`polar` converts a complex number to polar form, returning - the modulus and argument of that complex number. + the modulus and argument of that complex number. * :func:`rect` does the opposite, turning a (modulus, argument) pair back into the corresponding complex number. - * :func:`phase` returns the phase or argument of a complex number. + * :func:`phase` returns the phase or argument of a complex number. * :func:`isnan` returns True if either - the real or imaginary part of its argument is a NaN. + the real or imaginary part of its argument is a NaN. * :func:`isinf` returns True if either the real or imaginary part of its argument is infinite. @@ -1640,7 +1719,7 @@ fieldnames)` is a factory function that creates subclasses of the standard tuple whose fields are accessible by name as well as index. For example:: - >>> var_type = collections.namedtuple('variable', + >>> var_type = collections.namedtuple('variable', ... 'id name type size') # Names are separated by spaces or commas. # 'id, name, type, size' would also work. @@ -1659,15 +1738,15 @@ variable(id=1, name='amplitude', type='int', size=4) Where the new :class:`namedtuple` type proved suitable, the standard - library has been modified to return them. For example, - the :meth:`Decimal.as_tuple` method now returns a named tuple with + library has been modified to return them. For example, + the :meth:`Decimal.as_tuple` method now returns a named tuple with :attr:`sign`, :attr:`digits`, and :attr:`exponent` fields. (Contributed by Raymond Hettinger.) -* Another change to the :mod:`collections` module is that the +* Another change to the :mod:`collections` module is that the :class:`deque` type now supports an optional *maxlen* parameter; - if supplied, the deque's size will be restricted to no more + if supplied, the deque's size will be restricted to no more than *maxlen* items. Adding more items to a full deque causes old items to be discarded. @@ -1706,9 +1785,9 @@ (Contributed by Fabian Kreutz.) :: - # Boldface text starting at y=0,x=21 + # Boldface text starting at y=0,x=21 # and affecting the rest of the line. - stdscr.chgat(0,21, curses.A_BOLD) + stdscr.chgat(0,21, curses.A_BOLD) The :class:`Textbox` class in the :mod:`curses.textpad` module now supports editing in insert mode as well as overwrite mode. @@ -1720,7 +1799,7 @@ object, zero-padded on the left to six places. (Contributed by Skip Montanaro; :issue:`1158`.) -* The :mod:`decimal` module was updated to version 1.66 of +* The :mod:`decimal` module was updated to version 1.66 of `the General Decimal Specification `__. New features include some methods for some basic mathematical functions such as :meth:`exp` and :meth:`log10`:: @@ -1732,14 +1811,14 @@ >>> Decimal(1000).log10() Decimal("3") - The :meth:`as_tuple` method of :class:`Decimal` objects now returns a + The :meth:`as_tuple` method of :class:`Decimal` objects now returns a named tuple with :attr:`sign`, :attr:`digits`, and :attr:`exponent` fields. - + (Implemented by Facundo Batista and Mark Dickinson. Named tuple support added by Raymond Hettinger.) -* The :mod:`difflib` module's :class:`SequenceMatcher` class - now returns named tuples representing matches. +* The :mod:`difflib` module's :class:`SequenceMatcher` class + now returns named tuples representing matches. In addition to behaving like tuples, the returned values also have :attr:`a`, :attr:`b`, and :attr:`size` attributes. (Contributed by Raymond Hettinger.) @@ -1747,16 +1826,16 @@ * An optional ``timeout`` parameter was added to the :class:`ftplib.FTP` class constructor as well as the :meth:`connect` method, specifying a timeout measured in seconds. (Added by Facundo - Batista.) Also, the :class:`FTP` class's + Batista.) Also, the :class:`FTP` class's :meth:`storbinary` and :meth:`storlines` - now take an optional *callback* parameter that will be called with + now take an optional *callback* parameter that will be called with each block of data after the data has been sent. (Contributed by Phil Schwartz; :issue:`1221598`.) -* The :func:`reduce` built-in function is also available in the +* The :func:`reduce` built-in function is also available in the :mod:`functools` module. In Python 3.0, the built-in is dropped and it's only available from :mod:`functools`; currently there are no plans - to drop the built-in in the 2.x series. (Patched by + to drop the built-in in the 2.x series. (Patched by Christian Heimes; :issue:`1739906`.) * When possible, the :mod:`getpass` module will now use @@ -1772,7 +1851,7 @@ * The :mod:`gopherlib` module has been removed. -* A new function in the :mod:`heapq` module: ``merge(iter1, iter2, ...)`` +* A new function in the :mod:`heapq` module: ``merge(iter1, iter2, ...)`` takes any number of iterables that return data *in sorted order*, and returns a new iterator that returns the contents of all the iterators, also in sorted order. For example:: @@ -1781,7 +1860,7 @@ [1, 2, 3, 5, 8, 9, 16] Another new function, ``heappushpop(heap, item)``, - pushes *item* onto *heap*, then pops off and returns the smallest item. + pushes *item* onto *heap*, then pops off and returns the smallest item. This is more efficient than making a call to :func:`heappush` and then :func:`heappop`. @@ -1792,18 +1871,18 @@ (Contributed by Raymond Hettinger.) * An optional ``timeout`` parameter was added to the - :class:`httplib.HTTPConnection` and :class:`HTTPSConnection` + :class:`httplib.HTTPConnection` and :class:`HTTPSConnection` class constructors, specifying a timeout measured in seconds. (Added by Facundo Batista.) -* Most of the :mod:`inspect` module's functions, such as - :func:`getmoduleinfo` and :func:`getargs`, now return named tuples. +* Most of the :mod:`inspect` module's functions, such as + :func:`getmoduleinfo` and :func:`getargs`, now return named tuples. In addition to behaving like tuples, the elements of the return value can also be accessed as attributes. (Contributed by Raymond Hettinger.) - Some new functions in the module include - :func:`isgenerator`, :func:`isgeneratorfunction`, + Some new functions in the module include + :func:`isgenerator`, :func:`isgeneratorfunction`, and :func:`isabstract`. * The :mod:`itertools` module gained several new functions. @@ -1820,25 +1899,25 @@ every possible combination of the elements returned from each iterable. :: itertools.product([1,2,3], [4,5,6]) -> - [(1, 4), (1, 5), (1, 6), - (2, 4), (2, 5), (2, 6), + [(1, 4), (1, 5), (1, 6), + (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)] The optional *repeat* keyword argument is used for taking the - product of an iterable or a set of iterables with themselves, + product of an iterable or a set of iterables with themselves, repeated *N* times. With a single iterable argument, *N*-tuples are returned:: itertools.product([1,2], repeat=3)) -> - [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), + [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)] With two iterables, *2N*-tuples are returned. :: itertools(product([1,2], [3,4], repeat=2) -> - [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4), - (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4), - (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4), + [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4), + (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4), + (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4), (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)] ``combinations(iterable, r)`` returns sub-sequences of length *r* from @@ -1851,35 +1930,35 @@ [('1', '2', '3')] itertools.combinations('1234', 3) -> - [('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), + [('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), ('2', '3', '4')] ``permutations(iter[, r])`` returns all the permutations of length *r* of - the iterable's elements. If *r* is not specified, it will default to the + the iterable's elements. If *r* is not specified, it will default to the number of elements produced by the iterable. :: itertools.permutations([1,2,3,4], 2) -> - [(1, 2), (1, 3), (1, 4), - (2, 1), (2, 3), (2, 4), - (3, 1), (3, 2), (3, 4), + [(1, 2), (1, 3), (1, 4), + (2, 1), (2, 3), (2, 4), + (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)] ``itertools.chain(*iterables)`` is an existing function in :mod:`itertools` that gained a new constructor in Python 2.6. - ``itertools.chain.from_iterable(iterable)`` takes a single + ``itertools.chain.from_iterable(iterable)`` takes a single iterable that should return other iterables. :func:`chain` will then return all the elements of the first iterable, then all the elements of the second, and so on. :: chain.from_iterable([[1,2,3], [4,5,6]]) -> [1, 2, 3, 4, 5, 6] - + (All contributed by Raymond Hettinger.) -* The :mod:`logging` module's :class:`FileHandler` class +* The :mod:`logging` module's :class:`FileHandler` class and its subclasses :class:`WatchedFileHandler`, :class:`RotatingFileHandler`, - and :class:`TimedRotatingFileHandler` now - have an optional *delay* parameter to its constructor. If *delay* + and :class:`TimedRotatingFileHandler` now + have an optional *delay* parameter to its constructor. If *delay* is true, opening of the log file is deferred until the first :meth:`emit` call is made. (Contributed by Vinay Sajip.) @@ -1899,16 +1978,16 @@ the forward search. (Contributed by John Lenton.) -* The :mod:`operator` module gained a - :func:`methodcaller` function that takes a name and an optional - set of arguments, returning a callable that will call +* The :mod:`operator` module gained a + :func:`methodcaller` function that takes a name and an optional + set of arguments, returning a callable that will call the named function on any arguments passed to it. For example:: >>> # Equivalent to lambda s: s.replace('old', 'new') >>> replacer = operator.methodcaller('replace', 'old', 'new') >>> replacer('old wine in old bottles') 'new wine in new bottles' - + (Contributed by Georg Brandl, after a suggestion by Gregory Petrosyan.) The :func:`attrgetter` function now accepts dotted names and performs @@ -1922,8 +2001,8 @@ (Contributed by Georg Brandl, after a suggestion by Barry Warsaw.) -* New functions in the :mod:`os` module include - ``fchmod(fd, mode)``, ``fchown(fd, uid, gid)``, +* New functions in the :mod:`os` module include + ``fchmod(fd, mode)``, ``fchown(fd, uid, gid)``, and ``lchmod(path, mode)``, on operating systems that support these functions. :func:`fchmod` and :func:`fchown` let you change the mode and ownership of an opened file, and :func:`lchmod` changes the mode @@ -1937,8 +2016,8 @@ parameter's default value is false. Note that the function can fall into an infinite recursion if there's a symlink that points to a parent directory. (:issue:`1273829`) - -* The ``os.environ`` object's :meth:`clear` method will now unset the + +* The ``os.environ`` object's :meth:`clear` method will now unset the environment variables using :func:`os.unsetenv` in addition to clearing the object's keys. (Contributed by Martin Horcicka; :issue:`1181`.) @@ -1954,23 +2033,23 @@ working directory to the destination ``path``. (Contributed by Richard Barran; :issue:`1339796`.) - On Windows, :func:`os.path.expandvars` will now expand environment variables - in the form "%var%", and "~user" will be expanded into the + On Windows, :func:`os.path.expandvars` will now expand environment variables + in the form "%var%", and "~user" will be expanded into the user's home directory path. (Contributed by Josiah Carlson; :issue:`957650`.) -* The Python debugger provided by the :mod:`pdb` module +* The Python debugger provided by the :mod:`pdb` module gained a new command: "run" restarts the Python program being debugged, and can optionally take new command-line arguments for the program. (Contributed by Rocky Bernstein; :issue:`1393667`.) - The :func:`post_mortem` function, used to enter debugging of a + The :func:`post_mortem` function, used to enter debugging of a traceback, will now use the traceback returned by :func:`sys.exc_info` if no traceback is supplied. (Contributed by Facundo Batista; :issue:`1106316`.) -* The :mod:`pickletools` module now has an :func:`optimize` function - that takes a string containing a pickle and removes some unused +* The :mod:`pickletools` module now has an :func:`optimize` function + that takes a string containing a pickle and removes some unused opcodes, returning a shorter pickle that contains the same data structure. (Contributed by Raymond Hettinger.) @@ -1988,7 +2067,7 @@ +-- StopIteration +-- StandardError ...' - >>> + >>> (Contributed by Paul Moore; :issue:`2439`.) @@ -2005,13 +2084,13 @@ processes faster. (Contributed by Georg Brandl; :issue:`1663329`.) * The :mod:`pyexpat` module's :class:`Parser` objects now allow setting - their :attr:`buffer_size` attribute to change the size of the buffer + their :attr:`buffer_size` attribute to change the size of the buffer used to hold character data. (Contributed by Achim Gaedke; :issue:`1137`.) * The :mod:`Queue` module now provides queue classes that retrieve entries - in different orders. The :class:`PriorityQueue` class stores - queued items in a heap and retrieves them in priority order, + in different orders. The :class:`PriorityQueue` class stores + queued items in a heap and retrieves them in priority order, and :class:`LifoQueue` retrieves the most recently added entries first, meaning that it behaves like a stack. (Contributed by Raymond Hettinger.) @@ -2025,20 +2104,24 @@ The new ``triangular(low, high, mode)`` function returns random numbers following a triangular distribution. The returned values - are between *low* and *high*, not including *high* itself, and - with *mode* as the mode, the most frequently occurring value + are between *low* and *high*, not including *high* itself, and + with *mode* as the mode, the most frequently occurring value in the distribution. (Contributed by Wladmir van der Laan and Raymond Hettinger; :issue:`1681432`.) * Long regular expression searches carried out by the :mod:`re` module will now check for signals being delivered, so especially - long searches can now be interrupted. + time-consuming searches can now be interrupted. (Contributed by Josh Hoyt and Ralf Schmitt; :issue:`846388`.) * The :mod:`rgbimg` module has been removed. -* The :mod:`sched` module's :class:`scheduler` instances now - have a read-only :attr:`queue` attribute that returns the +* The :mod:`rlcompleter` module's :meth:`Completer.complete()` method + will now ignore exceptions triggered while evaluating a name. + (Fixed by Lorenz Quack; :issue:`2250`.) + +* The :mod:`sched` module's :class:`scheduler` instances now + have a read-only :attr:`queue` attribute that returns the contents of the scheduler's queue, represented as a list of named tuples with the fields ``(time, priority, action, argument)``. (Contributed by Raymond Hettinger; :issue:`1861`.) @@ -2047,19 +2130,19 @@ for the Linux :cfunc:`epoll` and BSD :cfunc:`kqueue` system calls. Also, a :meth:`modify` method was added to the existing :class:`poll` objects; ``pollobj.modify(fd, eventmask)`` takes a file descriptor - or file object and an event mask, - + or file object and an event mask, + (Contributed by Christian Heimes; :issue:`1657`.) -* The :mod:`sets` module has been deprecated; it's better to +* The :mod:`sets` module has been deprecated; it's better to use the built-in :class:`set` and :class:`frozenset` types. -* Integrating signal handling with GUI handling event loops +* Integrating signal handling with GUI handling event loops like those used by Tkinter or GTk+ has long been a problem; most software ends up polling, waking up every fraction of a second. The :mod:`signal` module can now make this more efficient. Calling ``signal.set_wakeup_fd(fd)`` sets a file descriptor - to be used; when a signal is received, a byte is written to that + to be used; when a signal is received, a byte is written to that file descriptor. There's also a C-level function, :cfunc:`PySignal_SetWakeupFd`, for setting the descriptor. @@ -2068,7 +2151,7 @@ will be passed to :func:`set_wakeup_fd`, and the readable descriptor will be added to the list of descriptors monitored by the event loop via :cfunc:`select` or :cfunc:`poll`. - On receiving a signal, a byte will be written and the main event loop + On receiving a signal, a byte will be written and the main event loop will be woken up, without the need to poll. (Contributed by Adam Olsen; :issue:`1583`.) @@ -2086,7 +2169,7 @@ * The :mod:`smtplib` module now supports SMTP over SSL thanks to the addition of the :class:`SMTP_SSL` class. This class supports an - interface identical to the existing :class:`SMTP` class. Both + interface identical to the existing :class:`SMTP` class. Both class constructors also have an optional ``timeout`` parameter that specifies a timeout for the initial connection attempt, measured in seconds. @@ -2109,35 +2192,35 @@ environments. TIPC addresses are 4- or 5-tuples. (Contributed by Alberto Bertogli; :issue:`1646`.) - A new function, :func:`create_connection`, takes an address - and connects to it using an optional timeout value, returning + A new function, :func:`create_connection`, takes an address + and connects to it using an optional timeout value, returning the connected socket object. * The base classes in the :mod:`SocketServer` module now support - calling a :meth:`handle_timeout` method after a span of inactivity - specified by the server's :attr:`timeout` attribute. (Contributed - by Michael Pomraning.) The :meth:`serve_forever` method + calling a :meth:`handle_timeout` method after a span of inactivity + specified by the server's :attr:`timeout` attribute. (Contributed + by Michael Pomraning.) The :meth:`serve_forever` method now takes an optional poll interval measured in seconds, controlling how often the server will check for a shutdown request. - (Contributed by Pedro Werneck and Jeffrey Yasskin; + (Contributed by Pedro Werneck and Jeffrey Yasskin; :issue:`742598`, :issue:`1193577`.) * The :mod:`struct` module now supports the C99 :ctype:`_Bool` type, - using the format character ``'?'``. + using the format character ``'?'``. (Contributed by David Remahl.) * The :class:`Popen` objects provided by the :mod:`subprocess` module now have :meth:`terminate`, :meth:`kill`, and :meth:`send_signal` methods. On Windows, :meth:`send_signal` only supports the :const:`SIGTERM` signal, and all these methods are aliases for the Win32 API function - :cfunc:`TerminateProcess`. + :cfunc:`TerminateProcess`. (Contributed by Christian Heimes.) - + * A new variable in the :mod:`sys` module, :attr:`float_info`, is an object containing information about the platform's floating-point support derived from the :file:`float.h` file. Attributes of this object - include + include :attr:`mant_dig` (number of digits in the mantissa), :attr:`epsilon` (smallest difference between 1.0 and the next largest value representable), and several others. (Contributed by Christian Heimes; @@ -2149,7 +2232,7 @@ variable is initially set on start-up by supplying the :option:`-B` switch to the Python interpreter, or by setting the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable before - running the interpreter. Python code can subsequently + running the interpreter. Python code can subsequently change the value of this variable to control whether bytecode files are written or not. (Contributed by Neal Norwitz and Georg Brandl.) @@ -2170,12 +2253,12 @@ (Contributed by Robert Schuppenies; :issue:`2898`.) It's now possible to determine the current profiler and tracer functions - by calling :func:`sys.getprofile` and :func:`sys.gettrace`. + by calling :func:`sys.getprofile` and :func:`sys.gettrace`. (Contributed by Georg Brandl; :issue:`1648`.) * The :mod:`tarfile` module now supports POSIX.1-2001 (pax) and POSIX.1-1988 (ustar) format tarfiles, in addition to the GNU tar - format that was already supported. The default format + format that was already supported. The default format is GNU tar; specify the ``format`` parameter to open a file using a different format:: @@ -2190,37 +2273,37 @@ The :meth:`TarFile.add` method now accepts a ``exclude`` argument that's a function that can be used to exclude certain filenames from - an archive. - The function must take a filename and return true if the file + an archive. + The function must take a filename and return true if the file should be excluded or false if it should be archived. The function is applied to both the name initially passed to :meth:`add` and to the names of files in recursively-added directories. - + (All changes contributed by Lars Gust?bel). * An optional ``timeout`` parameter was added to the :class:`telnetlib.Telnet` class constructor, specifying a timeout measured in seconds. (Added by Facundo Batista.) -* The :class:`tempfile.NamedTemporaryFile` class usually deletes - the temporary file it created when the file is closed. This - behaviour can now be changed by passing ``delete=False`` to the +* The :class:`tempfile.NamedTemporaryFile` class usually deletes + the temporary file it created when the file is closed. This + behaviour can now be changed by passing ``delete=False`` to the constructor. (Contributed by Damien Miller; :issue:`1537850`.) - A new class, :class:`SpooledTemporaryFile`, behaves like - a temporary file but stores its data in memory until a maximum size is - exceeded. On reaching that limit, the contents will be written to + A new class, :class:`SpooledTemporaryFile`, behaves like + a temporary file but stores its data in memory until a maximum size is + exceeded. On reaching that limit, the contents will be written to an on-disk temporary file. (Contributed by Dustin J. Mitchell.) The :class:`NamedTemporaryFile` and :class:`SpooledTemporaryFile` classes - both work as context managers, so you can write + both work as context managers, so you can write ``with tempfile.NamedTemporaryFile() as tmp: ...``. (Contributed by Alexander Belopolsky; :issue:`2021`.) * The :mod:`test.test_support` module now contains a :func:`EnvironmentVarGuard` context manager that supports temporarily changing environment variables and - automatically restores them to their old values. + automatically restores them to their old values. Another context manager, :class:`TransientResource`, can surround calls to resources that may or may not be available; it will catch and @@ -2229,12 +2312,12 @@ external web site:: with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): - f = urllib.urlopen('https://sf.net') + f = urllib.urlopen('https://sf.net') ... (Contributed by Brett Cannon.) -* The :mod:`textwrap` module can now preserve existing whitespace +* The :mod:`textwrap` module can now preserve existing whitespace at the beginnings and ends of the newly-created lines by specifying ``drop_whitespace=False`` as an argument:: @@ -2250,23 +2333,29 @@ has a bunch of extra whitespace. - >>> + >>> (Contributed by Dwayne Bailey; :issue:`1581073`.) * The :mod:`threading` module's :class:`Thread` objects gained a :meth:`getIdent` method that returns the thread's - identifier, a nonzero integer. (Contributed by XXX; :issue:`2871`.) + identifier, a nonzero integer. (Contributed by Gregory P. Smith; + :issue:`2871`.) * The :mod:`timeit` module now accepts callables as well as strings for the statement being timed and for the setup code. - Two convenience functions were added for creating - :class:`Timer` instances: - ``repeat(stmt, setup, time, repeat, number)`` and + Two convenience functions were added for creating + :class:`Timer` instances: + ``repeat(stmt, setup, time, repeat, number)`` and ``timeit(stmt, setup, time, number)`` create an instance and call the corresponding method. (Contributed by Erik Demaine; :issue:`1533909`.) +* The :mod:`Tkinter` module now accepts lists and tuples for options, + separating the elements by spaces before passing the resulting value to + Tcl/Tk. + (Contributed by Guilherme Polo; :issue:`2906`.) + * The :mod:`turtle` module for turtle graphics was greatly enhanced by Gregor Lingl. New features in the module include: @@ -2287,7 +2376,7 @@ * An optional ``timeout`` parameter was added to the :func:`urllib.urlopen` function and the - :class:`urllib.ftpwrapper` class constructor, as well as the + :class:`urllib.ftpwrapper` class constructor, as well as the :func:`urllib2.urlopen` function. The parameter specifies a timeout measured in seconds. For example:: @@ -2295,11 +2384,11 @@ Traceback (most recent call last): ... urllib2.URLError: - >>> + >>> - (Added by Facundo Batista.) + (Added by Facundo Batista.) -* The :mod:`warnings` module's :func:`formatwarning` and :func:`showwarning` +* The :mod:`warnings` module's :func:`formatwarning` and :func:`showwarning` gained an optional *line* argument that can be used to supply the line of source code. (Added as part of :issue:`1631171`, which re-implemented part of the :mod:`warnings` module in C code.) @@ -2308,32 +2397,32 @@ classes can now be prevented from immediately opening and binding to their socket by passing True as the ``bind_and_activate`` constructor parameter. This can be used to modify the instance's - :attr:`allow_reuse_address` attribute before calling the - :meth:`server_bind` and :meth:`server_activate` methods to + :attr:`allow_reuse_address` attribute before calling the + :meth:`server_bind` and :meth:`server_activate` methods to open the socket and begin listening for connections. (Contributed by Peter Parente; :issue:`1599845`.) :class:`SimpleXMLRPCServer` also has a :attr:`_send_traceback_header` - attribute; if true, the exception and formatted traceback are returned - as HTTP headers "X-Exception" and "X-Traceback". This feature is + attribute; if true, the exception and formatted traceback are returned + as HTTP headers "X-Exception" and "X-Traceback". This feature is for debugging purposes only and should not be used on production servers because the tracebacks could possibly reveal passwords or other sensitive - information. (Contributed by Alan McIntyre as part of his + information. (Contributed by Alan McIntyre as part of his project for Google's Summer of Code 2007.) * The :mod:`xmlrpclib` module no longer automatically converts - :class:`datetime.date` and :class:`datetime.time` to the + :class:`datetime.date` and :class:`datetime.time` to the :class:`xmlrpclib.DateTime` type; the conversion semantics were not necessarily correct for all applications. Code using - :mod:`xmlrpclib` should convert :class:`date` and :class:`time` - instances. (:issue:`1330538`) The code can also handle + :mod:`xmlrpclib` should convert :class:`date` and :class:`time` + instances. (:issue:`1330538`) The code can also handle dates before 1900 (contributed by Ralf Schmitt; :issue:`2014`) and 64-bit integers represented by using ```` in XML-RPC responses - (contributed by XXX; :issue:`2985`). + (contributed by Riku Lindblad; :issue:`2985`). -* The :mod:`zipfile` module's :class:`ZipFile` class now has - :meth:`extract` and :meth:`extractall` methods that will unpack - a single file or all the files in the archive to the current directory, or +* The :mod:`zipfile` module's :class:`ZipFile` class now has + :meth:`extract` and :meth:`extractall` methods that will unpack + a single file or all the files in the archive to the current directory, or to a specified directory:: z = zipfile.ZipFile('python-251.zip') @@ -2357,6 +2446,93 @@ .. ====================================================================== .. whole new modules get described in subsections here +The :mod:`ast` module +---------------------- + +The :mod:`ast` module provides an Abstract Syntax Tree representation +of Python code. For Python 2.6, Armin Ronacher contributed a set of +helper functions that perform various common tasks. These will be useful +for HTML templating packages, code analyzers, and similar tools that +process Python code. + +The :func:`parse` function takes an expression and returns an AST. +The :func:`dump` function outputs a representation of a tree, suitable +for debugging:: + + import ast + + t = ast.parse(""" + d = {} + for i in 'abcdefghijklm': + d[i + i] = ord(i) - ord('a') + 1 + print d + """) + print ast.dump(t) + +This outputs:: + + Module(body=[Assign(targets=[Name(id='d', ctx=Store())], + value=Dict(keys=[], values=[])), For(target=Name(id='i', + ctx=Store()), iter=Str(s='abcdefghijklm'), + body=[Assign(targets=[Subscript(value=Name(id='d', ctx=Load()), + slice=Index(value=BinOp(left=Name(id='i', ctx=Load()), op=Add(), + right=Name(id='i', ctx=Load()))), ctx=Store())], + value=BinOp(left=BinOp(left=Call(func=Name(id='ord', ctx=Load()), + args=[Name(id='i', ctx=Load())], keywords=[], starargs=None, + kwargs=None), op=Sub(), right=Call(func=Name(id='ord', + ctx=Load()), args=[Str(s='a')], keywords=[], starargs=None, + kwargs=None)), op=Add(), right=Num(n=1)))], orelse=[]), + Print(dest=None, values=[Name(id='d', ctx=Load())], nl=True)]) + +The :func:`literal_eval` method takes a string or an AST +representing a literal expression, one that contains a Python +expression containing only strings, numbers, dictionaries, etc. but no +statements or function calls, and returns the resulting value. If you +need to unserialize an expression but need to worry about security +and can't risk using an :func:`eval` call, :func:`literal_eval` will +handle it safely:: + + >>> literal = '("a", "b", {2:4, 3:8, 1:2})' + >>> print ast.literal_eval(literal) + ('a', 'b', {1: 2, 2: 4, 3: 8}) + >>> print ast.literal_eval('"a" + "b"') + Traceback (most recent call last): + ... + ValueError: malformed string + +The module also includes +:class:`NodeVisitor` and :class:`NodeTransformer` classes +for traversing and modifying an AST, and functions for common transformations such as changing line numbers. + +.. ====================================================================== + +The :mod:`future_builtins` module +-------------------------------------- + +Python 3.0 makes various changes to the repertoire of built-in +functions, and most of the changes can't be introduced in the Python +2.x series because they would break compatibility. +The :mod:`future_builtins` module provides versions +of these built-in functions that can be imported when writing +3.0-compatible code. + +The functions in this module currently include: + +* ``ascii(**obj**)``: equivalent to :func:`repr`. In Python 3.0, + :func:`repr` will return a Unicode string, while :func:`ascii` will + return a pure ASCII bytestring. + +* ``filter(**predicate**, **iterable**)``, + ``map(**func**, **iterable1**, ...)``: the 3.0 versions + return iterators, differing from the 2.x built-ins that return lists. + +* ``hex(**value**)``, ``oct(**value**)``: instead of calling the + :meth:`__hex__` or :meth:`__oct__` methods, these versions will + call the :meth:`__index__` method and convert the result to hexadecimal + or octal. + +.. ====================================================================== + The :mod:`json` module ---------------------- @@ -2382,39 +2558,17 @@ :mod:`json` (originally called simplejson) was written by Bob Ippolito. -Improved SSL Support --------------------------------------------------- - -Bill Janssen made extensive improvements to Python 2.6's support for -the Secure Sockets Layer by adding a new module, :mod:`ssl`, on top of -the `OpenSSL `__ library. This new module -provides more control over the protocol negotiated, the X.509 -certificates used, and has better support for writing SSL servers (as -opposed to clients) in Python. The existing SSL support in the -:mod:`socket` module hasn't been removed and continues to work, -though it will be removed in Python 3.0. - -To use the new module, first you must create a TCP connection in the -usual way and then pass it to the :func:`ssl.wrap_socket` function. -It's possible to specify whether a certificate is required, and to -obtain certificate info by calling the :meth:`getpeercert` method. - -.. seealso:: - - The documentation for the :mod:`ssl` module. - - .. ====================================================================== plistlib: A Property-List Parser -------------------------------------------------- -A commonly-used format on MacOS X is the ``.plist`` format, -which stores basic data types (numbers, strings, lists, +A commonly-used format on MacOS X is the ``.plist`` format, +which stores basic data types (numbers, strings, lists, and dictionaries) and serializes them into an XML-based format. (It's a lot like the XML-RPC serialization of data types.) -Despite being primarily used on MacOS X, the format +Despite being primarily used on MacOS X, the format has nothing Mac-specific about it and the Python implementation works on any platform that Python supports, so the :mod:`plistlib` module has been promoted to the standard library. @@ -2442,7 +2596,29 @@ # read/writePlist accepts file-like objects as well as paths. plistlib.writePlist(data_struct, sys.stdout) - + +.. ====================================================================== + +Improved SSL Support +-------------------------------------------------- + +Bill Janssen made extensive improvements to Python 2.6's support for +the Secure Sockets Layer by adding a new module, :mod:`ssl`, on top of +the `OpenSSL `__ library. This new module +provides more control over the protocol negotiated, the X.509 +certificates used, and has better support for writing SSL servers (as +opposed to clients) in Python. The existing SSL support in the +:mod:`socket` module hasn't been removed and continues to work, +though it will be removed in Python 3.0. + +To use the new module, first you must create a TCP connection in the +usual way and then pass it to the :func:`ssl.wrap_socket` function. +It's possible to specify whether a certificate is required, and to +obtain certificate info by calling the :meth:`getpeercert` method. + +.. seealso:: + + The documentation for the :mod:`ssl` module. .. ====================================================================== @@ -2456,30 +2632,37 @@ See the :file:`PCbuild9` directory for the build files. (Implemented by Christian Heimes.) +* On MacOS X, Python 2.6 can be compiled as a 4-way universal build. + The :program:`configure` script + can take a :option:`--with-universal-archs=[32-bit|64-bit|all]` + switch, controlling whether the binaries are built for 32-bit + architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both. + (Contributed by Ronald Oussoren.) + * Python now can only be compiled with C89 compilers (after 19 years!). This means that the Python source tree can now drop its own implementations of :cfunc:`memmove` and :cfunc:`strerror`, which are in the C89 standard library. -* The BerkeleyDB module now has a C API object, available as +* The BerkeleyDB module now has a C API object, available as ``bsddb.db.api``. This object can be used by other C extensions that wish to use the :mod:`bsddb` module for their own purposes. (Contributed by Duncan Grisby; :issue:`1551895`.) -* The new buffer interface, previously described in +* The new buffer interface, previously described in `the PEP 3118 section <#pep-3118-revised-buffer-protocol>`__, adds :cfunc:`PyObject_GetBuffer` and :cfunc:`PyObject_ReleaseBuffer`, as well as a few other functions. * Python's use of the C stdio library is now thread-safe, or at least as thread-safe as the underlying library is. A long-standing potential - bug occurred if one thread closed a file object while another thread - was reading from or writing to the object. In 2.6 file objects - have a reference count, manipulated by the + bug occurred if one thread closed a file object while another thread + was reading from or writing to the object. In 2.6 file objects + have a reference count, manipulated by the :cfunc:`PyFile_IncUseCount` and :cfunc:`PyFile_DecUseCount` - functions. File objects can't be closed unless the reference count - is zero. :cfunc:`PyFile_IncUseCount` should be called while the GIL - is still held, before carrying out an I/O operation using the + functions. File objects can't be closed unless the reference count + is zero. :cfunc:`PyFile_IncUseCount` should be called while the GIL + is still held, before carrying out an I/O operation using the ``FILE *`` pointer, and :cfunc:`PyFile_DecUseCount` should be called immediately after the GIL is re-acquired. (Contributed by Antoine Pitrou and Gregory P. Smith.) @@ -2492,39 +2675,46 @@ thread, the :exc:`ImportError` is raised. (Contributed by Christian Heimes.) -* Several functions return information about the platform's +* Several functions return information about the platform's floating-point support. :cfunc:`PyFloat_GetMax` returns the maximum representable floating point value, - and :cfunc:`PyFloat_GetMin` returns the minimum - positive value. :cfunc:`PyFloat_GetInfo` returns a dictionary + and :cfunc:`PyFloat_GetMin` returns the minimum + positive value. :cfunc:`PyFloat_GetInfo` returns a dictionary containing more information from the :file:`float.h` file, such as ``"mant_dig"`` (number of digits in the mantissa), ``"epsilon"`` (smallest difference between 1.0 and the next largest value representable), and several others. (Contributed by Christian Heimes; :issue:`1534`.) +* C functions and methods that use + :cfunc:`PyComplex_AsCComplex` will now accept arguments that + have a :meth:`__complex__` method. In particular, the functions in the + :mod:`cmath` module will now accept objects with this method. + This is a backport of a Python 3.0 change. + (Contributed by Mark Dickinson; :issue:`1675423`.) + * Python's C API now includes two functions for case-insensitive string comparisons, ``PyOS_stricmp(char*, char*)`` and ``PyOS_strnicmp(char*, char*, Py_ssize_t)``. (Contributed by Christian Heimes; :issue:`1635`.) -* Many C extensions define their own little macro for adding - integers and strings to the module's dictionary in the - ``init*`` function. Python 2.6 finally defines standard macros +* Many C extensions define their own little macro for adding + integers and strings to the module's dictionary in the + ``init*`` function. Python 2.6 finally defines standard macros for adding values to a module, :cmacro:`PyModule_AddStringMacro` - and :cmacro:`PyModule_AddIntMacro()`. (Contributed by + and :cmacro:`PyModule_AddIntMacro()`. (Contributed by Christian Heimes.) * Some macros were renamed in both 3.0 and 2.6 to make it clearer that they are macros, not functions. :cmacro:`Py_Size()` became :cmacro:`Py_SIZE()`, :cmacro:`Py_Type()` became :cmacro:`Py_TYPE()`, and - :cmacro:`Py_Refcnt()` became :cmacro:`Py_REFCNT()`. + :cmacro:`Py_Refcnt()` became :cmacro:`Py_REFCNT()`. The mixed-case macros are still available in Python 2.6 for backward compatibility. (:issue:`1629`) -* Distutils now places C extensions it builds in a +* Distutils now places C extensions it builds in a different directory when running on a debug version of Python. (Contributed by Collin Winter; :issue:`1530959`.) @@ -2536,7 +2726,7 @@ always defined. * A new Makefile target, "make check", prepares the Python source tree - for making a patch: it fixes trailing whitespace in all modified + for making a patch: it fixes trailing whitespace in all modified ``.py`` files, checks whether the documentation has been changed, and reports whether the :file:`Misc/ACKS` and :file:`Misc/NEWS` files have been updated. @@ -2556,35 +2746,40 @@ * The support for Windows 95, 98, ME and NT4 has been dropped. Python 2.6 requires at least Windows 2000 SP4. -* The :mod:`msvcrt` module now supports +* The :mod:`msvcrt` module now supports both the normal and wide char variants of the console I/O - API. The :func:`getwch` function reads a keypress and returns a Unicode + API. The :func:`getwch` function reads a keypress and returns a Unicode value, as does the :func:`getwche` function. The :func:`putwch` function takes a Unicode character and writes it to the console. (Contributed by Christian Heimes.) -* :func:`os.path.expandvars` will now expand environment variables - in the form "%var%", and "~user" will be expanded into the +* :func:`os.path.expandvars` will now expand environment variables + in the form "%var%", and "~user" will be expanded into the user's home directory path. (Contributed by Josiah Carlson.) -* The :mod:`socket` module's socket objects now have an - :meth:`ioctl` method that provides a limited interface to the +* The :mod:`socket` module's socket objects now have an + :meth:`ioctl` method that provides a limited interface to the :cfunc:`WSAIoctl` system interface. -* The :mod:`_winreg` module now has a function, - :func:`ExpandEnvironmentStrings`, +* The :mod:`_winreg` module now has a function, + :func:`ExpandEnvironmentStrings`, that expands environment variable references such as ``%NAME%`` in an input string. The handle objects provided by this - module now support the context protocol, so they can be used + module now support the context protocol, so they can be used in :keyword:`with` statements. (Contributed by Christian Heimes.) - :mod:`_winreg` also has better support for x64 systems, + :mod:`_winreg` also has better support for x64 systems, exposing the :func:`DisableReflectionKey`, :func:`EnableReflectionKey`, and :func:`QueryReflectionKey` functions, which enable and disable registry reflection for 32-bit processes running on 64-bit systems. (:issue:`1753245`) -* The new default compiler on Windows is Visual Studio 2008 (VS 9.0). The +* The :mod:`msilib` module's :class:`Record` object + gained :meth:`GetInteger` and :meth:`GetString` methods that + return field values as an integer or a string. + (Contributed by Floris Bruynooghe; :issue:`2125`.) + +* The new default compiler on Windows is Visual Studio 2008 (VS 9.0). The build directories for Visual Studio 2003 (VS7.1) and 2005 (VS8.0) were moved into the PC/ directory. The new PCbuild directory supports cross compilation for X64, debug builds and Profile Guided Optimization @@ -2617,7 +2812,7 @@ Some of the more notable changes are: -* It's now possible to prevent Python from writing any :file:`.pyc` +* It's now possible to prevent Python from writing any :file:`.pyc` or :file:`.pyo` files by either supplying the :option:`-B` switch or setting the :envvar:`PYTHONDONTWRITEBYTECODE` environment variable to any non-empty string when running the Python interpreter. These @@ -2638,23 +2833,23 @@ * The :meth:`__init__` method of :class:`collections.deque` now clears any existing contents of the deque before adding elements from the iterable. This change makes the - behavior match that of ``list.__init__()``. + behavior match that of ``list.__init__()``. -* The :class:`Decimal` constructor now accepts leading and trailing +* The :class:`Decimal` constructor now accepts leading and trailing whitespace when passed a string. Previously it would raise an :exc:`InvalidOperation` exception. On the other hand, the :meth:`create_decimal` method of :class:`Context` objects now - explicitly disallows extra whitespace, raising a + explicitly disallows extra whitespace, raising a :exc:`ConversionSyntax` exception. -* Due to an implementation accident, if you passed a file path to +* Due to an implementation accident, if you passed a file path to the built-in :func:`__import__` function, it would actually import - the specified file. This was never intended to work, however, and - the implementation now explicitly checks for this case and raises + the specified file. This was never intended to work, however, and + the implementation now explicitly checks for this case and raises an :exc:`ImportError`. * C API: the :cfunc:`PyImport_Import` and :cfunc:`PyImport_ImportModule` - functions now default to absolute imports, not relative imports. + functions now default to absolute imports, not relative imports. This will affect C extensions that import other modules. * The :mod:`socket` module exception :exc:`socket.error` now inherits @@ -2663,21 +2858,21 @@ (Implemented by Gregory P. Smith; :issue:`1706815`.) * The :mod:`xmlrpclib` module no longer automatically converts - :class:`datetime.date` and :class:`datetime.time` to the + :class:`datetime.date` and :class:`datetime.time` to the :class:`xmlrpclib.DateTime` type; the conversion semantics were not necessarily correct for all applications. Code using - :mod:`xmlrpclib` should convert :class:`date` and :class:`time` + :mod:`xmlrpclib` should convert :class:`date` and :class:`time` instances. (:issue:`1330538`) -* (3.0-warning mode) The :class:`Exception` class now warns - when accessed using slicing or index access; having +* (3.0-warning mode) The :class:`Exception` class now warns + when accessed using slicing or index access; having :class:`Exception` behave like a tuple is being phased out. * (3.0-warning mode) inequality comparisons between two dictionaries or two objects that don't implement comparison methods are reported as warnings. ``dict1 == dict2`` still works, but ``dict1 < dict2`` is being phased out. - + Comparisons between cells, which are an implementation detail of Python's scoping rules, also cause warnings because such comparisons are forbidden entirely in 3.0. @@ -2691,6 +2886,6 @@ ================ The author would like to thank the following people for offering suggestions, -corrections and assistance with various drafts of this article: +corrections and assistance with various drafts of this article: Georg Brandl, Jim Jewett. From python-3000-checkins at python.org Wed Jul 2 19:30:15 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 19:30:15 +0200 (CEST) Subject: [Python-3000-checkins] r64666 - in python/branches/py3k: Doc/library/ast.rst Doc/library/cgi.rst Doc/library/cmath.rst Doc/library/decimal.rst Doc/library/os.rst Doc/library/stdtypes.rst Doc/library/subprocess.rst Lib/ast.py Lib/cgi.py Lib/fractions.py Lib/test/test_cgi.py Lib/test/test_fractions.py Lib/test/test_posix.py Modules/_sqlite/module.c Modules/posixmodule.c Objects/bytearrayobject.c Message-ID: <20080702173015.7DF011E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 19:30:14 2008 New Revision: 64666 Log: Merged revisions 64434-64435,64440-64443,64445,64447-64448,64450,64452,64455,64461,64464,64466,64468 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64434 | andrew.kuchling | 2008-06-20 18:13:58 -0500 (Fri, 20 Jun 2008) | 1 line Remove request for e-mail; it's unlikely these classes will be saved ........ r64435 | andrew.kuchling | 2008-06-20 18:14:32 -0500 (Fri, 20 Jun 2008) | 1 line Grammar fixes ........ r64440 | andrew.kuchling | 2008-06-21 08:29:12 -0500 (Sat, 21 Jun 2008) | 1 line Docstring typo ........ r64441 | andrew.kuchling | 2008-06-21 08:47:20 -0500 (Sat, 21 Jun 2008) | 1 line Use repr() for bad input strings; this makes the empty string or binary characters more visible ........ r64442 | andrew.kuchling | 2008-06-21 08:48:38 -0500 (Sat, 21 Jun 2008) | 1 line Docstring correction ........ r64443 | georg.brandl | 2008-06-21 09:26:19 -0500 (Sat, 21 Jun 2008) | 2 lines Documentation fix. ........ r64445 | facundo.batista | 2008-06-21 12:30:06 -0500 (Sat, 21 Jun 2008) | 3 lines Reviewed and updated the documentation. Fixes #3017. ........ r64447 | facundo.batista | 2008-06-21 13:58:04 -0500 (Sat, 21 Jun 2008) | 6 lines Now a from submitted via POST that also has a query string will contain both FieldStorage and MiniFieldStorage items. Fixes #1817. ........ r64448 | facundo.batista | 2008-06-21 14:48:19 -0500 (Sat, 21 Jun 2008) | 5 lines In the deprecated functions I added an alert to review specially a section of the subprocess documentation that helps with the replacing of those functionss. ........ r64450 | georg.brandl | 2008-06-22 04:05:29 -0500 (Sun, 22 Jun 2008) | 2 lines Turn section references into proper cross-references. ........ r64452 | facundo.batista | 2008-06-22 08:36:20 -0500 (Sun, 22 Jun 2008) | 5 lines Issue #2722. Now the char buffer to support the path string has not fixed length, it mallocs memory if needed. As a result, we don't have a maximum for the getcwd() method. ........ r64455 | facundo.batista | 2008-06-22 10:27:10 -0500 (Sun, 22 Jun 2008) | 4 lines Issue 3164. Small fix to don't repeat a comparation without necessity. ........ r64461 | georg.brandl | 2008-06-22 13:11:52 -0500 (Sun, 22 Jun 2008) | 2 lines #3085: Fix syntax error. ........ r64464 | georg.brandl | 2008-06-22 13:31:54 -0500 (Sun, 22 Jun 2008) | 2 lines Expand docstrings of sqlite3 functions. ........ r64466 | georg.brandl | 2008-06-22 14:07:59 -0500 (Sun, 22 Jun 2008) | 2 lines Write out "phi" consistently. ........ r64468 | facundo.batista | 2008-06-22 14:35:24 -0500 (Sun, 22 Jun 2008) | 4 lines Just returning nothing instead of rising TestSkipped, because it makes the test fail in the trunk.loewis-sun buildbot. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/ast.rst python/branches/py3k/Doc/library/cgi.rst python/branches/py3k/Doc/library/cmath.rst python/branches/py3k/Doc/library/decimal.rst python/branches/py3k/Doc/library/os.rst python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/library/subprocess.rst python/branches/py3k/Lib/ast.py python/branches/py3k/Lib/cgi.py python/branches/py3k/Lib/fractions.py python/branches/py3k/Lib/test/test_cgi.py python/branches/py3k/Lib/test/test_fractions.py python/branches/py3k/Lib/test/test_posix.py python/branches/py3k/Modules/_sqlite/module.c python/branches/py3k/Modules/posixmodule.c python/branches/py3k/Objects/bytearrayobject.c Modified: python/branches/py3k/Doc/library/ast.rst ============================================================================== --- python/branches/py3k/Doc/library/ast.rst (original) +++ python/branches/py3k/Doc/library/ast.rst Wed Jul 2 19:30:14 2008 @@ -253,5 +253,5 @@ debugging purposes. The returned string will show the names and the values for fields. This makes the code impossible to evaluate, so if evaluation is wanted *annotate_fields* must be set to False. Attributes such as line - numbers and column offsets are dumped by default. If this is wanted, + numbers and column offsets are not dumped by default. If this is wanted, *include_attributes* can be set to ``True``. Modified: python/branches/py3k/Doc/library/cgi.rst ============================================================================== --- python/branches/py3k/Doc/library/cgi.rst (original) +++ python/branches/py3k/Doc/library/cgi.rst Wed Jul 2 19:30:14 2008 @@ -162,6 +162,8 @@ actually be instances of the class :class:`MiniFieldStorage`. In this case, the :attr:`list`, :attr:`file`, and :attr:`filename` attributes are always ``None``. +A form submitted via POST that also has a query string will contain both +:class:`FieldStorage` and :class:`MiniFieldStorage` items. Higher Level Interface ---------------------- Modified: python/branches/py3k/Doc/library/cmath.rst ============================================================================== --- python/branches/py3k/Doc/library/cmath.rst (original) +++ python/branches/py3k/Doc/library/cmath.rst Wed Jul 2 19:30:14 2008 @@ -40,9 +40,9 @@ In engineering the polar coordinate system is popular for complex numbers. In polar coordinates a complex number is defined by the radius *r* and the phase -angle *?*. The radius *r* is the absolute value of the complex, which can be +angle *phi*. The radius *r* is the absolute value of the complex, which can be viewed as distance from (0, 0). The radius *r* is always 0 or a positive float. -The phase angle *?* is the counter clockwise angle from the positive x axis, +The phase angle *phi* is the counter clockwise angle from the positive x axis, e.g. *1* has the angle *0*, *1j* has the angle *?/2* and *-1* the angle *-?*. .. note:: @@ -53,12 +53,12 @@ Definition:: - z = r * exp(1j * ?) - z = r * cis(?) + z = r * exp(1j * phi) + z = r * cis(phi) r := abs(z) := sqrt(real(z)**2 + imag(z)**2) phi := phase(z) := atan2(imag(z), real(z)) - cis(?) := cos(?) + 1j * sin(?) + cis(phi) := cos(phi) + 1j * sin(phi) .. function:: phase(x) Modified: python/branches/py3k/Doc/library/decimal.rst ============================================================================== --- python/branches/py3k/Doc/library/decimal.rst (original) +++ python/branches/py3k/Doc/library/decimal.rst Wed Jul 2 19:30:14 2008 @@ -418,7 +418,7 @@ .. method:: conjugate() - Just returns itself, this method is only to comply with the Decimal + Just returns self, this method is only to comply with the Decimal Specification. .. method:: copy_abs() @@ -1192,9 +1192,10 @@ The sign of the result, if non-zero, is the same as that of the original dividend. + .. method:: remainder_near(x, y) - Returns `x - y * n`, where *n* is the integer nearest the exact value + Returns `x - y * n`, where *n* is the integer nearest the exact value of `x / y` (if the result is `0` then its sign will be the sign of *x*). Modified: python/branches/py3k/Doc/library/os.rst ============================================================================== --- python/branches/py3k/Doc/library/os.rst (original) +++ python/branches/py3k/Doc/library/os.rst Wed Jul 2 19:30:14 2008 @@ -337,21 +337,6 @@ does on most platforms). -.. function:: popen(command[, mode[, bufsize]]) - - Open a pipe to or from *command*. The return value is an open file object - connected to the pipe, which can be read or written depending on whether *mode* - is ``'r'`` (default) or ``'w'``. The *bufsize* argument has the same meaning as - the corresponding argument to the built-in :func:`open` function. The exit - status of the command (encoded in the format specified for :func:`wait`) is - available as the return value of the :meth:`close` method of the file object, - except that when the exit status is zero (termination without errors), ``None`` - is returned. Availability: Macintosh, Unix, Windows. - - .. deprecated:: 2.6 - This function is obsolete. Use the :mod:`subprocess` module. - - .. _os-fd-ops: File Descriptor Operations @@ -1449,7 +1434,8 @@ (Note that the :mod:`subprocess` module provides more powerful facilities for spawning new processes and retrieving their results; using that module is - preferable to using these functions.) + preferable to using these functions. Check specially the *Replacing Older + Functions with the subprocess Module* section in that documentation page.) If *mode* is :const:`P_NOWAIT`, this function returns the process id of the new process; if *mode* is :const:`P_WAIT`, returns the process's exit code if it @@ -1571,7 +1557,8 @@ The :mod:`subprocess` module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using - this function. + this function. Use the :mod:`subprocess` module. Check especially the + :ref:`subprocess-replacements` section. .. function:: times() Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Wed Jul 2 19:30:14 2008 @@ -2145,6 +2145,11 @@ the system default encoding for converting strings. +.. attribute:: file.errors + + The Unicode error handler used along with the encoding. + + .. attribute:: file.mode The I/O mode for the file. If the file was created using the :func:`open` Modified: python/branches/py3k/Doc/library/subprocess.rst ============================================================================== --- python/branches/py3k/Doc/library/subprocess.rst (original) +++ python/branches/py3k/Doc/library/subprocess.rst Wed Jul 2 19:30:14 2008 @@ -289,6 +289,8 @@ ``N`` (Unix only). +.. _subprocess-replacements: + Replacing Older Functions with the subprocess Module ---------------------------------------------------- @@ -386,13 +388,13 @@ :: - pipe = os.popen(cmd, mode='r', bufsize) + pipe = os.popen(cmd, 'r', bufsize) ==> pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout :: - pipe = os.popen(cmd, mode='w', bufsize) + pipe = os.popen(cmd, 'w', bufsize) ==> pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin Modified: python/branches/py3k/Lib/ast.py ============================================================================== --- python/branches/py3k/Lib/ast.py (original) +++ python/branches/py3k/Lib/ast.py Wed Jul 2 19:30:14 2008 @@ -73,7 +73,7 @@ debugging purposes. The returned string will show the names and the values for fields. This makes the code impossible to evaluate, so if evaluation is wanted *annotate_fields* must be set to False. Attributes such as line - numbers and column offsets are dumped by default. If this is wanted, + numbers and column offsets are not dumped by default. If this is wanted, *include_attributes* can be set to True. """ def _format(node): Modified: python/branches/py3k/Lib/cgi.py ============================================================================== --- python/branches/py3k/Lib/cgi.py (original) +++ python/branches/py3k/Lib/cgi.py Wed Jul 2 19:30:14 2008 @@ -449,6 +449,7 @@ self.strict_parsing = strict_parsing if 'REQUEST_METHOD' in environ: method = environ['REQUEST_METHOD'].upper() + self.qs_on_post = None if method == 'GET' or method == 'HEAD': if 'QUERY_STRING' in environ: qs = environ['QUERY_STRING'] @@ -467,6 +468,8 @@ headers['content-type'] = "application/x-www-form-urlencoded" if 'CONTENT_TYPE' in environ: headers['content-type'] = environ['CONTENT_TYPE'] + if 'QUERY_STRING' in environ: + self.qs_on_post = environ['QUERY_STRING'] if 'CONTENT_LENGTH' in environ: headers['content-length'] = environ['CONTENT_LENGTH'] self.fp = fp or sys.stdin @@ -618,6 +621,8 @@ def read_urlencoded(self): """Internal: read data in query string format.""" qs = self.fp.read(self.length) + if self.qs_on_post: + qs += '&' + self.qs_on_post self.list = list = [] for key, value in parse_qsl(qs, self.keep_blank_values, self.strict_parsing): @@ -632,6 +637,12 @@ if not valid_boundary(ib): raise ValueError('Invalid boundary in multipart form: %r' % (ib,)) self.list = [] + if self.qs_on_post: + for key, value in parse_qsl(self.qs_on_post, self.keep_blank_values, + self.strict_parsing): + self.list.append(MiniFieldStorage(key, value)) + FieldStorageClass = None + klass = self.FieldStorageClass or self.__class__ parser = email.parser.FeedParser() # Create bogus content-type header for proper multipart parsing Modified: python/branches/py3k/Lib/fractions.py ============================================================================== --- python/branches/py3k/Lib/fractions.py (original) +++ python/branches/py3k/Lib/fractions.py Wed Jul 2 19:30:14 2008 @@ -68,7 +68,7 @@ input = numerator m = _RATIONAL_FORMAT.match(input) if m is None: - raise ValueError('Invalid literal for Fraction: ' + input) + raise ValueError('Invalid literal for Fraction: %r' % input) numerator = m.group('num') decimal = m.group('decimal') if decimal: Modified: python/branches/py3k/Lib/test/test_cgi.py ============================================================================== --- python/branches/py3k/Lib/test/test_cgi.py (original) +++ python/branches/py3k/Lib/test/test_cgi.py Wed Jul 2 19:30:14 2008 @@ -126,6 +126,16 @@ def first_second_elts(list): return [(p[0], p[1][0]) for p in list] +def gen_result(data, environ): + fake_stdin = StringIO(data) + fake_stdin.seek(0) + form = cgi.FieldStorage(fp=fake_stdin, environ=environ) + + result = {} + for k, v in dict(form).items(): + result[k] = type(v) is list and form.getlist(k) or v.value + + return result class CgiTests(unittest.TestCase): @@ -241,6 +251,83 @@ got = getattr(fs.list[x], k) self.assertEquals(got, exp) + _qs_result = { + 'key1': 'value1', + 'key2': ['value2x', 'value2y'], + 'key3': 'value3', + 'key4': 'value4' + } + def testQSAndUrlEncode(self): + data = "key2=value2x&key3=value3&key4=value4" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'application/x-www-form-urlencoded', + 'QUERY_STRING': 'key1=value1&key2=value2y', + 'REQUEST_METHOD': 'POST', + } + v = gen_result(data, environ) + self.assertEqual(self._qs_result, v) + + def testQSAndFormData(self): + data = """ +---123 +Content-Disposition: form-data; name="key2" + +value2y +---123 +Content-Disposition: form-data; name="key3" + +value3 +---123 +Content-Disposition: form-data; name="key4" + +value4 +---123-- +""" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'multipart/form-data; boundary=-123', + 'QUERY_STRING': 'key1=value1&key2=value2x', + 'REQUEST_METHOD': 'POST', + } + v = gen_result(data, environ) + self.assertEqual(self._qs_result, v) + + def testQSAndFormDataFile(self): + data = """ +---123 +Content-Disposition: form-data; name="key2" + +value2y +---123 +Content-Disposition: form-data; name="key3" + +value3 +---123 +Content-Disposition: form-data; name="key4" + +value4 +---123 +Content-Disposition: form-data; name="upload"; filename="fake.txt" +Content-Type: text/plain + +this is the content of the fake file + +---123-- +""" + environ = { + 'CONTENT_LENGTH': str(len(data)), + 'CONTENT_TYPE': 'multipart/form-data; boundary=-123', + 'QUERY_STRING': 'key1=value1&key2=value2x', + 'REQUEST_METHOD': 'POST', + } + result = self._qs_result.copy() + result.update({ + 'upload': 'this is the content of the fake file' + }) + v = gen_result(data, environ) + self.assertEqual(result, v) + def test_main(): run_unittest(CgiTests) Modified: python/branches/py3k/Lib/test/test_fractions.py ============================================================================== --- python/branches/py3k/Lib/test/test_fractions.py (original) +++ python/branches/py3k/Lib/test/test_fractions.py Wed Jul 2 19:30:14 2008 @@ -83,38 +83,38 @@ ZeroDivisionError, "Fraction(3, 0)", F, "3/0") self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: 3/", + ValueError, "Invalid literal for Fraction: '3/'", F, "3/") self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: 3 /2", + ValueError, "Invalid literal for Fraction: '3 /2'", F, "3 /2") self.assertRaisesMessage( # Denominators don't need a sign. - ValueError, "Invalid literal for Fraction: 3/+2", + ValueError, "Invalid literal for Fraction: '3/+2'", F, "3/+2") self.assertRaisesMessage( # Imitate float's parsing. - ValueError, "Invalid literal for Fraction: + 3/2", + ValueError, "Invalid literal for Fraction: '+ 3/2'", F, "+ 3/2") self.assertRaisesMessage( # Avoid treating '.' as a regex special character. - ValueError, "Invalid literal for Fraction: 3a2", + ValueError, "Invalid literal for Fraction: '3a2'", F, "3a2") self.assertRaisesMessage( # Only parse ordinary decimals, not scientific form. - ValueError, "Invalid literal for Fraction: 3.2e4", + ValueError, "Invalid literal for Fraction: '3.2e4'", F, "3.2e4") self.assertRaisesMessage( # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: 3/7.2", + ValueError, "Invalid literal for Fraction: '3/7.2'", F, "3/7.2") self.assertRaisesMessage( # Don't accept combinations of decimals and rationals. - ValueError, "Invalid literal for Fraction: 3.2/7", + ValueError, "Invalid literal for Fraction: '3.2/7'", F, "3.2/7") self.assertRaisesMessage( # Allow 3. and .3, but not . - ValueError, "Invalid literal for Fraction: .", + ValueError, "Invalid literal for Fraction: '.'", F, ".") def testImmutable(self): Modified: python/branches/py3k/Lib/test/test_posix.py ============================================================================== --- python/branches/py3k/Lib/test/test_posix.py (original) +++ python/branches/py3k/Lib/test/test_posix.py Wed Jul 2 19:30:14 2008 @@ -10,6 +10,7 @@ import time import os import pwd +import shutil import unittest import warnings warnings.filterwarnings('ignore', '.* potential security risk .*', @@ -225,6 +226,44 @@ self.assertEqual(type(k), str) self.assertEqual(type(v), str) + def test_getcwd_long_pathnames(self): + if hasattr(posix, 'getcwd'): + dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef' + curdir = os.getcwd() + base_path = os.path.abspath(support.TESTFN) + '.getcwd' + + try: + os.mkdir(base_path) + os.chdir(base_path) + except: +# Just returning nothing instead of the TestSkipped exception, +# because the test results in Error in that case. +# Is that ok? +# raise support.TestSkipped, "cannot create directory for testing" + return + + def _create_and_do_getcwd(dirname, current_path_length = 0): + try: + os.mkdir(dirname) + except: + raise support.TestSkipped("mkdir cannot create directory sufficiently deep for getcwd test") + + os.chdir(dirname) + try: + os.getcwd() + if current_path_length < 1027: + _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1) + finally: + os.chdir('..') + os.rmdir(dirname) + + _create_and_do_getcwd(dirname) + + finally: + shutil.rmtree(base_path) + os.chdir(curdir) + + def test_main(): support.run_unittest(PosixTester) Modified: python/branches/py3k/Modules/_sqlite/module.c ============================================================================== --- python/branches/py3k/Modules/_sqlite/module.c (original) +++ python/branches/py3k/Modules/_sqlite/module.c Wed Jul 2 19:30:14 2008 @@ -76,6 +76,13 @@ return result; } +PyDoc_STRVAR(module_connect_doc, +"connect(database[, timeout, isolation_level, detect_types, factory])\n\ +\n\ +Opens a connection to the SQLite database file *database*. You can use\n\ +\":memory:\" to open a database connection to a database that resides in\n\ +RAM instead of on disk."); + static PyObject* module_complete(PyObject* self, PyObject* args, PyObject* kwargs) { @@ -100,6 +107,11 @@ return result; } +PyDoc_STRVAR(module_complete_doc, +"complete_statement(sql)\n\ +\n\ +Checks if a string contains a complete SQL statement. Non-standard."); + #ifdef HAVE_SHARED_CACHE static PyObject* module_enable_shared_cache(PyObject* self, PyObject* args, PyObject* kwargs) @@ -123,9 +135,15 @@ return Py_None; } } + +PyDoc_STRVAR(module_enable_shared_cache_doc, +"enable_shared_cache(do_enable)\n\ +\n\ +Enable or disable shared cache mode for the calling thread.\n\ +Experimental/Non-standard."); #endif /* HAVE_SHARED_CACHE */ -static PyObject* module_register_adapter(PyObject* self, PyObject* args, PyObject* kwargs) +static PyObject* module_register_adapter(PyObject* self, PyObject* args) { PyTypeObject* type; PyObject* caster; @@ -147,7 +165,12 @@ return Py_None; } -static PyObject* module_register_converter(PyObject* self, PyObject* args, PyObject* kwargs) +PyDoc_STRVAR(module_register_adapter_doc, +"register_adapter(type, callable)\n\ +\n\ +Registers an adapter with pysqlite's adapter registry. Non-standard."); + +static PyObject* module_register_converter(PyObject* self, PyObject* args) { PyObject* orig_name; PyObject* name = NULL; @@ -175,7 +198,12 @@ return retval; } -static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args, PyObject* kwargs) +PyDoc_STRVAR(module_register_converter_doc, +"register_converter(typename, callable)\n\ +\n\ +Registers a converter with pysqlite. Non-standard."); + +static PyObject* enable_callback_tracebacks(PyObject* self, PyObject* args) { if (!PyArg_ParseTuple(args, "i", &_enable_callback_tracebacks)) { return NULL; @@ -185,6 +213,11 @@ return Py_None; } +PyDoc_STRVAR(enable_callback_tracebacks_doc, +"enable_callback_tracebacks(flag)\n\ +\n\ +Enable or disable callback functions throwing errors to stderr."); + static void converters_init(PyObject* dict) { converters = PyDict_New(); @@ -196,15 +229,22 @@ } static PyMethodDef module_methods[] = { - {"connect", (PyCFunction)module_connect, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("Creates a connection.")}, - {"complete_statement", (PyCFunction)module_complete, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("Checks if a string contains a complete SQL statement. Non-standard.")}, + {"connect", (PyCFunction)module_connect, + METH_VARARGS | METH_KEYWORDS, module_connect_doc}, + {"complete_statement", (PyCFunction)module_complete, + METH_VARARGS | METH_KEYWORDS, module_complete_doc}, #ifdef HAVE_SHARED_CACHE - {"enable_shared_cache", (PyCFunction)module_enable_shared_cache, METH_VARARGS|METH_KEYWORDS, PyDoc_STR("Enable or disable shared cache mode for the calling thread. Experimental/Non-standard.")}, + {"enable_shared_cache", (PyCFunction)module_enable_shared_cache, + METH_VARARGS | METH_KEYWORDS, module_enable_shared_cache_doc}, #endif - {"register_adapter", (PyCFunction)module_register_adapter, METH_VARARGS, PyDoc_STR("Registers an adapter with pysqlite's adapter registry. Non-standard.")}, - {"register_converter", (PyCFunction)module_register_converter, METH_VARARGS, PyDoc_STR("Registers a converter with pysqlite. Non-standard.")}, - {"adapt", (PyCFunction)psyco_microprotocols_adapt, METH_VARARGS, psyco_microprotocols_adapt_doc}, - {"enable_callback_tracebacks", (PyCFunction)enable_callback_tracebacks, METH_VARARGS, PyDoc_STR("Enable or disable callback functions throwing errors to stderr.")}, + {"register_adapter", (PyCFunction)module_register_adapter, + METH_VARARGS, module_register_adapter_doc}, + {"register_converter", (PyCFunction)module_register_converter, + METH_VARARGS, module_register_converter_doc}, + {"adapt", (PyCFunction)psyco_microprotocols_adapt, METH_VARARGS, + psyco_microprotocols_adapt_doc}, + {"enable_callback_tracebacks", (PyCFunction)enable_callback_tracebacks, + METH_VARARGS, enable_callback_tracebacks_doc}, {NULL, NULL} }; @@ -403,12 +443,12 @@ pysqlite_BaseTypeAdapted = 0; - /* Original comment form _bsddb.c in the Python core. This is also still + /* Original comment from _bsddb.c in the Python core. This is also still * needed nowadays for Python 2.3/2.4. * * PyEval_InitThreads is called here due to a quirk in python 1.5 * - 2.2.1 (at least) according to Russell Williamson : - * The global interepreter lock is not initialized until the first + * The global interpreter lock is not initialized until the first * thread is created using thread.start_new_thread() or fork() is * called. that would cause the ALLOW_THREADS here to segfault due * to a null pointer reference if no threads or child processes Modified: python/branches/py3k/Modules/posixmodule.c ============================================================================== --- python/branches/py3k/Modules/posixmodule.c (original) +++ python/branches/py3k/Modules/posixmodule.c Wed Jul 2 19:30:14 2008 @@ -1981,19 +1981,38 @@ static PyObject * posix_getcwd(PyObject *self, PyObject *noargs) { - char buf[1026]; - char *res; + int bufsize_incr = 1024; + int bufsize = 0; + char *tmpbuf = NULL; + char *res = NULL; + PyObject *dynamic_return; Py_BEGIN_ALLOW_THREADS + do { + bufsize = bufsize + bufsize_incr; + tmpbuf = malloc(bufsize); + if (tmpbuf == NULL) { + break; + } #if defined(PYOS_OS2) && defined(PYCC_GCC) - res = _getcwd2(buf, sizeof buf); + res = _getcwd2(tmpbuf, bufsize); #else - res = getcwd(buf, sizeof buf); + res = getcwd(tmpbuf, bufsize); #endif + + if (res == NULL) { + free(tmpbuf); + } + } while ((res == NULL) && (errno == ERANGE)); Py_END_ALLOW_THREADS + if (res == NULL) return posix_error(); - return PyUnicode_FromString(buf); + + dynamic_return = PyUnicode_FromString(tmpbuf); + free(tmpbuf); + + return dynamic_return; } PyDoc_STRVAR(posix_getcwdu__doc__, Modified: python/branches/py3k/Objects/bytearrayobject.c ============================================================================== --- python/branches/py3k/Objects/bytearrayobject.c (original) +++ python/branches/py3k/Objects/bytearrayobject.c Wed Jul 2 19:30:14 2008 @@ -2648,7 +2648,7 @@ "B.pop([index]) -> int\n\ \n\ Remove and return a single item from B. If no index\n\ -argument is give, will pop the last value."); +argument is given, will pop the last value."); static PyObject * bytes_pop(PyByteArrayObject *self, PyObject *args) { From python-3000-checkins at python.org Wed Jul 2 21:49:39 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Wed, 2 Jul 2008 21:49:39 +0200 (CEST) Subject: [Python-3000-checkins] r64670 - python/branches/py3k/PCbuild/pcbuild.sln Message-ID: <20080702194939.3AD0A1E4002@bag.python.org> Author: amaury.forgeotdarc Date: Wed Jul 2 21:49:38 2008 New Revision: 64670 Log: Revert a bad change I made in r64209, which probably broke compilation on win64 Modified: python/branches/py3k/PCbuild/pcbuild.sln Modified: python/branches/py3k/PCbuild/pcbuild.sln ============================================================================== --- python/branches/py3k/PCbuild/pcbuild.sln (original) +++ python/branches/py3k/PCbuild/pcbuild.sln Wed Jul 2 21:49:38 2008 @@ -1,5 +1,5 @@ Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 +# Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcproj", "{B11D750F-CD1F-4A96-85CE-E69A5C5259F9}" ProjectSection(ProjectDependencies) = postProject {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} = {CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26} @@ -152,16 +152,20 @@ GlobalSection(ProjectConfigurationPlatforms) = postSolution {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.ActiveCfg = Debug|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|Win32.Build.0 = Debug|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.ActiveCfg = Debug|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Debug|x64.Build.0 = Debug|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGInstrument|x64.Build.0 = PGInstrument|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.PGUpdate|x64.Build.0 = PGUpdate|x64 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.ActiveCfg = Release|Win32 {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|Win32.Build.0 = Release|Win32 - {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|Win32 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.ActiveCfg = Release|x64 + {B11D750F-CD1F-4A96-85CE-E69A5C5259F9}.Release|x64.Build.0 = Release|x64 {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|Win32.ActiveCfg = Debug|Win32 {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|Win32.Build.0 = Debug|Win32 {F0E0541E-F17D-430B-97C4-93ADF0DD284E}.Debug|x64.ActiveCfg = Debug|Win32 @@ -308,16 +312,20 @@ {9EC7190A-249F-4180-A900-548FDCF3055F}.Release|x64.Build.0 = Release|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.ActiveCfg = Debug|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|Win32.Build.0 = Debug|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.ActiveCfg = Debug|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Debug|x64.Build.0 = Debug|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.ActiveCfg = PGInstrument|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|Win32.Build.0 = PGInstrument|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.ActiveCfg = PGInstrument|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGInstrument|x64.Build.0 = PGInstrument|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.ActiveCfg = PGUpdate|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|Win32.Build.0 = PGUpdate|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.ActiveCfg = PGUpdate|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.PGUpdate|x64.Build.0 = PGUpdate|x64 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.ActiveCfg = Release|Win32 {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|Win32.Build.0 = Release|Win32 - {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|Win32 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.ActiveCfg = Release|x64 + {17E1E049-C309-4D79-843F-AE483C264AEA}.Release|x64.Build.0 = Release|x64 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.ActiveCfg = Debug|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|Win32.Build.0 = Debug|Win32 {31FFC478-7B4A-43E8-9954-8D03E2187E9C}.Debug|x64.ActiveCfg = Debug|x64 From python-3000-checkins at python.org Wed Jul 2 22:22:55 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 2 Jul 2008 22:22:55 +0200 (CEST) Subject: [Python-3000-checkins] r64671 - in python/branches/py3k: Doc/Makefile Doc/glossary.rst Doc/library/abc.rst Doc/library/collections.rst Doc/library/msilib.rst Doc/library/rlcompleter.rst Doc/library/subprocess.rst Doc/reference/compound_stmts.rst Doc/reference/expressions.rst Lib/_abcoll.py Lib/decimal.py Lib/fractions.py Lib/logging/config.py Lib/pydoc.py Lib/rlcompleter.py Lib/test/test_audioop.py Lib/test/test_collections.py Lib/test/test_decimal.py Lib/test/test_fractions.py Lib/test/test_multiprocessing.py Lib/test/test_pydoc.py Misc/ACKS Objects/dictobject.c setup.py Message-ID: <20080702202255.C00DA1E400A@bag.python.org> Author: benjamin.peterson Date: Wed Jul 2 22:22:54 2008 New Revision: 64671 Log: Merged revisions 64475,64544-64545,64550,64557-64558,64565,64570,64577,64582-64583,64585,64590,64592-64593,64625,64630,64638,64647,64655-64656,64663-64664 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64475 | raymond.hettinger | 2008-06-22 22:29:28 -0500 (Sun, 22 Jun 2008) | 1 line Issue 3161: Missing import and test. ........ r64544 | georg.brandl | 2008-06-26 16:12:55 -0500 (Thu, 26 Jun 2008) | 2 lines Use newer versions of externals. ........ r64545 | benjamin.peterson | 2008-06-26 16:23:30 -0500 (Thu, 26 Jun 2008) | 1 line add a htmlview directive ........ r64550 | brett.cannon | 2008-06-26 19:32:16 -0500 (Thu, 26 Jun 2008) | 2 lines Ignore .pyc and .pyo files. ........ r64557 | mark.dickinson | 2008-06-27 05:11:52 -0500 (Fri, 27 Jun 2008) | 3 lines Remove trailing 'L's from numerator and denominator in the repr() of a Fraction instance. ........ r64558 | mark.dickinson | 2008-06-27 06:03:21 -0500 (Fri, 27 Jun 2008) | 2 lines Add Jean Brouwers for his work on math.sum ........ r64565 | raymond.hettinger | 2008-06-27 16:34:24 -0500 (Fri, 27 Jun 2008) | 1 line Fix whitespace in example code. ........ r64570 | hyeshik.chang | 2008-06-27 20:04:31 -0500 (Fri, 27 Jun 2008) | 8 lines Give information for compililation of _multiprocessing.SemLock on FreeBSD: FreeBSD's P1003.1b semaphore support is highly experimental and it's disabled by default. Even if a user loads the experimental kernel module manually, _multiprocessing doesn't work correctly due to several known incompatibilities around sem_unlink and sem_getvalue, yet. ........ r64577 | raymond.hettinger | 2008-06-28 17:16:53 -0500 (Sat, 28 Jun 2008) | 1 line Issue 3230: Do not the set specific size macro. ........ r64582 | benjamin.peterson | 2008-06-28 18:06:05 -0500 (Sat, 28 Jun 2008) | 2 lines convert test_audioop to unittest. Thanks to Giampaolo Rodola. ........ r64583 | benjamin.peterson | 2008-06-28 18:06:49 -0500 (Sat, 28 Jun 2008) | 1 line rewrap ........ r64585 | benjamin.peterson | 2008-06-28 18:35:31 -0500 (Sat, 28 Jun 2008) | 1 line fix typo ........ r64590 | benjamin.peterson | 2008-06-29 08:43:07 -0500 (Sun, 29 Jun 2008) | 1 line reinstate the ending backtick. thanks Nick :) ........ r64592 | vinay.sajip | 2008-06-29 16:25:28 -0500 (Sun, 29 Jun 2008) | 2 lines Removed out-of-date comment in _install_handlers and used issubclass in place of equality comparison of classes. ........ r64593 | vinay.sajip | 2008-06-29 16:27:15 -0500 (Sun, 29 Jun 2008) | 1 line Updated to reflect change in logging.config to remove out-of-date comment in _install_handlers and the use of issubclass in place of equality comparison of classes. ........ r64625 | georg.brandl | 2008-07-01 14:59:00 -0500 (Tue, 01 Jul 2008) | 2 lines Add a link to PEP 324. ........ r64630 | georg.brandl | 2008-07-01 15:18:10 -0500 (Tue, 01 Jul 2008) | 2 lines #3216: fix Execute's parameter description. ........ r64638 | georg.brandl | 2008-07-01 15:50:02 -0500 (Tue, 01 Jul 2008) | 2 lines #1410739: add a footnote about "is" and "unusual" behavior. ........ r64647 | benjamin.peterson | 2008-07-01 18:33:06 -0500 (Tue, 01 Jul 2008) | 1 line add ABC to the glossary ........ r64655 | mark.dickinson | 2008-07-02 04:37:01 -0500 (Wed, 02 Jul 2008) | 7 lines Replace occurrences of '\d' with '[0-9]' in Decimal regex, to make sure that the behaviour of Decimal doesn't change if/when re.UNICODE becomes assumed in Python 3.0. Also add a check that alternative Unicode digits (e.g. u'\N{FULLWIDTH DIGIT ONE}') are *not* accepted in a numeric string. ........ r64656 | nick.coghlan | 2008-07-02 08:09:19 -0500 (Wed, 02 Jul 2008) | 1 line Issue 3190: pydoc now hides module __package__ attributes ........ r64663 | jesse.noller | 2008-07-02 11:44:09 -0500 (Wed, 02 Jul 2008) | 1 line Reenable the manager tests with Amaury's threading fix ........ r64664 | facundo.batista | 2008-07-02 11:52:55 -0500 (Wed, 02 Jul 2008) | 4 lines Issue #449227: Now with the rlcompleter module, callable objects are added a '(' when completed. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/Makefile python/branches/py3k/Doc/glossary.rst python/branches/py3k/Doc/library/abc.rst python/branches/py3k/Doc/library/collections.rst python/branches/py3k/Doc/library/msilib.rst python/branches/py3k/Doc/library/rlcompleter.rst python/branches/py3k/Doc/library/subprocess.rst python/branches/py3k/Doc/reference/compound_stmts.rst python/branches/py3k/Doc/reference/expressions.rst python/branches/py3k/Lib/_abcoll.py python/branches/py3k/Lib/decimal.py python/branches/py3k/Lib/fractions.py python/branches/py3k/Lib/logging/config.py python/branches/py3k/Lib/pydoc.py python/branches/py3k/Lib/rlcompleter.py python/branches/py3k/Lib/test/test_audioop.py python/branches/py3k/Lib/test/test_collections.py python/branches/py3k/Lib/test/test_decimal.py python/branches/py3k/Lib/test/test_fractions.py python/branches/py3k/Lib/test/test_multiprocessing.py python/branches/py3k/Lib/test/test_pydoc.py python/branches/py3k/Misc/ACKS python/branches/py3k/Objects/dictobject.c python/branches/py3k/setup.py Modified: python/branches/py3k/Doc/Makefile ============================================================================== --- python/branches/py3k/Doc/Makefile (original) +++ python/branches/py3k/Doc/Makefile Wed Jul 2 22:22:54 2008 @@ -33,15 +33,15 @@ fi @if [ ! -d tools/docutils ]; then \ echo "Checking out Docutils..."; \ - svn checkout $(SVNROOT)/external/docutils-0.4/docutils tools/docutils; \ + svn checkout $(SVNROOT)/external/docutils-0.5/docutils tools/docutils; \ fi @if [ ! -d tools/jinja ]; then \ echo "Checking out Jinja..."; \ - svn checkout $(SVNROOT)/external/Jinja-1.1/jinja tools/jinja; \ + svn checkout $(SVNROOT)/external/Jinja-1.2/jinja tools/jinja; \ fi @if [ ! -d tools/pygments ]; then \ echo "Checking out Pygments..."; \ - svn checkout $(SVNROOT)/external/Pygments-0.9/pygments tools/pygments; \ + svn checkout $(SVNROOT)/external/Pygments-0.10/pygments tools/pygments; \ fi update: checkout @@ -103,6 +103,8 @@ @echo "Building finished; now copy build/pydoc-topics/pydoc_topics.py " \ "into the Lib/ directory" +htmlview: html + $(PYTHON) -c "import webbrowser; webbrowser.open('build/html/index.html')" clean: -rm -rf build/* -rm -rf tools/sphinx Modified: python/branches/py3k/Doc/glossary.rst ============================================================================== --- python/branches/py3k/Doc/glossary.rst (original) +++ python/branches/py3k/Doc/glossary.rst Wed Jul 2 22:22:54 2008 @@ -16,6 +16,14 @@ The typical Python prompt of the interactive shell when entering code for an indented code block. + Abstract Base Class + Abstract Base Classes (abbreviated ABCs) complement :term:`duck-typing` by + providing a way to define interfaces when other techniques like :func:`hasattr` + would be clumsy. Python comes with many builtin ABCs for data structures + (in the :mod:`collections` module), numbers (in the :mod:`numbers` + module), and streams (in the :mod:`io` module). You can create your own + ABC with the :mod:`abc` module. + argument A value passed to a function or method, assigned to a name local to the body. A function or method may have both positional arguments and @@ -93,15 +101,16 @@ be any object with a :meth:`__hash__` function, not just integers starting from zero. Called a hash in Perl. - duck-typing + duck-typing Pythonic programming style that determines an object's type by inspection of its method or attribute signature rather than by explicit relationship to some type object ("If it looks like a duck and quacks like a duck, it must be a duck.") By emphasizing interfaces rather than specific types, well-designed code improves its flexibility by allowing polymorphic substitution. Duck-typing avoids tests using :func:`type` or - :func:`isinstance`. Instead, it typically employs :func:`hasattr` tests or - :term:`EAFP` programming. + :func:`isinstance`. (Note, however, that duck-typing can be complemented + with abstract base classes.) Instead, it typically employs :func:`hasattr` + tests or :term:`EAFP` programming. EAFP Easier to ask for forgiveness than permission. This common Python coding Modified: python/branches/py3k/Doc/library/abc.rst ============================================================================== --- python/branches/py3k/Doc/library/abc.rst (original) +++ python/branches/py3k/Doc/library/abc.rst Wed Jul 2 22:22:54 2008 @@ -8,10 +8,10 @@ .. sectionauthor:: Georg Brandl .. much of the content adapted from docstrings -This module provides the infrastructure for defining abstract base classes -(ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this was added -to Python. (See also :pep:`3141` and the :mod:`numbers` module regarding a type -hierarchy for numbers based on ABCs.) +This module provides the infrastructure for defining :term:`abstract base +classes` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this +was added to Python. (See also :pep:`3141` and the :mod:`numbers` module +regarding a type hierarchy for numbers based on ABCs.) The :mod:`collections` module has some concrete classes that derive from ABCs; these can, of course, be further derived. In addition the Modified: python/branches/py3k/Doc/library/collections.rst ============================================================================== --- python/branches/py3k/Doc/library/collections.rst (original) +++ python/branches/py3k/Doc/library/collections.rst Wed Jul 2 22:22:54 2008 @@ -520,8 +520,8 @@ raise ValueError('Got unexpected field names: %r' % kwds.keys()) return result - def __getnewargs__(self): - return tuple(self) + def __getnewargs__(self): + return tuple(self) x = property(itemgetter(0)) y = property(itemgetter(1)) Modified: python/branches/py3k/Doc/library/msilib.rst ============================================================================== --- python/branches/py3k/Doc/library/msilib.rst (original) +++ python/branches/py3k/Doc/library/msilib.rst Wed Jul 2 22:22:54 2008 @@ -1,4 +1,3 @@ - :mod:`msilib` --- Read and write Microsoft Installer files ========================================================== @@ -163,11 +162,11 @@ ------------ -.. method:: View.Execute([params=None]) +.. method:: View.Execute(params) - Execute the SQL query of the view, through :cfunc:`MSIViewExecute`. *params* is - an optional record describing actual values of the parameter tokens in the - query. + Execute the SQL query of the view, through :cfunc:`MSIViewExecute`. If + *params* is not ``None``, it is a record describing actual values of the + parameter tokens in the query. .. method:: View.GetColumnInfo(kind) Modified: python/branches/py3k/Doc/library/rlcompleter.rst ============================================================================== --- python/branches/py3k/Doc/library/rlcompleter.rst (original) +++ python/branches/py3k/Doc/library/rlcompleter.rst Wed Jul 2 22:22:54 2008 @@ -20,9 +20,9 @@ >>> import readline >>> readline.parse_and_bind("tab: complete") >>> readline. - readline.__doc__ readline.get_line_buffer readline.read_init_file - readline.__file__ readline.insert_text readline.set_completer - readline.__name__ readline.parse_and_bind + readline.__doc__ readline.get_line_buffer( readline.read_init_file( + readline.__file__ readline.insert_text( readline.set_completer( + readline.__name__ readline.parse_and_bind( >>> readline. The :mod:`rlcompleter` module is designed for use with Python's interactive Modified: python/branches/py3k/Doc/library/subprocess.rst ============================================================================== --- python/branches/py3k/Doc/library/subprocess.rst (original) +++ python/branches/py3k/Doc/library/subprocess.rst Wed Jul 2 22:22:54 2008 @@ -18,6 +18,10 @@ Information about how the :mod:`subprocess` module can be used to replace these modules and functions can be found in the following sections. +.. seealso:: + + :pep:`324` -- PEP proposing the subprocess module + Using the subprocess Module --------------------------- Modified: python/branches/py3k/Doc/reference/compound_stmts.rst ============================================================================== --- python/branches/py3k/Doc/reference/compound_stmts.rst (original) +++ python/branches/py3k/Doc/reference/compound_stmts.rst Wed Jul 2 22:22:54 2008 @@ -583,10 +583,10 @@ :pep:`3129` - Class Decorators -Class definitions, like function definitions, may be wrapped by one or -more :term:`decorator` expressions. The evaluation rules for the -decorator expressions are the same as for functions. The result must -be a class object, which is then bound to the class name. +Class definitions, like function definitions, may be wrapped by one or more +:term:`decorator` expressions. The evaluation rules for the decorator +expressions are the same as for functions. The result must be a class object, +which is then bound to the class name. .. rubric:: Footnotes Modified: python/branches/py3k/Doc/reference/expressions.rst ============================================================================== --- python/branches/py3k/Doc/reference/expressions.rst (original) +++ python/branches/py3k/Doc/reference/expressions.rst Wed Jul 2 22:22:54 2008 @@ -1082,7 +1082,7 @@ The operators :keyword:`is` and :keyword:`is not` test for object identity: ``x is y`` is true if and only if *x* and *y* are the same object. ``x is not y`` -yields the inverse truth value. +yields the inverse truth value. [#]_ .. _booleans: @@ -1314,3 +1314,7 @@ identity only, but this caused surprises because people expected to be able to test a dictionary for emptiness by comparing it to ``{}``. +.. [#] Due to automatic garbage-collection, free lists, and the dynamic nature of + descriptors, you may notice seemingly unusual behaviour in certain uses of + the :keyword:`is` operator, like those involving comparisons between instance + methods, or constants. Check their documentation for more info. Modified: python/branches/py3k/Lib/_abcoll.py ============================================================================== --- python/branches/py3k/Lib/_abcoll.py (original) +++ python/branches/py3k/Lib/_abcoll.py Wed Jul 2 22:22:54 2008 @@ -9,6 +9,7 @@ """ from abc import ABCMeta, abstractmethod +import sys __all__ = ["Hashable", "Iterable", "Iterator", "Sized", "Container", "Callable", Modified: python/branches/py3k/Lib/decimal.py ============================================================================== --- python/branches/py3k/Lib/decimal.py (original) +++ python/branches/py3k/Lib/decimal.py Wed Jul 2 22:22:54 2008 @@ -5423,20 +5423,20 @@ # other meaning for \d than the numbers [0-9]. import re -_parser = re.compile(r""" # A numeric string consists of: +_parser = re.compile(r""" # A numeric string consists of: # \s* - (?P[-+])? # an optional sign, followed by either... + (?P[-+])? # an optional sign, followed by either... ( - (?=\d|\.\d) # ...a number (with at least one digit) - (?P\d*) # consisting of a (possibly empty) integer part - (\.(?P\d*))? # followed by an optional fractional part - (E(?P[-+]?\d+))? # followed by an optional exponent, or... + (?=[0-9]|\.[0-9]) # ...a number (with at least one digit) + (?P[0-9]*) # having a (possibly empty) integer part + (\.(?P[0-9]*))? # followed by an optional fractional part + (E(?P[-+]?[0-9]+))? # followed by an optional exponent, or... | - Inf(inity)? # ...an infinity, or... + Inf(inity)? # ...an infinity, or... | - (?Ps)? # ...an (optionally signaling) - NaN # NaN - (?P\d*) # with (possibly empty) diagnostic information. + (?Ps)? # ...an (optionally signaling) + NaN # NaN + (?P[0-9]*) # with (possibly empty) diagnostic info. ) # \s* \Z Modified: python/branches/py3k/Lib/fractions.py ============================================================================== --- python/branches/py3k/Lib/fractions.py (original) +++ python/branches/py3k/Lib/fractions.py Wed Jul 2 22:22:54 2008 @@ -201,7 +201,7 @@ def __repr__(self): """repr(self)""" - return ('Fraction(%r, %r)' % (self._numerator, self._denominator)) + return ('Fraction(%s, %s)' % (self._numerator, self._denominator)) def __str__(self): """str(self)""" Modified: python/branches/py3k/Lib/logging/config.py ============================================================================== --- python/branches/py3k/Lib/logging/config.py (original) +++ python/branches/py3k/Lib/logging/config.py Wed Jul 2 22:22:54 2008 @@ -152,8 +152,7 @@ h.setLevel(logging._levelNames[level]) if len(fmt): h.setFormatter(formatters[fmt]) - #temporary hack for FileHandler and MemoryHandler. - if klass == logging.handlers.MemoryHandler: + if issubclass(klass, logging.handlers.MemoryHandler): if "target" in opts: target = cp.get(sectname,"target") else: Modified: python/branches/py3k/Lib/pydoc.py ============================================================================== --- python/branches/py3k/Lib/pydoc.py (original) +++ python/branches/py3k/Lib/pydoc.py Wed Jul 2 22:22:54 2008 @@ -159,8 +159,9 @@ def visiblename(name, all=None): """Decide whether to show documentation on a variable.""" # Certain special names are redundant. - if name in ('__builtins__', '__doc__', '__file__', '__path__', - '__module__', '__name__', '__slots__'): return 0 + _hidden_names = ('__builtins__', '__doc__', '__file__', '__path__', + '__module__', '__name__', '__slots__', '__package__') + if name in _hidden_names: return 0 # Private names are hidden, but special names are displayed. if name.startswith('__') and name.endswith('__'): return 1 if all is not None: Modified: python/branches/py3k/Lib/rlcompleter.py ============================================================================== --- python/branches/py3k/Lib/rlcompleter.py (original) +++ python/branches/py3k/Lib/rlcompleter.py Wed Jul 2 22:22:54 2008 @@ -86,6 +86,11 @@ except IndexError: return None + def _callable_postfix(self, val, word): + if callable(val): + word = word + "(" + return word + def global_matches(self, text): """Compute matches when text is a simple name. @@ -96,12 +101,13 @@ import keyword matches = [] n = len(text) - for list in [keyword.kwlist, - builtins.__dict__, - self.namespace]: - for word in list: - if word[:n] == text and word != "__builtins__": - matches.append(word) + for word in keyword.kwlist: + if word[:n] == text: + matches.append(word) + for nspace in [builtins.__dict__, self.namespace]: + for word, val in nspace.items(): + if word[:n] == text and word != "builtins": + matches.append(self._callable_postfix(val, word)) return matches def attr_matches(self, text): @@ -133,7 +139,9 @@ n = len(attr) for word in words: if word[:n] == attr and word != "__builtins__": - matches.append("%s.%s" % (expr, word)) + val = getattr(object, word) + word = self._callable_postfix(val, "%s.%s" % (expr, word)) + matches.append(word) return matches def get_class_members(klass): Modified: python/branches/py3k/Lib/test/test_audioop.py ============================================================================== --- python/branches/py3k/Lib/test/test_audioop.py (original) +++ python/branches/py3k/Lib/test/test_audioop.py Wed Jul 2 22:22:54 2008 @@ -1,288 +1,171 @@ -# Test audioop. import audioop -from test.support import verbose +import unittest +from test.support import run_unittest + def gendata1(): return b'\0\1\2' def gendata2(): - if verbose: - print('getsample') if audioop.getsample(b'\0\1', 2, 0) == 1: return b'\0\0\0\1\0\2' else: return b'\0\0\1\0\2\0' def gendata4(): - if verbose: - print('getsample') if audioop.getsample(b'\0\0\0\1', 4, 0) == 1: return b'\0\0\0\0\0\0\0\1\0\0\0\2' else: return b'\0\0\0\0\1\0\0\0\2\0\0\0' -def testmax(data): - if verbose: - print('max') - if audioop.max(data[0], 1) != 2 or \ - audioop.max(data[1], 2) != 2 or \ - audioop.max(data[2], 4) != 2: - return 0 - return 1 - -def testminmax(data): - if verbose: - print('minmax') - if audioop.minmax(data[0], 1) != (0, 2) or \ - audioop.minmax(data[1], 2) != (0, 2) or \ - audioop.minmax(data[2], 4) != (0, 2): - return 0 - return 1 - -def testmaxpp(data): - if verbose: - print('maxpp') - if audioop.maxpp(data[0], 1) != 0 or \ - audioop.maxpp(data[1], 2) != 0 or \ - audioop.maxpp(data[2], 4) != 0: - return 0 - return 1 - -def testavg(data): - if verbose: - print('avg') - if audioop.avg(data[0], 1) != 1 or \ - audioop.avg(data[1], 2) != 1 or \ - audioop.avg(data[2], 4) != 1: - return 0 - return 1 - -def testavgpp(data): - if verbose: - print('avgpp') - if audioop.avgpp(data[0], 1) != 0 or \ - audioop.avgpp(data[1], 2) != 0 or \ - audioop.avgpp(data[2], 4) != 0: - return 0 - return 1 - -def testrms(data): - if audioop.rms(data[0], 1) != 1 or \ - audioop.rms(data[1], 2) != 1 or \ - audioop.rms(data[2], 4) != 1: - return 0 - return 1 - -def testcross(data): - if verbose: - print('cross') - if audioop.cross(data[0], 1) != 0 or \ - audioop.cross(data[1], 2) != 0 or \ - audioop.cross(data[2], 4) != 0: - return 0 - return 1 - -def testadd(data): - if verbose: - print('add') - data2 = [] - for d in data: - str = bytearray(len(d)) - for i,b in enumerate(d): - str[i] = 2*b - data2.append(str) - if audioop.add(data[0], data[0], 1) != data2[0] or \ - audioop.add(data[1], data[1], 2) != data2[1] or \ - audioop.add(data[2], data[2], 4) != data2[2]: - return 0 - return 1 - -def testbias(data): - if verbose: - print('bias') - # Note: this test assumes that avg() works - d1 = audioop.bias(data[0], 1, 100) - d2 = audioop.bias(data[1], 2, 100) - d4 = audioop.bias(data[2], 4, 100) - if audioop.avg(d1, 1) != 101 or \ - audioop.avg(d2, 2) != 101 or \ - audioop.avg(d4, 4) != 101: - return 0 - return 1 - -def testlin2lin(data): - if verbose: - print('lin2lin') - # too simple: we test only the size - for d1 in data: - for d2 in data: - got = len(d1)//3 - wtd = len(d2)//3 - if len(audioop.lin2lin(d1, got, wtd)) != len(d2): - return 0 - return 1 - -def testadpcm2lin(data): - # Very cursory test - if audioop.adpcm2lin(b'\0\0', 1, None) != (b'\0\0\0\0', (0,0)): - return 0 - return 1 - -def testlin2adpcm(data): - if verbose: - print('lin2adpcm') - # Very cursory test - if audioop.lin2adpcm(b'\0\0\0\0', 1, None) != (b'\0\0', (0,0)): - return 0 - return 1 - -def testlin2alaw(data): - if verbose: - print('lin2alaw') - if audioop.lin2alaw(data[0], 1) != b'\xd5\xc5\xf5' or \ - audioop.lin2alaw(data[1], 2) != b'\xd5\xd5\xd5' or \ - audioop.lin2alaw(data[2], 4) != b'\xd5\xd5\xd5': - return 0 - return 1 - -def testalaw2lin(data): - if verbose: - print('alaw2lin') - # Cursory - d = audioop.lin2alaw(data[0], 1) - if audioop.alaw2lin(d, 1) != data[0]: - return 0 - return 1 - -def testlin2ulaw(data): - if verbose: - print('lin2ulaw') - if audioop.lin2ulaw(data[0], 1) != b'\xff\xe7\xdb' or \ - audioop.lin2ulaw(data[1], 2) != b'\xff\xff\xff' or \ - audioop.lin2ulaw(data[2], 4) != b'\xff\xff\xff': - return 0 - return 1 - -def testulaw2lin(data): - if verbose: - print('ulaw2lin') - # Cursory - d = audioop.lin2ulaw(data[0], 1) - if audioop.ulaw2lin(d, 1) != data[0]: - return 0 - return 1 - -def testmul(data): - if verbose: - print('mul') - data2 = [] - for d in data: - str = bytearray(len(d)) - for i,b in enumerate(d): - str[i] = 2*b - data2.append(str) - if audioop.mul(data[0], 1, 2) != data2[0] or \ - audioop.mul(data[1],2, 2) != data2[1] or \ - audioop.mul(data[2], 4, 2) != data2[2]: - return 0 - return 1 - -def testratecv(data): - if verbose: - print('ratecv') - state = None - d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) - d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) - if d1 + d2 != b'\000\000\001\001\002\001\000\000\001\001\002': - return 0 - return 1 - -def testreverse(data): - if verbose: - print('reverse') - if audioop.reverse(data[0], 1) != b'\2\1\0': - return 0 - return 1 - -def testtomono(data): - if verbose: - print('tomono') - data2 = bytearray() - for d in data[0]: - data2.append(d) - data2.append(d) - if audioop.tomono(data2, 1, 0.5, 0.5) != data[0]: - return 0 - return 1 - -def testtostereo(data): - if verbose: - print('tostereo') - data2 = bytearray() - for d in data[0]: - data2.append(d) - data2.append(d) - if audioop.tostereo(data[0], 1, 1, 1) != data2: - return 0 - return 1 - -def testfindfactor(data): - if verbose: - print('findfactor') - if audioop.findfactor(data[1], data[1]) != 1.0: - return 0 - return 1 - -def testfindfit(data): - if verbose: - print('findfit') - if audioop.findfit(data[1], data[1]) != (0, 1.0): - return 0 - return 1 - -def testfindmax(data): - if verbose: - print('findmax') - if audioop.findmax(data[1], 1) != 2: - return 0 - return 1 - -def testgetsample(data): - if verbose: - print('getsample') - for i in range(3): - if audioop.getsample(data[0], 1, i) != i or \ - audioop.getsample(data[1], 2, i) != i or \ - audioop.getsample(data[2], 4, i) != i: - return 0 - return 1 - -def testone(name, data): - try: - func = eval('test'+name) - except NameError: - print('No test found for audioop.'+name+'()') - return - try: - rv = func(data) - except Exception as e: - print('Test FAILED for audioop.'+name+'() (with %s)' % repr(e)) - return - if not rv: - print('Test FAILED for audioop.'+name+'()') +data = [gendata1(), gendata2(), gendata4()] -def test_main(): - data = [gendata1(), gendata2(), gendata4()] - names = dir(audioop) - # We know there is a routine 'add' - routines = [] - for n in names: - if type(eval('audioop.'+n)) == type(audioop.add): - routines.append(n) - for n in routines: - testone(n, data) +class TestAudioop(unittest.TestCase): + + def test_max(self): + self.assertEqual(audioop.max(data[0], 1), 2) + self.assertEqual(audioop.max(data[1], 2), 2) + self.assertEqual(audioop.max(data[2], 4), 2) + + def test_minmax(self): + self.assertEqual(audioop.minmax(data[0], 1), (0, 2)) + self.assertEqual(audioop.minmax(data[1], 2), (0, 2)) + self.assertEqual(audioop.minmax(data[2], 4), (0, 2)) + + def test_maxpp(self): + self.assertEqual(audioop.maxpp(data[0], 1), 0) + self.assertEqual(audioop.maxpp(data[1], 2), 0) + self.assertEqual(audioop.maxpp(data[2], 4), 0) + + def test_avg(self): + self.assertEqual(audioop.avg(data[0], 1), 1) + self.assertEqual(audioop.avg(data[1], 2), 1) + self.assertEqual(audioop.avg(data[2], 4), 1) + + def test_avgpp(self): + self.assertEqual(audioop.avgpp(data[0], 1), 0) + self.assertEqual(audioop.avgpp(data[1], 2), 0) + self.assertEqual(audioop.avgpp(data[2], 4), 0) + + def test_rms(self): + self.assertEqual(audioop.rms(data[0], 1), 1) + self.assertEqual(audioop.rms(data[1], 2), 1) + self.assertEqual(audioop.rms(data[2], 4), 1) + + def test_cross(self): + self.assertEqual(audioop.cross(data[0], 1), 0) + self.assertEqual(audioop.cross(data[1], 2), 0) + self.assertEqual(audioop.cross(data[2], 4), 0) + + def test_add(self): + data2 = [] + for d in data: + str = bytearray(len(d)) + for i,b in enumerate(d): + str[i] = 2*b + data2.append(str) + self.assertEqual(audioop.add(data[0], data[0], 1), data2[0]) + self.assertEqual(audioop.add(data[1], data[1], 2), data2[1]) + self.assertEqual(audioop.add(data[2], data[2], 4), data2[2]) + + def test_bias(self): + # Note: this test assumes that avg() works + d1 = audioop.bias(data[0], 1, 100) + d2 = audioop.bias(data[1], 2, 100) + d4 = audioop.bias(data[2], 4, 100) + self.assertEqual(audioop.avg(d1, 1), 101) + self.assertEqual(audioop.avg(d2, 2), 101) + self.assertEqual(audioop.avg(d4, 4), 101) + + def test_lin2lin(self): + # too simple: we test only the size + for d1 in data: + for d2 in data: + got = len(d1)//3 + wtd = len(d2)//3 + self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2)) + + def test_adpcm2lin(self): + # Very cursory test + self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0\0\0\0', (0,0))) + + def test_lin2adpcm(self): + # Very cursory test + self.assertEqual(audioop.lin2adpcm(b'\0\0\0\0', 1, None), (b'\0\0', (0,0))) + + def test_lin2alaw(self): + self.assertEqual(audioop.lin2alaw(data[0], 1), b'\xd5\xc5\xf5') + self.assertEqual(audioop.lin2alaw(data[1], 2), b'\xd5\xd5\xd5') + self.assertEqual(audioop.lin2alaw(data[2], 4), b'\xd5\xd5\xd5') + + def test_alaw2lin(self): + # Cursory + d = audioop.lin2alaw(data[0], 1) + self.assertEqual(audioop.alaw2lin(d, 1), data[0]) + + def test_lin2ulaw(self): + self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb') + self.assertEqual(audioop.lin2ulaw(data[1], 2), b'\xff\xff\xff') + self.assertEqual(audioop.lin2ulaw(data[2], 4), b'\xff\xff\xff') + + def test_ulaw2lin(self): + # Cursory + d = audioop.lin2ulaw(data[0], 1) + self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) + + def test_mul(self): + data2 = [] + for d in data: + str = bytearray(len(d)) + for i,b in enumerate(d): + str[i] = 2*b + data2.append(str) + self.assertEqual(audioop.mul(data[0], 1, 2), data2[0]) + self.assertEqual(audioop.mul(data[1],2, 2), data2[1]) + self.assertEqual(audioop.mul(data[2], 4, 2), data2[2]) + + def test_ratecv(self): + state = None + d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) + d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state) + self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002') + + def test_reverse(self): + self.assertEqual(audioop.reverse(data[0], 1), b'\2\1\0') + + def test_tomono(self): + data2 = bytearray() + for d in data[0]: + data2.append(d) + data2.append(d) + self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0]) + + def test_tostereo(self): + data2 = bytearray() + for d in data[0]: + data2.append(d) + data2.append(d) + self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2) + + def test_findfactor(self): + self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0) + + def test_findfit(self): + self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0)) + + def test_findmax(self): + self.assertEqual(audioop.findmax(data[1], 1), 2) + + def test_getsample(self): + for i in range(3): + self.assertEqual(audioop.getsample(data[0], 1, i), i) + self.assertEqual(audioop.getsample(data[1], 2, i), i) + self.assertEqual(audioop.getsample(data[2], 4, i), i) +def test_main(): + run_unittest(TestAudioop) + if __name__ == '__main__': test_main() Modified: python/branches/py3k/Lib/test/test_collections.py ============================================================================== --- python/branches/py3k/Lib/test/test_collections.py (original) +++ python/branches/py3k/Lib/test/test_collections.py Wed Jul 2 22:22:54 2008 @@ -296,6 +296,21 @@ self.failUnless(isinstance(sample(), Set)) self.failUnless(issubclass(sample, Set)) + def test_hash_Set(self): + class OneTwoThreeSet(Set): + def __init__(self): + self.contents = [1, 2, 3] + def __contains__(self, x): + return x in self.contents + def __len__(self): + return len(self.contents) + def __iter__(self): + return iter(self.contents) + def __hash__(self): + return self._hash() + a, b = OneTwoThreeSet(), OneTwoThreeSet() + self.failUnless(hash(a) == hash(b)) + def test_MutableSet(self): self.failUnless(isinstance(set(), MutableSet)) self.failUnless(issubclass(set, MutableSet)) Modified: python/branches/py3k/Lib/test/test_decimal.py ============================================================================== --- python/branches/py3k/Lib/test/test_decimal.py (original) +++ python/branches/py3k/Lib/test/test_decimal.py Wed Jul 2 22:22:54 2008 @@ -426,6 +426,9 @@ self.assertEqual(str(Decimal('1.3E4 \n')), '1.3E+4') self.assertEqual(str(Decimal(' -7.89')), '-7.89') + #but alternate unicode digits should not + self.assertEqual(str(Decimal('\uff11')), 'NaN') + def test_explicit_from_tuples(self): #zero Modified: python/branches/py3k/Lib/test/test_fractions.py ============================================================================== --- python/branches/py3k/Lib/test/test_fractions.py (original) +++ python/branches/py3k/Lib/test/test_fractions.py Wed Jul 2 22:22:54 2008 @@ -364,6 +364,10 @@ def testStringification(self): self.assertEquals("Fraction(7, 3)", repr(F(7, 3))) + self.assertEquals("Fraction(6283185307, 2000000000)", + repr(F('3.1415926535'))) + self.assertEquals("Fraction(-1, 100000000000000000000)", + repr(F(1, -10**20))) self.assertEquals("7/3", str(F(7, 3))) self.assertEquals("7", str(F(7, 1))) Modified: python/branches/py3k/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k/Lib/test/test_multiprocessing.py Wed Jul 2 22:22:54 2008 @@ -960,7 +960,6 @@ def sqr(x, wait=0.0): time.sleep(wait) return x*x -""" class _TestPool(BaseTestCase): def test_apply(self): @@ -1030,7 +1029,6 @@ join = TimingWrapper(self.pool.join) join() self.assertTrue(join.elapsed < 0.2) -""" # # Test that manager has expected number of shared objects left # @@ -1333,7 +1331,6 @@ self.assertRaises(ValueError, a.send_bytes, msg, 4, -1) -""" class _TestListenerClient(BaseTestCase): ALLOWED_TYPES = ('processes', 'threads') @@ -1353,7 +1350,6 @@ self.assertEqual(conn.recv(), 'hello') p.join() l.close() -""" # # Test of sending connection and socket objects between processes # @@ -1769,28 +1765,28 @@ multiprocessing.get_logger().setLevel(LOG_LEVEL) - #ProcessesMixin.pool = multiprocessing.Pool(4) - #ThreadsMixin.pool = multiprocessing.dummy.Pool(4) - #ManagerMixin.manager.__init__() - #ManagerMixin.manager.start() - #ManagerMixin.pool = ManagerMixin.manager.Pool(4) + ProcessesMixin.pool = multiprocessing.Pool(4) + ThreadsMixin.pool = multiprocessing.dummy.Pool(4) + ManagerMixin.manager.__init__() + ManagerMixin.manager.start() + ManagerMixin.pool = ManagerMixin.manager.Pool(4) testcases = ( - sorted(testcases_processes.values(), key=lambda tc:tc.__name__) #+ - #sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + - #sorted(testcases_manager.values(), key=lambda tc:tc.__name__) + sorted(testcases_processes.values(), key=lambda tc:tc.__name__) + + sorted(testcases_threads.values(), key=lambda tc:tc.__name__) + + sorted(testcases_manager.values(), key=lambda tc:tc.__name__) ) loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases) run(suite) - #ThreadsMixin.pool.terminate() - #ProcessesMixin.pool.terminate() - #ManagerMixin.pool.terminate() - #ManagerMixin.manager.shutdown() + ThreadsMixin.pool.terminate() + ProcessesMixin.pool.terminate() + ManagerMixin.pool.terminate() + ManagerMixin.manager.shutdown() - #del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool + del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool def main(): test_main(unittest.TextTestRunner(verbosity=2).run) Modified: python/branches/py3k/Lib/test/test_pydoc.py ============================================================================== --- python/branches/py3k/Lib/test/test_pydoc.py (original) +++ python/branches/py3k/Lib/test/test_pydoc.py Wed Jul 2 22:22:54 2008 @@ -66,7 +66,6 @@ DATA __author__ = 'Benjamin Peterson' __credits__ = 'Nobody' - __package__ = None __version__ = '1.2.3.4' VERSION @@ -163,7 +162,6 @@         __author__ = 'Benjamin Peterson'
__credits__ = 'Nobody'
-__package__ = None
__version__ = '1.2.3.4'

Modified: python/branches/py3k/Misc/ACKS ============================================================================== --- python/branches/py3k/Misc/ACKS (original) +++ python/branches/py3k/Misc/ACKS Wed Jul 2 22:22:54 2008 @@ -87,6 +87,7 @@ Tom Bridgman Richard Brodie Daniel Brotsky +Jean Brouwers Gary S. Brown Oleg Broytmann Dave Brueck Modified: python/branches/py3k/Objects/dictobject.c ============================================================================== --- python/branches/py3k/Objects/dictobject.c (original) +++ python/branches/py3k/Objects/dictobject.c Wed Jul 2 22:22:54 2008 @@ -1226,7 +1226,7 @@ PyObject *key; long hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) return NULL; while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Modified: python/branches/py3k/setup.py ============================================================================== --- python/branches/py3k/setup.py (original) +++ python/branches/py3k/setup.py Wed Jul 2 22:22:54 2008 @@ -1136,6 +1136,17 @@ HAVE_BROKEN_SEM_UNLINK=1 ) libraries = [] + + elif platform in ('freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'): + # FreeBSD's P1003.1b semaphore support is very experimental + # and has many known problems. (as of June 2008) + macros = dict( # FreeBSD + HAVE_SEM_OPEN=0, + HAVE_SEM_TIMEDWAIT=0, + HAVE_FD_TRANSFER=1, + ) + libraries = [] + else: # Linux and other unices macros = dict( HAVE_SEM_OPEN=1, From python-3000-checkins at python.org Wed Jul 2 22:50:16 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Wed, 2 Jul 2008 22:50:16 +0200 (CEST) Subject: [Python-3000-checkins] r64672 - in python/branches/py3k: Lib/test/test_re.py Lib/test/test_winreg.py Lib/test/test_zlib.py Modules/_bsddb.c Modules/_sre.c Modules/_ssl.c Modules/_threadmodule.c Modules/_tkinter.c Modules/parsermodule.c Modules/selectmodule.c Modules/zlibmodule.c PC/_subprocess.c PC/winreg.c Message-ID: <20080702205016.D198E1E400A@bag.python.org> Author: amaury.forgeotdarc Date: Wed Jul 2 22:50:16 2008 New Revision: 64672 Log: #3247 Get rid of Py_FindMethod; use tp_members instead. Otherwise dir(_sre.SRE_Match) returns an empty list. First step: handle most occurrences, remove tp_getattr and fill the tp_methods and tp_members slots. Add some test about attribute access. Modified: python/branches/py3k/Lib/test/test_re.py python/branches/py3k/Lib/test/test_winreg.py python/branches/py3k/Lib/test/test_zlib.py python/branches/py3k/Modules/_bsddb.c python/branches/py3k/Modules/_sre.c python/branches/py3k/Modules/_ssl.c python/branches/py3k/Modules/_threadmodule.c python/branches/py3k/Modules/_tkinter.c python/branches/py3k/Modules/parsermodule.c python/branches/py3k/Modules/selectmodule.c python/branches/py3k/Modules/zlibmodule.c python/branches/py3k/PC/_subprocess.c python/branches/py3k/PC/winreg.c Modified: python/branches/py3k/Lib/test/test_re.py ============================================================================== --- python/branches/py3k/Lib/test/test_re.py (original) +++ python/branches/py3k/Lib/test/test_re.py Wed Jul 2 22:50:16 2008 @@ -326,6 +326,13 @@ self.assertNotEqual(re.match("^x{}$", "x{}"), None) def test_getattr(self): + self.assertEqual(re.compile("(?i)(a)(b)").pattern, "(?i)(a)(b)") + self.assertEqual(re.compile("(?i)(a)(b)").flags, re.I) + self.assertEqual(re.compile("(?i)(a)(b)").groups, 2) + self.assertEqual(re.compile("(?i)(a)(b)").groupindex, {}) + self.assertEqual(re.compile("(?i)(?Pa)(?Pb)").groupindex, + {'first': 1, 'other': 2}) + self.assertEqual(re.match("(a)", "a").pos, 0) self.assertEqual(re.match("(a)", "a").endpos, 1) self.assertEqual(re.match("(a)", "a").string, "a") Modified: python/branches/py3k/Lib/test/test_winreg.py ============================================================================== --- python/branches/py3k/Lib/test/test_winreg.py (original) +++ python/branches/py3k/Lib/test/test_winreg.py Wed Jul 2 22:50:16 2008 @@ -29,6 +29,7 @@ # Set the default value for this key. SetValue(root_key, test_key_name, REG_SZ, "Default value") key = CreateKey(root_key, test_key_name) + self.assert_(key.handle != 0) # Create a sub-key sub_key = CreateKey(key, subkeystr) # Give the sub-key some named values Modified: python/branches/py3k/Lib/test/test_zlib.py ============================================================================== --- python/branches/py3k/Lib/test/test_zlib.py (original) +++ python/branches/py3k/Lib/test/test_zlib.py Wed Jul 2 22:50:16 2008 @@ -161,6 +161,7 @@ self.assertEqual(b'', dco.unconsumed_tail, ######## "(A) uct should be b'': not %d long" % len(dco.unconsumed_tail)) + self.assertEqual(b'', dco.unused_data) if flush: bufs.append(dco.flush()) else: @@ -173,6 +174,7 @@ self.assertEqual(b'', dco.unconsumed_tail, ######## "(B) uct should be b'': not %d long" % len(dco.unconsumed_tail)) + self.assertEqual(b'', dco.unused_data) self.assertEqual(data, b''.join(bufs)) # Failure means: "decompressobj with init options failed" Modified: python/branches/py3k/Modules/_bsddb.c ============================================================================== --- python/branches/py3k/Modules/_bsddb.c (original) +++ python/branches/py3k/Modules/_bsddb.c Wed Jul 2 22:50:16 2008 @@ -5324,54 +5324,21 @@ }; #endif - -static PyObject* -DB_getattr(DBObject* self, char *name) -{ - return Py_FindMethod(DB_methods, (PyObject* )self, name); -} - - static PyObject* -DBEnv_getattr(DBEnvObject* self, char *name) +DBEnv_db_home_get(DBEnvObject* self) { - if (!strcmp(name, "db_home")) { - CHECK_ENV_NOT_CLOSED(self); - if (self->db_env->db_home == NULL) { - RETURN_NONE(); - } - return PyUnicode_FromString(self->db_env->db_home); + CHECK_ENV_NOT_CLOSED(self); + if (self->db_env->db_home == NULL) { + RETURN_NONE(); } - - return Py_FindMethod(DBEnv_methods, (PyObject* )self, name); + return PyUnicode_FromString(self->db_env->db_home); } +static PyGetSetDef DBEnv_getsets[] = { + {"db_home", (getter)DBEnv_db_home_get, NULL,}, + {NULL} +}; -static PyObject* -DBCursor_getattr(DBCursorObject* self, char *name) -{ - return Py_FindMethod(DBCursor_methods, (PyObject* )self, name); -} - -static PyObject* -DBTxn_getattr(DBTxnObject* self, char *name) -{ - return Py_FindMethod(DBTxn_methods, (PyObject* )self, name); -} - -static PyObject* -DBLock_getattr(DBLockObject* self, char *name) -{ - return NULL; -} - -#if (DBVER >= 43) -static PyObject* -DBSequence_getattr(DBSequenceObject* self, char *name) -{ - return Py_FindMethod(DBSequence_methods, (PyObject* )self, name); -} -#endif static PyTypeObject DB_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -5381,8 +5348,8 @@ /* methods */ (destructor)DB_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DB_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ @@ -5400,6 +5367,9 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(DBObject, in_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DB_methods, /* tp_methods */ }; @@ -5411,7 +5381,7 @@ /* methods */ (destructor)DBCursor_dealloc,/*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DBCursor_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -5430,6 +5400,9 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(DBCursorObject, in_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DBCursor_methods, /* tp_methods */ }; @@ -5441,7 +5414,7 @@ /* methods */ (destructor)DBEnv_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DBEnv_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -5460,6 +5433,11 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(DBEnvObject, in_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DBEnv_methods, /* tp_methods */ + 0, /* tp_members */ + DBEnv_getsets, /* tp_getsets */ }; static PyTypeObject DBTxn_Type = { @@ -5470,8 +5448,8 @@ /* methods */ (destructor)DBTxn_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DBTxn_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ @@ -5489,6 +5467,9 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(DBTxnObject, in_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DBTxn_methods, /* tp_methods */ }; @@ -5500,8 +5481,8 @@ /* methods */ (destructor)DBLock_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DBLock_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ @@ -5530,7 +5511,7 @@ /* methods */ (destructor)DBSequence_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)DBSequence_getattr,/*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -5549,6 +5530,9 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(DBSequenceObject, in_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DBSequence_methods, /* tp_methods */ }; #endif @@ -5668,16 +5652,21 @@ PyObject* svnid_s = PyUnicode_FromString(svn_id); PyObject* py_api; - /* Initialize the type of the new type objects here; doing it here - is required for portability to Windows without requiring C++. */ - Py_TYPE(&DB_Type) = &PyType_Type; - Py_TYPE(&DBCursor_Type) = &PyType_Type; - Py_TYPE(&DBEnv_Type) = &PyType_Type; - Py_TYPE(&DBTxn_Type) = &PyType_Type; - Py_TYPE(&DBLock_Type) = &PyType_Type; -#if (DBVER >= 43) - Py_TYPE(&DBSequence_Type) = &PyType_Type; -#endif + /* Initialize object types */ + if (PyType_Ready(&DB_Type) < 0) + return NULL; + if (PyType_Ready(&DBCursor_Type) < 0) + return NULL; + if (PyType_Ready(&DBEnv_Type) < 0) + return NULL; + if (PyType_Ready(&DBTxn_Type) < 0) + return NULL; + if (PyType_Ready(&DBLock_Type) < 0) + return NULL; +#if (DBVER >= 43) + if (PyType_Ready(&DBSequence_Type) < 0) + return NULL; +#endif #if defined(WITH_THREAD) && !defined(MYDB_USE_GILSTATE) Modified: python/branches/py3k/Modules/_sre.c ============================================================================== --- python/branches/py3k/Modules/_sre.c (original) +++ python/branches/py3k/Modules/_sre.c Wed Jul 2 22:50:16 2008 @@ -2597,46 +2597,22 @@ {NULL, NULL} }; -static PyObject* -pattern_getattr(PatternObject* self, char* name) -{ - PyObject* res; - - res = Py_FindMethod(pattern_methods, (PyObject*) self, name); - - if (res) - return res; - - PyErr_Clear(); - - /* attributes */ - if (!strcmp(name, "pattern")) { - Py_INCREF(self->pattern); - return self->pattern; - } - - if (!strcmp(name, "flags")) - return Py_BuildValue("i", self->flags); - - if (!strcmp(name, "groups")) - return Py_BuildValue("i", self->groups); - - if (!strcmp(name, "groupindex") && self->groupindex) { - Py_INCREF(self->groupindex); - return self->groupindex; - } - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} +#define PAT_OFF(x) offsetof(PatternObject, x) +static PyMemberDef pattern_members[] = { + {"pattern", T_OBJECT, PAT_OFF(pattern), READONLY}, + {"flags", T_INT, PAT_OFF(flags), READONLY}, + {"groups", T_PYSSIZET, PAT_OFF(groups), READONLY}, + {"groupindex", T_OBJECT, PAT_OFF(groupindex), READONLY}, + {NULL} /* Sentinel */ +}; static PyTypeObject Pattern_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_" SRE_MODULE ".SRE_Pattern", sizeof(PatternObject), sizeof(SRE_CODE), - (destructor)pattern_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)pattern_getattr, /*tp_getattr*/ + (destructor)pattern_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ @@ -2655,6 +2631,10 @@ 0, /* tp_clear */ 0, /* tp_richcompare */ offsetof(PatternObject, weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + pattern_methods, /* tp_methods */ + pattern_members, /* tp_members */ }; static PyObject * @@ -3098,69 +3078,55 @@ {NULL, NULL} }; -static PyObject* -match_getattr(MatchObject* self, char* name) +static PyObject * +match_lastindex_get(MatchObject *self) { - PyObject* res; - - res = Py_FindMethod(match_methods, (PyObject*) self, name); - if (res) - return res; - - PyErr_Clear(); - - if (!strcmp(name, "lastindex")) { - if (self->lastindex >= 0) - return Py_BuildValue("i", self->lastindex); - Py_INCREF(Py_None); - return Py_None; - } - - if (!strcmp(name, "lastgroup")) { - if (self->pattern->indexgroup && self->lastindex >= 0) { - PyObject* result = PySequence_GetItem( - self->pattern->indexgroup, self->lastindex - ); - if (result) - return result; - PyErr_Clear(); - } - Py_INCREF(Py_None); - return Py_None; - } - - if (!strcmp(name, "string")) { - if (self->string) { - Py_INCREF(self->string); - return self->string; - } else { - Py_INCREF(Py_None); - return Py_None; - } - } - - if (!strcmp(name, "regs")) { - if (self->regs) { - Py_INCREF(self->regs); - return self->regs; - } else - return match_regs(self); - } + if (self->lastindex >= 0) + return Py_BuildValue("i", self->lastindex); + Py_INCREF(Py_None); + return Py_None; +} - if (!strcmp(name, "re")) { - Py_INCREF(self->pattern); - return (PyObject*) self->pattern; +static PyObject * +match_lastgroup_get(MatchObject *self) +{ + if (self->pattern->indexgroup && self->lastindex >= 0) { + PyObject* result = PySequence_GetItem( + self->pattern->indexgroup, self->lastindex + ); + if (result) + return result; + PyErr_Clear(); } + Py_INCREF(Py_None); + return Py_None; +} - if (!strcmp(name, "pos")) - return Py_BuildValue("i", self->pos); +static PyObject * +match_regs_get(MatchObject *self) +{ + if (self->regs) { + Py_INCREF(self->regs); + return self->regs; + } else + return match_regs(self); +} - if (!strcmp(name, "endpos")) - return Py_BuildValue("i", self->endpos); +static PyGetSetDef match_getset[] = { + {"lastindex", (getter)match_lastindex_get, (setter)NULL}, + {"lastgroup", (getter)match_lastgroup_get, (setter)NULL}, + {"regs", (getter)match_regs_get, (setter)NULL}, + {NULL} +}; - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} +#define MATCH_OFF(x) offsetof(MatchObject, x) +static PyMemberDef match_members[] = { + {"string", T_OBJECT, MATCH_OFF(string), READONLY}, + {"re", T_OBJECT, MATCH_OFF(pattern), READONLY}, + {"pos", T_PYSSIZET, MATCH_OFF(pos), READONLY}, + {"endpos", T_PYSSIZET, MATCH_OFF(endpos), READONLY}, + {NULL} +}; /* FIXME: implement setattr("string", None) as a special case (to detach the associated string, if any */ @@ -3169,9 +3135,32 @@ PyVarObject_HEAD_INIT(NULL,0) "_" SRE_MODULE ".SRE_Match", sizeof(MatchObject), sizeof(Py_ssize_t), - (destructor)match_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)match_getattr /*tp_getattr*/ + (destructor)match_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + match_methods, /* tp_methods */ + match_members, /* tp_members */ + match_getset, /* tp_getset */ }; static PyObject* @@ -3320,34 +3309,42 @@ {NULL, NULL} }; -static PyObject* -scanner_getattr(ScannerObject* self, char* name) -{ - PyObject* res; - - res = Py_FindMethod(scanner_methods, (PyObject*) self, name); - if (res) - return res; - - PyErr_Clear(); - - /* attributes */ - if (!strcmp(name, "pattern")) { - Py_INCREF(self->pattern); - return self->pattern; - } - - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} +#define SCAN_OFF(x) offsetof(ScannerObject, x) +static PyMemberDef scanner_members[] = { + {"pattern", T_OBJECT, SCAN_OFF(pattern), READONLY}, + {NULL} /* Sentinel */ +}; static PyTypeObject Scanner_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_" SRE_MODULE ".SRE_Scanner", sizeof(ScannerObject), 0, - (destructor)scanner_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)scanner_getattr, /*tp_getattr*/ + (destructor)scanner_dealloc,/* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + scanner_methods, /* tp_methods */ + scanner_members, /* tp_members */ + 0, /* tp_getset */ }; static PyObject* Modified: python/branches/py3k/Modules/_ssl.c ============================================================================== --- python/branches/py3k/Modules/_ssl.c (original) +++ python/branches/py3k/Modules/_ssl.c Wed Jul 2 22:50:16 2008 @@ -1384,11 +1384,6 @@ {NULL, NULL} }; -static PyObject *PySSL_getattr(PySSLObject *self, char *name) -{ - return Py_FindMethod(PySSLMethods, (PyObject *)self, name); -} - static PyTypeObject PySSL_Type = { PyVarObject_HEAD_INIT(NULL, 0) "ssl.SSLContext", /*tp_name*/ @@ -1397,7 +1392,7 @@ /* methods */ (destructor)PySSL_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PySSL_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -1405,6 +1400,20 @@ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + PySSLMethods, /*tp_methods*/ }; #ifdef HAVE_OPENSSL_RAND @@ -1581,7 +1590,8 @@ { PyObject *m, *d; - Py_TYPE(&PySSL_Type) = &PyType_Type; + if (PyType_Ready(&PySSL_Type) < 0) + return NULL; m = PyModule_Create(&_sslmodule); if (m == NULL) Modified: python/branches/py3k/Modules/_threadmodule.c ============================================================================== --- python/branches/py3k/Modules/_threadmodule.c (original) +++ python/branches/py3k/Modules/_threadmodule.c Wed Jul 2 22:50:16 2008 @@ -119,12 +119,6 @@ {NULL, NULL} /* sentinel */ }; -static PyObject * -lock_getattr(lockobject *self, char *name) -{ - return Py_FindMethod(lock_methods, (PyObject *)self, name); -} - static PyTypeObject Locktype = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "_thread.lock", /*tp_name*/ @@ -133,10 +127,28 @@ /* methods */ (destructor)lock_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)lock_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + lock_methods, /*tp_methods*/ }; static lockobject * Modified: python/branches/py3k/Modules/_tkinter.c ============================================================================== --- python/branches/py3k/Modules/_tkinter.c (original) +++ python/branches/py3k/Modules/_tkinter.c Wed Jul 2 22:50:16 2008 @@ -2327,12 +2327,6 @@ return PyUnicode_FromString(buf); } -static PyObject * -Tktt_GetAttr(PyObject *self, char *name) -{ - return Py_FindMethod(Tktt_methods, self, name); -} - static PyTypeObject Tktt_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -2341,7 +2335,7 @@ 0, /*tp_itemsize */ Tktt_Dealloc, /*tp_dealloc */ 0, /*tp_print */ - Tktt_GetAttr, /*tp_getattr */ + 0, /*tp_getattr */ 0, /*tp_setattr */ 0, /*tp_compare */ Tktt_Repr, /*tp_repr */ @@ -2349,6 +2343,20 @@ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + Tktt_methods, /*tp_methods*/ }; @@ -2671,12 +2679,6 @@ DisableEventHook(); } -static PyObject * -Tkapp_GetAttr(PyObject *self, char *name) -{ - return Py_FindMethod(Tkapp_methods, self, name); -} - static PyTypeObject Tkapp_Type = { PyVarObject_HEAD_INIT(NULL, 0) @@ -2685,7 +2687,7 @@ 0, /*tp_itemsize */ Tkapp_Dealloc, /*tp_dealloc */ 0, /*tp_print */ - Tkapp_GetAttr, /*tp_getattr */ + 0, /*tp_getattr */ 0, /*tp_setattr */ 0, /*tp_compare */ 0, /*tp_repr */ @@ -2693,6 +2695,20 @@ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + Tkapp_methods, /*tp_methods*/ }; @@ -3026,7 +3042,8 @@ { PyObject *m, *d, *uexe, *cexe; - Py_TYPE(&Tkapp_Type) = &PyType_Type; + if (PyType_Ready(&Tkapp_Type) < 0) + return NULL; #ifdef WITH_THREAD tcl_lock = PyThread_allocate_lock(); @@ -3054,7 +3071,8 @@ PyDict_SetItemString(d, "TkappType", (PyObject *)&Tkapp_Type); - Py_TYPE(&Tktt_Type) = &PyType_Type; + if (PyType_Ready(&Tktt_Type) < 0) + return NULL; PyDict_SetItemString(d, "TkttType", (PyObject *)&Tktt_Type); Py_TYPE(&PyTclObject_Type) = &PyType_Type; Modified: python/branches/py3k/Modules/parsermodule.c ============================================================================== --- python/branches/py3k/Modules/parsermodule.c (original) +++ python/branches/py3k/Modules/parsermodule.c Wed Jul 2 22:50:16 2008 @@ -161,8 +161,28 @@ static void parser_free(PyST_Object *st); static int parser_compare(PyST_Object *left, PyST_Object *right); -static PyObject *parser_getattr(PyObject *self, char *name); +static PyObject* parser_compilest(PyST_Object *, PyObject *, PyObject *); +static PyObject* parser_isexpr(PyST_Object *, PyObject *, PyObject *); +static PyObject* parser_issuite(PyST_Object *, PyObject *, PyObject *); +static PyObject* parser_st2list(PyST_Object *, PyObject *, PyObject *); +static PyObject* parser_st2tuple(PyST_Object *, PyObject *, PyObject *); +#define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) + +static PyMethodDef parser_methods[] = { + {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, + PyDoc_STR("Compile this ST object into a code object.")}, + {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, + PyDoc_STR("Determines if this ST object was created from an expression.")}, + {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, + PyDoc_STR("Determines if this ST object was created from a suite.")}, + {"tolist", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, + PyDoc_STR("Creates a list-tree representation of this ST.")}, + {"totuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, + PyDoc_STR("Creates a tuple-tree representation of this ST.")}, + + {NULL, NULL, 0, NULL} +}; static PyTypeObject PyST_Type = { @@ -172,7 +192,7 @@ 0, /* tp_itemsize */ (destructor)parser_free, /* tp_dealloc */ 0, /* tp_print */ - parser_getattr, /* tp_getattr */ + 0, /* tp_getattr */ 0, /* tp_setattr */ (cmpfunc)parser_compare, /* tp_compare */ 0, /* tp_repr */ @@ -191,7 +211,14 @@ Py_TPFLAGS_DEFAULT, /* tp_flags */ /* __doc__ */ - "Intermediate representation of a Python parse tree." + "Intermediate representation of a Python parse tree.", + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + parser_methods, /* tp_methods */ }; /* PyST_Type */ @@ -450,32 +477,6 @@ } -#define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) - -static PyMethodDef -parser_methods[] = { - {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, - PyDoc_STR("Compile this ST object into a code object.")}, - {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, - PyDoc_STR("Determines if this ST object was created from an expression.")}, - {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, - PyDoc_STR("Determines if this ST object was created from a suite.")}, - {"tolist", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a list-tree representation of this ST.")}, - {"totuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a tuple-tree representation of this ST.")}, - - {NULL, NULL, 0, NULL} -}; - - -static PyObject* -parser_getattr(PyObject *self, char *name) -{ - return (Py_FindMethod(parser_methods, self, name)); -} - - /* err_string(char* message) * * Sets the error string for an exception of type ParserError. @@ -3067,7 +3068,8 @@ { PyObject *module, *copyreg; - Py_TYPE(&PyST_Type) = &PyType_Type; + if (PyType_Ready(&PyST_Type) < 0) + return NULL; module = PyModule_Create(&parsermodule); if (module == NULL) return NULL; Modified: python/branches/py3k/Modules/selectmodule.c ============================================================================== --- python/branches/py3k/Modules/selectmodule.c (original) +++ python/branches/py3k/Modules/selectmodule.c Wed Jul 2 22:50:16 2008 @@ -625,12 +625,6 @@ PyObject_Del(self); } -static PyObject * -poll_getattr(pollObject *self, char *name) -{ - return Py_FindMethod(poll_methods, (PyObject *)self, name); -} - static PyTypeObject poll_Type = { /* The ob_type field must be initialized in the module init function * to be portable to Windows without using C++. */ @@ -641,7 +635,7 @@ /* methods */ (destructor)poll_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)poll_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -649,6 +643,20 @@ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + poll_methods, /*tp_methods*/ }; PyDoc_STRVAR(poll_doc, @@ -1764,7 +1772,8 @@ #else { #endif - Py_TYPE(&poll_Type) = &PyType_Type; + if (PyType_Ready(&poll_Type) < 0) + return NULL; PyModule_AddIntConstant(m, "POLLIN", POLLIN); PyModule_AddIntConstant(m, "POLLPRI", POLLPRI); PyModule_AddIntConstant(m, "POLLOUT", POLLOUT); Modified: python/branches/py3k/Modules/zlibmodule.c ============================================================================== --- python/branches/py3k/Modules/zlibmodule.c (original) +++ python/branches/py3k/Modules/zlibmodule.c Wed Jul 2 22:50:16 2008 @@ -5,6 +5,7 @@ #include "Python.h" +#include "structmember.h" #include "zlib.h" #ifdef WITH_THREAD @@ -879,35 +880,12 @@ {NULL, NULL} }; -static PyObject * -Comp_getattr(compobject *self, char *name) -{ - /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch - internal data. */ - - return Py_FindMethod(comp_methods, (PyObject *)self, name); -} - -static PyObject * -Decomp_getattr(compobject *self, char *name) -{ - PyObject * retval; - - ENTER_ZLIB - - if (strcmp(name, "unused_data") == 0) { - Py_INCREF(self->unused_data); - retval = self->unused_data; - } else if (strcmp(name, "unconsumed_tail") == 0) { - Py_INCREF(self->unconsumed_tail); - retval = self->unconsumed_tail; - } else - retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name); - - LEAVE_ZLIB - - return retval; -} +#define COMP_OFF(x) offsetof(compobject, x) +static PyMemberDef Decomp_members[] = { + {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY}, + {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY}, + {NULL}, +}; PyDoc_STRVAR(adler32__doc__, "adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n" @@ -972,13 +950,28 @@ 0, (destructor)Comp_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Comp_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + comp_methods, /*tp_methods*/ }; static PyTypeObject Decomptype = { @@ -988,13 +981,29 @@ 0, (destructor)Decomp_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Decomp_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + Decomp_methods, /*tp_methods*/ + Decomp_members, /*tp_members*/ }; PyDoc_STRVAR(zlib_module_documentation, @@ -1028,8 +1037,10 @@ PyInit_zlib(void) { PyObject *m, *ver; - Py_TYPE(&Comptype) = &PyType_Type; - Py_TYPE(&Decomptype) = &PyType_Type; + if (PyType_Ready(&Comptype) < 0) + return NULL; + if (PyType_Ready(&Decomptype) < 0) + return NULL; m = PyModule_Create(&zlibmodule); if (m == NULL) return NULL; Modified: python/branches/py3k/PC/_subprocess.c ============================================================================== --- python/branches/py3k/PC/_subprocess.c (original) +++ python/branches/py3k/PC/_subprocess.c Wed Jul 2 22:50:16 2008 @@ -111,12 +111,6 @@ }; static PyObject* -sp_handle_getattr(sp_handle_object* self, char* name) -{ - return Py_FindMethod(sp_handle_methods, (PyObject*) self, name); -} - -static PyObject* sp_handle_as_int(sp_handle_object* self) { return PyLong_FromLong((long) self->handle); @@ -129,14 +123,28 @@ "_subprocess_handle", sizeof(sp_handle_object), 0, (destructor) sp_handle_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc) sp_handle_getattr,/*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ &sp_handle_as_number, /*tp_as_number */ 0, /*tp_as_sequence */ 0, /*tp_as_mapping */ - 0 /*tp_hash*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + sp_handle_methods, /*tp_methods*/ }; /* -------------------------------------------------------------------- */ @@ -560,8 +568,9 @@ PyObject *m; /* patch up object descriptors */ - Py_TYPE(&sp_handle_type) = &PyType_Type; sp_handle_as_number.nb_int = (unaryfunc) sp_handle_as_int; + if (PyType_Ready(&sp_handle_type) < 0) + return NULL; m = PyModule_Create(&_subprocessmodule); if (m == NULL) Modified: python/branches/py3k/PC/winreg.c ============================================================================== --- python/branches/py3k/PC/winreg.c (original) +++ python/branches/py3k/PC/winreg.c Wed Jul 2 22:50:16 2008 @@ -455,9 +455,24 @@ PyHKEY_unaryFailureFunc, /* nb_float */ }; +static PyObject *PyHKEY_CloseMethod(PyObject *self, PyObject *args); +static PyObject *PyHKEY_DetachMethod(PyObject *self, PyObject *args); +static PyObject *PyHKEY_Enter(PyObject *self); +static PyObject *PyHKEY_Exit(PyObject *self, PyObject *args); -/* fwd declare __getattr__ */ -static PyObject *PyHKEY_getattr(PyObject *self, const char *name); +static struct PyMethodDef PyHKEY_methods[] = { + {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc}, + {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc}, + {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL}, + {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL}, + {NULL} +}; + +#define OFF(e) offsetof(PyHKEYObject, e) +static PyMemberDef PyHKEY_memberlist[] = { + {"handle", T_INT, OFF(hkey), READONLY}, + {NULL} /* Sentinel */ +}; /* The type itself */ PyTypeObject PyHKEY_Type = @@ -468,7 +483,7 @@ 0, PyHKEY_deallocFunc, /* tp_dealloc */ 0, /* tp_print */ - PyHKEY_getattr, /* tp_getattr */ + 0, /* tp_getattr */ 0, /* tp_setattr */ PyHKEY_compareFunc, /* tp_compare */ 0, /* tp_repr */ @@ -483,13 +498,14 @@ 0, /* tp_as_buffer */ 0, /* tp_flags */ PyHKEY_doc, /* tp_doc */ -}; - -#define OFF(e) offsetof(PyHKEYObject, e) - -static PyMemberDef PyHKEY_memberlist[] = { - {"handle", T_INT, OFF(hkey), READONLY}, - {NULL} /* Sentinel */ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + PyHKEY_methods, /*tp_methods*/ + PyHKEY_memberlist, /*tp_members*/ }; /************************************************************************ @@ -536,31 +552,6 @@ } -static struct PyMethodDef PyHKEY_methods[] = { - {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc}, - {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc}, - {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL}, - {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL}, - {NULL} -}; - -/*static*/ PyObject * -PyHKEY_getattr(PyObject *self, const char *name) -{ - PyObject *res; - - res = Py_FindMethod(PyHKEY_methods, self, name); - if (res != NULL) - return res; - PyErr_Clear(); - if (strcmp(name, "handle") == 0) - return PyLong_FromVoidPtr(((PyHKEYObject *)self)->hkey); - PyErr_Format(PyExc_AttributeError, - "'%.50s' object has no attribute '%.400s'", - Py_TYPE(self)->tp_name, name); - return NULL; -} - /************************************************************************ The public PyHKEY API (well, not public yet :-) ************************************************************************/ @@ -1582,8 +1573,9 @@ if (m == NULL) return NULL; d = PyModule_GetDict(m); - Py_TYPE(&PyHKEY_Type) = &PyType_Type; PyHKEY_Type.tp_doc = PyHKEY_doc; + if (PyType_Ready(&PyHKEY_Type) < 0) + return NULL; Py_INCREF(&PyHKEY_Type); if (PyDict_SetItemString(d, "HKEYType", (PyObject *)&PyHKEY_Type) != 0) From python-3000-checkins at python.org Wed Jul 2 23:41:01 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Wed, 2 Jul 2008 23:41:01 +0200 (CEST) Subject: [Python-3000-checkins] r64674 - in python/branches/py3k: Include/methodobject.h Modules/_elementtree.c Modules/pyexpat.c Objects/methodobject.c Message-ID: <20080702214101.B7F0F1E400A@bag.python.org> Author: amaury.forgeotdarc Date: Wed Jul 2 23:41:01 2008 New Revision: 64674 Log: #3247: Get rid of Py_FindMethod: Second step: keep tp_getattr functions when they are complex, but use PyObject_GenericGetAttr() as a fallback. These were the last occurrences of Py_FindMethod. Modified: python/branches/py3k/Include/methodobject.h python/branches/py3k/Modules/_elementtree.c python/branches/py3k/Modules/pyexpat.c python/branches/py3k/Objects/methodobject.c Modified: python/branches/py3k/Include/methodobject.h ============================================================================== --- python/branches/py3k/Include/methodobject.h (original) +++ python/branches/py3k/Include/methodobject.h Wed Jul 2 23:41:01 2008 @@ -43,8 +43,6 @@ }; typedef struct PyMethodDef PyMethodDef; -PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); - #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); @@ -70,14 +68,6 @@ #define METH_COEXIST 0x0040 -typedef struct PyMethodChain { - PyMethodDef *methods; /* Methods of this type */ - struct PyMethodChain *link; /* NULL or base type */ -} PyMethodChain; - -PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, - const char *); - typedef struct { PyObject_HEAD PyMethodDef *m_ml; /* Description of the C function to call */ Modified: python/branches/py3k/Modules/_elementtree.c ============================================================================== --- python/branches/py3k/Modules/_elementtree.c (original) +++ python/branches/py3k/Modules/_elementtree.c Wed Jul 2 23:41:01 2008 @@ -1297,15 +1297,13 @@ }; static PyObject* -element_getattr(ElementObject* self, char* name) +element_getattro(ElementObject* self, PyObject* nameobj) { PyObject* res; + char *name = ""; - res = Py_FindMethod(element_methods, (PyObject*) self, name); - if (res) - return res; - - PyErr_Clear(); + if (PyUnicode_Check(nameobj)) + name = PyUnicode_AsString(nameobj); if (strcmp(name, "tag") == 0) res = self->tag; @@ -1318,14 +1316,10 @@ element_new_extra(self, NULL); res = element_get_attrib(self); } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; + return PyObject_GenericGetAttr((PyObject*) self, nameobj); } - if (!res) - return NULL; - - Py_INCREF(res); + Py_XINCREF(res); return res; } @@ -1382,12 +1376,29 @@ /* methods */ (destructor)element_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)element_getattr, /* tp_getattr */ + 0, /* tp_getattr */ (setattrfunc)element_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)element_repr, /* tp_repr */ 0, /* tp_as_number */ &element_as_sequence, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + (getattrofunc)element_getattro, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + element_methods, /* tp_methods */ + 0, /* tp_members */ }; /* ==================================================================== */ @@ -1783,19 +1794,35 @@ {NULL, NULL} }; -static PyObject* -treebuilder_getattr(TreeBuilderObject* self, char* name) -{ - return Py_FindMethod(treebuilder_methods, (PyObject*) self, name); -} - static PyTypeObject TreeBuilder_Type = { PyVarObject_HEAD_INIT(NULL, 0) "TreeBuilder", sizeof(TreeBuilderObject), 0, /* methods */ (destructor)treebuilder_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)treebuilder_getattr, /* tp_getattr */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + treebuilder_methods, /* tp_methods */ + 0, /* tp_members */ }; /* ==================================================================== */ @@ -2496,13 +2523,13 @@ }; static PyObject* -xmlparser_getattr(XMLParserObject* self, char* name) +xmlparser_getattro(XMLParserObject* self, PyObject* nameobj) { PyObject* res; + char *name = ""; - res = Py_FindMethod(xmlparser_methods, (PyObject*) self, name); - if (res) - return res; + if (PyUnicode_Check(nameobj)) + name = PyUnicode_AsString(nameobj); PyErr_Clear(); @@ -2516,8 +2543,7 @@ XML_MINOR_VERSION, XML_MICRO_VERSION); return PyBytes_FromString(buffer); } else { - PyErr_SetString(PyExc_AttributeError, name); - return NULL; + return PyObject_GenericGetAttr((PyObject*) self, nameobj); } Py_INCREF(res); @@ -2530,7 +2556,29 @@ /* methods */ (destructor)xmlparser_dealloc, /* tp_dealloc */ 0, /* tp_print */ - (getattrfunc)xmlparser_getattr, /* tp_getattr */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + (getattrofunc)xmlparser_getattro, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + xmlparser_methods, /* tp_methods */ + 0, /* tp_members */ }; #endif @@ -2572,10 +2620,14 @@ struct PyExpat_CAPI* capi; #endif - /* Patch object type */ - Py_TYPE(&Element_Type) = Py_TYPE(&TreeBuilder_Type) = &PyType_Type; + /* Initialize object types */ + if (PyType_Ready(&TreeBuilder_Type) < 0) + return NULL; + if (PyType_Ready(&Element_Type) < 0) + return NULL; #if defined(USE_EXPAT) - Py_TYPE(&XMLParser_Type) = &PyType_Type; + if (PyType_Ready(&XMLParser_Type) < 0) + return NULL; #endif m = PyModule_Create(&_elementtreemodule); Modified: python/branches/py3k/Modules/pyexpat.c ============================================================================== --- python/branches/py3k/Modules/pyexpat.c (original) +++ python/branches/py3k/Modules/pyexpat.c Wed Jul 2 23:41:01 2008 @@ -1135,6 +1135,8 @@ } #endif +static PyObject *xmlparse_dir(PyObject *self, PyObject* noargs); + static struct PyMethodDef xmlparse_methods[] = { {"Parse", (PyCFunction)xmlparse_Parse, METH_VARARGS, xmlparse_Parse__doc__}, @@ -1154,6 +1156,7 @@ {"UseForeignDTD", (PyCFunction)xmlparse_UseForeignDTD, METH_VARARGS, xmlparse_UseForeignDTD__doc__}, #endif + {"__dir__", xmlparse_dir, METH_NOARGS}, {NULL, NULL} /* sentinel */ }; @@ -1329,9 +1332,15 @@ } static PyObject * -xmlparse_getattr(xmlparseobject *self, char *name) +xmlparse_getattro(xmlparseobject *self, PyObject *nameobj) { - int handlernum = handlername2int(name); + char *name = ""; + int handlernum = -1; + + if (PyUnicode_Check(nameobj)) + name = PyUnicode_AsString(nameobj); + + handlernum = handlername2int(name); if (handlernum != -1) { PyObject *result = self->handlers[handlernum]; @@ -1390,7 +1399,7 @@ } } - return Py_FindMethod(xmlparse_methods, (PyObject *)self, name); + return PyObject_GenericGetAttr((PyObject*)self, nameobj); } static PyObject * @@ -1603,11 +1612,6 @@ PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser"); -static PyMethodDef xmlparse_tp_methods[] = { - {"__dir__", xmlparse_dir, METH_NOARGS}, - {NULL, NULL} /* sentinel */ -}; - static PyTypeObject Xmlparsetype = { PyVarObject_HEAD_INIT(NULL, 0) "pyexpat.xmlparser", /*tp_name*/ @@ -1616,7 +1620,7 @@ /* methods */ (destructor)xmlparse_dealloc, /*tp_dealloc*/ (printfunc)0, /*tp_print*/ - (getattrfunc)xmlparse_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ (setattrfunc)xmlparse_setattr, /*tp_setattr*/ (cmpfunc)0, /*tp_compare*/ (reprfunc)0, /*tp_repr*/ @@ -1626,7 +1630,7 @@ (hashfunc)0, /*tp_hash*/ (ternaryfunc)0, /*tp_call*/ (reprfunc)0, /*tp_str*/ - 0, /* tp_getattro */ + (getattrofunc)xmlparse_getattro, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ #ifdef Py_TPFLAGS_HAVE_GC @@ -1641,7 +1645,7 @@ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - xmlparse_tp_methods /* tp_methods */ + xmlparse_methods, /* tp_methods */ }; /* End of code for xmlparser objects */ @@ -1794,7 +1798,8 @@ if (modelmod_name == NULL) return NULL; - Py_TYPE(&Xmlparsetype) = &PyType_Type; + if (PyType_Ready(&Xmlparsetype) < 0) + return NULL; /* Create the module and add the functions */ m = PyModule_Create(&pyexpatmodule); Modified: python/branches/py3k/Objects/methodobject.c ============================================================================== --- python/branches/py3k/Objects/methodobject.c (original) +++ python/branches/py3k/Objects/methodobject.c Wed Jul 2 23:41:01 2008 @@ -280,43 +280,6 @@ 0, /* tp_dict */ }; -/* Find a method in a method chain */ - -PyObject * -Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name) -{ - if (name[0] == '_' && name[1] == '_') { - if (strcmp(name, "__doc__") == 0) { - const char *doc = self->ob_type->tp_doc; - if (doc != NULL) - return PyUnicode_FromString(doc); - } - } - while (chain != NULL) { - PyMethodDef *ml = chain->methods; - for (; ml->ml_name != NULL; ml++) { - if (name[0] == ml->ml_name[0] && - strcmp(name+1, ml->ml_name+1) == 0) - /* XXX */ - return PyCFunction_New(ml, self); - } - chain = chain->link; - } - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -/* Find a method in a single method list */ - -PyObject * -Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name) -{ - PyMethodChain chain; - chain.methods = methods; - chain.link = NULL; - return Py_FindMethodInChain(&chain, self, name); -} - /* Clear out the free list */ int From python-3000-checkins at python.org Wed Jul 2 23:47:18 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Wed, 2 Jul 2008 23:47:18 +0200 (CEST) Subject: [Python-3000-checkins] r64676 - in python/branches/py3k: Include/methodobject.h Objects/methodobject.c Message-ID: <20080702214718.C8DF01E400A@bag.python.org> Author: amaury.forgeotdarc Date: Wed Jul 2 23:47:18 2008 New Revision: 64676 Log: Oops, forgot that there are modules outside the win32 world. Modified: python/branches/py3k/Include/methodobject.h python/branches/py3k/Objects/methodobject.c Modified: python/branches/py3k/Include/methodobject.h ============================================================================== --- python/branches/py3k/Include/methodobject.h (original) +++ python/branches/py3k/Include/methodobject.h Wed Jul 2 23:47:18 2008 @@ -43,6 +43,8 @@ }; typedef struct PyMethodDef PyMethodDef; +PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); + #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); @@ -68,6 +70,14 @@ #define METH_COEXIST 0x0040 +typedef struct PyMethodChain { + PyMethodDef *methods; /* Methods of this type */ + struct PyMethodChain *link; /* NULL or base type */ +} PyMethodChain; + +PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, + const char *); + typedef struct { PyObject_HEAD PyMethodDef *m_ml; /* Description of the C function to call */ Modified: python/branches/py3k/Objects/methodobject.c ============================================================================== --- python/branches/py3k/Objects/methodobject.c (original) +++ python/branches/py3k/Objects/methodobject.c Wed Jul 2 23:47:18 2008 @@ -280,6 +280,43 @@ 0, /* tp_dict */ }; +/* Find a method in a method chain */ + +PyObject * +Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name) +{ + if (name[0] == '_' && name[1] == '_') { + if (strcmp(name, "__doc__") == 0) { + const char *doc = self->ob_type->tp_doc; + if (doc != NULL) + return PyUnicode_FromString(doc); + } + } + while (chain != NULL) { + PyMethodDef *ml = chain->methods; + for (; ml->ml_name != NULL; ml++) { + if (name[0] == ml->ml_name[0] && + strcmp(name+1, ml->ml_name+1) == 0) + /* XXX */ + return PyCFunction_New(ml, self); + } + chain = chain->link; + } + PyErr_SetString(PyExc_AttributeError, name); + return NULL; +} + +/* Find a method in a single method list */ + +PyObject * +Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name) +{ + PyMethodChain chain; + chain.methods = methods; + chain.link = NULL; + return Py_FindMethodInChain(&chain, self, name); +} + /* Clear out the free list */ int From python-3000-checkins at python.org Thu Jul 3 00:06:13 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Thu, 3 Jul 2008 00:06:13 +0200 (CEST) Subject: [Python-3000-checkins] r64678 - python/branches/py3k Message-ID: <20080702220613.05F661E400A@bag.python.org> Author: brett.cannon Date: Thu Jul 3 00:06:12 2008 New Revision: 64678 Log: Merged revisions 64677 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64677 | brett.cannon | 2008-07-02 14:52:42 -0700 (Wed, 02 Jul 2008) | 2 lines Revert r64673 and instead just change the file encoding. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 3 00:07:22 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Thu, 3 Jul 2008 00:07:22 +0200 (CEST) Subject: [Python-3000-checkins] r64679 - python/branches/py3k Message-ID: <20080702220722.C0C481E4018@bag.python.org> Author: brett.cannon Date: Thu Jul 3 00:07:22 2008 New Revision: 64679 Log: Block r64673. Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 3 00:38:48 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Thu, 3 Jul 2008 00:38:48 +0200 (CEST) Subject: [Python-3000-checkins] r64681 - in python/branches/py3k: Include/methodobject.h Modules/_curses_panel.c Modules/_cursesmodule.c Modules/_dbmmodule.c Modules/_gdbmmodule.c Modules/ossaudiodev.c Modules/xxmodule.c Objects/methodobject.c Message-ID: <20080702223848.89EA21E400A@bag.python.org> Author: amaury.forgeotdarc Date: Thu Jul 3 00:38:47 2008 New Revision: 64681 Log: #3247: get rid of Py_FindMethod Third step: unix-only modules. Really remove the function this time. Modified: python/branches/py3k/Include/methodobject.h python/branches/py3k/Modules/_curses_panel.c python/branches/py3k/Modules/_cursesmodule.c python/branches/py3k/Modules/_dbmmodule.c python/branches/py3k/Modules/_gdbmmodule.c python/branches/py3k/Modules/ossaudiodev.c python/branches/py3k/Modules/xxmodule.c python/branches/py3k/Objects/methodobject.c Modified: python/branches/py3k/Include/methodobject.h ============================================================================== --- python/branches/py3k/Include/methodobject.h (original) +++ python/branches/py3k/Include/methodobject.h Thu Jul 3 00:38:47 2008 @@ -43,8 +43,6 @@ }; typedef struct PyMethodDef PyMethodDef; -PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *); - #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); @@ -70,14 +68,6 @@ #define METH_COEXIST 0x0040 -typedef struct PyMethodChain { - PyMethodDef *methods; /* Methods of this type */ - struct PyMethodChain *link; /* NULL or base type */ -} PyMethodChain; - -PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *, - const char *); - typedef struct { PyObject_HEAD PyMethodDef *m_ml; /* Description of the C function to call */ Modified: python/branches/py3k/Modules/_curses_panel.c ============================================================================== --- python/branches/py3k/Modules/_curses_panel.c (original) +++ python/branches/py3k/Modules/_curses_panel.c Thu Jul 3 00:38:47 2008 @@ -329,12 +329,6 @@ {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) -{ - return Py_FindMethod(PyCursesPanel_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { @@ -345,14 +339,28 @@ /* methods */ (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PyCursesPanel_GetAttr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + PyCursesPanel_Methods, /*tp_methods*/ }; /* Wrapper for panel_above(NULL). This function returns the bottom @@ -470,7 +478,8 @@ PyObject *m, *d, *v; /* Initialize object type */ - Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + if (PyType_Ready(&PyCursesPanel_Type) < 0) + return NULL; import_curses(); Modified: python/branches/py3k/Modules/_cursesmodule.c ============================================================================== --- python/branches/py3k/Modules/_cursesmodule.c (original) +++ python/branches/py3k/Modules/_cursesmodule.c Thu Jul 3 00:38:47 2008 @@ -1650,12 +1650,6 @@ {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name) -{ - return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesWindow_Type = { @@ -1666,14 +1660,28 @@ /* methods */ (destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ + (getattrfunc)0, /*tp_getattr*/ + (setattrfunc)0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + PyCursesWindow_Methods, /*tp_methods*/ }; /********************************************************************* @@ -2792,7 +2800,8 @@ static void *PyCurses_API[PyCurses_API_pointers]; /* Initialize object type */ - Py_TYPE(&PyCursesWindow_Type) = &PyType_Type; + if (PyType_Ready(&PyCursesWindow_Type) < 0) + return NULL; /* Initialize the C API pointer array */ PyCurses_API[0] = (void *)&PyCursesWindow_Type; Modified: python/branches/py3k/Modules/_dbmmodule.c ============================================================================== --- python/branches/py3k/Modules/_dbmmodule.c (original) +++ python/branches/py3k/Modules/_dbmmodule.c Thu Jul 3 00:38:47 2008 @@ -324,12 +324,6 @@ {NULL, NULL} /* sentinel */ }; -static PyObject * -dbm_getattr(dbmobject *dp, char *name) -{ - return Py_FindMethod(dbm_methods, (PyObject *)dp, name); -} - static PyTypeObject Dbmtype = { PyVarObject_HEAD_INIT(NULL, 0) "_dbm.dbm", @@ -337,7 +331,7 @@ 0, (destructor)dbm_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)dbm_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -350,7 +344,15 @@ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_xxx4*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + dbm_methods, /*tp_methods*/ }; /* ----------------------------------------------------------------- */ Modified: python/branches/py3k/Modules/_gdbmmodule.c ============================================================================== --- python/branches/py3k/Modules/_gdbmmodule.c (original) +++ python/branches/py3k/Modules/_gdbmmodule.c Thu Jul 3 00:38:47 2008 @@ -381,12 +381,6 @@ {NULL, NULL} /* sentinel */ }; -static PyObject * -dbm_getattr(dbmobject *dp, char *name) -{ - return Py_FindMethod(dbm_methods, (PyObject *)dp, name); -} - static PyTypeObject Dbmtype = { PyVarObject_HEAD_INIT(0, 0) "_gdbm.gdbm", @@ -394,7 +388,7 @@ 0, (destructor)dbm_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)dbm_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -409,6 +403,13 @@ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_xxx4*/ gdbm_object__doc__, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + dbm_methods, /*tp_methods*/ }; /* ----------------------------------------------------------------- */ Modified: python/branches/py3k/Modules/ossaudiodev.c ============================================================================== --- python/branches/py3k/Modules/ossaudiodev.c (original) +++ python/branches/py3k/Modules/ossaudiodev.c Thu Jul 3 00:38:47 2008 @@ -803,9 +803,14 @@ }; static PyObject * -oss_getattr(oss_audio_t *self, char *name) +oss_getattro(oss_audio_t *self, PyObject *nameobj) { + char *name = ""; PyObject * rval = NULL; + + if (PyUnicode_Check(nameobj)) + name = PyUnicode_AsString(nameobj); + if (strcmp(name, "closed") == 0) { rval = (self->fd == -1) ? Py_True : Py_False; Py_INCREF(rval); @@ -829,17 +834,11 @@ } } else { - rval = Py_FindMethod(oss_methods, (PyObject *)self, name); + rval = PyObject_GenericGetAttr((PyObject *)self, nameobj); } return rval; } -static PyObject * -oss_mixer_getattr(oss_mixer_t *self, char *name) -{ - return Py_FindMethod(oss_mixer_methods, (PyObject *)self, name); -} - static PyTypeObject OSSAudioType = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "ossaudiodev.oss_audio_device", /*tp_name*/ @@ -848,10 +847,28 @@ /* methods */ (destructor)oss_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)oss_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + (getattrofunc)oss_getattro, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + oss_methods, /*tp_methods*/ }; static PyTypeObject OSSMixerType = { @@ -862,10 +879,28 @@ /* methods */ (destructor)oss_mixer_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)oss_mixer_getattr, /*tp_getattr*/ + 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + oss_mixer_methods, /*tp_methods*/ }; Modified: python/branches/py3k/Modules/xxmodule.c ============================================================================== --- python/branches/py3k/Modules/xxmodule.c (original) +++ python/branches/py3k/Modules/xxmodule.c Thu Jul 3 00:38:47 2008 @@ -63,16 +63,16 @@ }; static PyObject * -Xxo_getattr(XxoObject *self, char *name) +Xxo_getattro(XxoObject *self, PyObject *name) { if (self->x_attr != NULL) { - PyObject *v = PyDict_GetItemString(self->x_attr, name); + PyObject *v = PyDict_GetItem(self->x_attr, name); if (v != NULL) { Py_INCREF(v); return v; } } - return Py_FindMethod(Xxo_methods, (PyObject *)self, name); + return PyObject_GenericGetattr((PyObject *)self, name); } static int @@ -104,7 +104,7 @@ /* methods */ (destructor)Xxo_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ - (getattrfunc)Xxo_getattr, /*tp_getattr*/ + (getattrfunc)0, /*tp_getattr*/ (setattrfunc)Xxo_setattr, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ @@ -114,7 +114,7 @@ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ - 0, /*tp_getattro*/ + (getattrofunc)Xxo_getattro, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT, /*tp_flags*/ @@ -125,7 +125,7 @@ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ - 0, /*tp_methods*/ + Xxo_methods, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ Modified: python/branches/py3k/Objects/methodobject.c ============================================================================== --- python/branches/py3k/Objects/methodobject.c (original) +++ python/branches/py3k/Objects/methodobject.c Thu Jul 3 00:38:47 2008 @@ -280,43 +280,6 @@ 0, /* tp_dict */ }; -/* Find a method in a method chain */ - -PyObject * -Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name) -{ - if (name[0] == '_' && name[1] == '_') { - if (strcmp(name, "__doc__") == 0) { - const char *doc = self->ob_type->tp_doc; - if (doc != NULL) - return PyUnicode_FromString(doc); - } - } - while (chain != NULL) { - PyMethodDef *ml = chain->methods; - for (; ml->ml_name != NULL; ml++) { - if (name[0] == ml->ml_name[0] && - strcmp(name+1, ml->ml_name+1) == 0) - /* XXX */ - return PyCFunction_New(ml, self); - } - chain = chain->link; - } - PyErr_SetString(PyExc_AttributeError, name); - return NULL; -} - -/* Find a method in a single method list */ - -PyObject * -Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name) -{ - PyMethodChain chain; - chain.methods = methods; - chain.link = NULL; - return Py_FindMethodInChain(&chain, self, name); -} - /* Clear out the free list */ int From python-3000-checkins at python.org Thu Jul 3 00:59:48 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Thu, 3 Jul 2008 00:59:48 +0200 (CEST) Subject: [Python-3000-checkins] r64682 - in python/branches/py3k/Doc: c-api/structures.rst data/refcounts.dat extending/newtypes.rst Message-ID: <20080702225948.A8E811E400A@bag.python.org> Author: amaury.forgeotdarc Date: Thu Jul 3 00:59:48 2008 New Revision: 64682 Log: #3247: get rid of Py_FindMethods Remove references in documentation; also rewrite a paragraph that looked off-topic to me. Modified: python/branches/py3k/Doc/c-api/structures.rst python/branches/py3k/Doc/data/refcounts.dat python/branches/py3k/Doc/extending/newtypes.rst Modified: python/branches/py3k/Doc/c-api/structures.rst ============================================================================== --- python/branches/py3k/Doc/c-api/structures.rst (original) +++ python/branches/py3k/Doc/c-api/structures.rst Thu Jul 3 00:59:48 2008 @@ -198,9 +198,3 @@ object and will co-exist with the slot. This is helpful because calls to PyCFunctions are optimized more than wrapper object calls. - -.. cfunction:: PyObject* Py_FindMethod(PyMethodDef table[], PyObject *ob, char *name) - - Return a bound method object for an extension type implemented in C. This can - be useful in the implementation of a :attr:`tp_getattro` or :attr:`tp_getattr` - handler that does not use the :cfunc:`PyObject_GenericGetAttr` function. Modified: python/branches/py3k/Doc/data/refcounts.dat ============================================================================== --- python/branches/py3k/Doc/data/refcounts.dat (original) +++ python/branches/py3k/Doc/data/refcounts.dat Thu Jul 3 00:59:48 2008 @@ -1686,11 +1686,6 @@ Py_Finalize:void::: -Py_FindMethod:PyObject*::+1: -Py_FindMethod:PyMethodDef[]:methods:: -Py_FindMethod:PyObject*:self:+1: -Py_FindMethod:char*:name:: - Py_GetBuildInfoconst:char*::: Py_GetCompilerconst:char*::: Modified: python/branches/py3k/Doc/extending/newtypes.rst ============================================================================== --- python/branches/py3k/Doc/extending/newtypes.rst (original) +++ python/branches/py3k/Doc/extending/newtypes.rst Thu Jul 3 00:59:48 2008 @@ -1074,8 +1074,8 @@ getattrfunc tp_getattr; /* char * version */ setattrfunc tp_setattr; /* ... */ - getattrofunc tp_getattrofunc; /* PyObject * version */ - setattrofunc tp_setattrofunc; + getattrofunc tp_getattro; /* PyObject * version */ + setattrofunc tp_setattro; If accessing attributes of an object is always a simple operation (this will be explained shortly), there are generic implementations which can be used to @@ -1204,9 +1204,7 @@ type of the name parameter is the only difference between the :ctype:`char\*` and :ctype:`PyObject\*` flavors of the interface. This example effectively does the same thing as the generic example above, but does not use the generic -support added in Python 2.2. The value in showing this is two-fold: it -demonstrates how basic attribute management can be done in a way that is -portable to older versions of Python, and explains how the handler functions are +support added in Python 2.2. It explains how the handler functions are called, so that if you do need to extend their functionality, you'll understand what needs to be done. @@ -1214,27 +1212,20 @@ look-up. It is called in the same situations where the :meth:`__getattr__` method of a class would be called. -A likely way to handle this is (1) to implement a set of functions (such as -:cfunc:`newdatatype_getSize` and :cfunc:`newdatatype_setSize` in the example -below), (2) provide a method table listing these functions, and (3) provide a -getattr function that returns the result of a lookup in that table. The method -table uses the same structure as the :attr:`tp_methods` field of the type -object. - Here is an example:: - static PyMethodDef newdatatype_methods[] = { - {"getSize", (PyCFunction)newdatatype_getSize, METH_VARARGS, - "Return the current size."}, - {"setSize", (PyCFunction)newdatatype_setSize, METH_VARARGS, - "Set the size."}, - {NULL, NULL, 0, NULL} /* sentinel */ - }; - static PyObject * newdatatype_getattr(newdatatypeobject *obj, char *name) { - return Py_FindMethod(newdatatype_methods, (PyObject *)obj, name); + if (strcmp(name, "data") == 0) + { + return PyInt_FromLong(obj->data); + } + + PyErr_Format(PyExc_AttributeError, + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, name); + return NULL; } The :attr:`tp_setattr` handler is called when the :meth:`__setattr__` or From python-3000-checkins at python.org Thu Jul 3 01:02:21 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Thu, 3 Jul 2008 01:02:21 +0200 (CEST) Subject: [Python-3000-checkins] r64683 - python/branches/py3k/Misc/NEWS Message-ID: <20080702230221.D715F1E400A@bag.python.org> Author: amaury.forgeotdarc Date: Thu Jul 3 01:02:21 2008 New Revision: 64683 Log: Add a NEWS entry for Issue #3247. Modified: python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Thu Jul 3 01:02:21 2008 @@ -24,6 +24,12 @@ code of every single module of the standard library, including invalid files used in the test suite. +C API +----- + +- Issue #3247: the function Py_FindMethod was removed. Modern types should + use the tp_methods slot instead. + Tools/Demos ----------- From python-3000-checkins at python.org Thu Jul 3 01:22:30 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Thu, 3 Jul 2008 01:22:30 +0200 (CEST) Subject: [Python-3000-checkins] r64684 - python/branches/py3k/Modules/xxmodule.c Message-ID: <20080702232230.BEC761E400B@bag.python.org> Author: amaury.forgeotdarc Date: Thu Jul 3 01:22:30 2008 New Revision: 64684 Log: Correct a typo that breaks test_distutils Modified: python/branches/py3k/Modules/xxmodule.c Modified: python/branches/py3k/Modules/xxmodule.c ============================================================================== --- python/branches/py3k/Modules/xxmodule.c (original) +++ python/branches/py3k/Modules/xxmodule.c Thu Jul 3 01:22:30 2008 @@ -72,7 +72,7 @@ return v; } } - return PyObject_GenericGetattr((PyObject *)self, name); + return PyObject_GenericGetAttr((PyObject *)self, name); } static int From python-3000-checkins at python.org Thu Jul 3 01:44:19 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Thu, 3 Jul 2008 01:44:19 +0200 (CEST) Subject: [Python-3000-checkins] r64686 - in python/branches/py3k: Modules/nismodule.c Message-ID: <20080702234419.A25E21E400A@bag.python.org> Author: amaury.forgeotdarc Date: Thu Jul 3 01:44:19 2008 New Revision: 64686 Log: Merged revisions 64685 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64685 | amaury.forgeotdarc | 2008-07-03 01:40:28 +0200 (Thu, 03 Jul 2008) | 3 lines Try a blind fix to nismodule which fails on the solaris10 3.0 buildbot: the GIL must be re-acquired in the callback function ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Modules/nismodule.c Modified: python/branches/py3k/Modules/nismodule.c ============================================================================== --- python/branches/py3k/Modules/nismodule.c (original) +++ python/branches/py3k/Modules/nismodule.c Thu Jul 3 01:44:19 2008 @@ -98,6 +98,7 @@ struct ypcallback_data { PyObject *dict; int fix; + PyThreadState *state; }; static int @@ -109,6 +110,7 @@ PyObject *val; int err; + PyEval_RestoreThread(indata->state); if (indata->fix) { if (inkeylen > 0 && inkey[inkeylen-1] == '\0') inkeylen--; @@ -127,10 +129,11 @@ err = PyDict_SetItem(indata->dict, key, val); Py_DECREF(key); Py_DECREF(val); - if (err != 0) { + if (err != 0) PyErr_Clear(); - return 1; - } + indata->state = PyEval_SaveThread(); + if (err != 0) + return 1; return 0; } return 1; @@ -206,9 +209,9 @@ data.dict = dict; map = nis_mapname (map, &data.fix); cb.data = (char *)&data; - Py_BEGIN_ALLOW_THREADS + data.state = PyEval_SaveThread(); err = yp_all (domain, map, &cb); - Py_END_ALLOW_THREADS + PyEval_RestoreThread(data.state); if (err != 0) { Py_DECREF(dict); return nis_error(err); From python-3000-checkins at python.org Thu Jul 3 16:13:44 2008 From: python-3000-checkins at python.org (martin.v.loewis) Date: Thu, 3 Jul 2008 16:13:44 +0200 (CEST) Subject: [Python-3000-checkins] r64691 - in python/branches/py3k: Doc/library/zipfile.rst Lib/test/test_zipfile.py Lib/test/test_zipfile64.py Lib/zipfile.py Misc/NEWS Message-ID: <20080703141344.DD9D41E400A@bag.python.org> Author: martin.v.loewis Date: Thu Jul 3 16:13:42 2008 New Revision: 64691 Log: Merged revisions 64688 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64688 | martin.v.loewis | 2008-07-03 14:51:14 +0200 (Do, 03 Jul 2008) | 9 lines Patch #1622: Correct interpretation of various ZIP header fields. Also fixes - Issue #1526: Allow more than 64k files to be added to Zip64 file. - Issue #1746: Correct handling of zipfile archive comments (previously archives with comments over 4k were flagged as invalid). Allow writing Zip files with archives by setting the 'comment' attribute of a ZipFile. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/zipfile.rst python/branches/py3k/Lib/test/test_zipfile.py python/branches/py3k/Lib/test/test_zipfile64.py python/branches/py3k/Lib/zipfile.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Doc/library/zipfile.rst ============================================================================== --- python/branches/py3k/Doc/library/zipfile.rst (original) +++ python/branches/py3k/Doc/library/zipfile.rst Thu Jul 3 16:13:42 2008 @@ -269,7 +269,7 @@ member of the given :class:`ZipInfo` instance. By default, the :class:`ZipInfo` constructor sets this member to :const:`ZIP_STORED`. -The following data attribute is also available: +The following data attributes are also available: .. attribute:: ZipFile.debug @@ -278,6 +278,12 @@ output) to ``3`` (the most output). Debugging information is written to ``sys.stdout``. +.. attribute:: ZipFile.comment + + The comment text associated with the ZIP file. If assigning a comment to a + :class:`ZipFile` instance created with mode 'a' or 'w', this should be a + string no longer than 65535 bytes. Comments longer than this will be + truncated in the written archive when :meth:`ZipFile.close` is called. .. _pyzipfile-objects: Modified: python/branches/py3k/Lib/test/test_zipfile.py ============================================================================== --- python/branches/py3k/Lib/test/test_zipfile.py (original) +++ python/branches/py3k/Lib/test/test_zipfile.py Thu Jul 3 16:13:42 2008 @@ -699,6 +699,55 @@ zipf.writestr("foo.txt\x00qqq", b"O, for a Muse of Fire!") self.assertEqual(zipf.namelist(), ['foo.txt']) + def test_StructSizes(self): + # check that ZIP internal structure sizes are calculated correctly + self.assertEqual(zipfile.sizeEndCentDir, 22) + self.assertEqual(zipfile.sizeCentralDir, 46) + self.assertEqual(zipfile.sizeEndCentDir64, 56) + self.assertEqual(zipfile.sizeEndCentDir64Locator, 20) + + def testComments(self): + # This test checks that comments on the archive are handled properly + + # check default comment is empty + zipf = zipfile.ZipFile(TESTFN, mode="w") + self.assertEqual(zipf.comment, b'') + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, b'') + zipfr.close() + + # check a simple short comment + comment = b'Bravely taking to his feet, he beat a very brave retreat.' + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment) + zipfr.close() + + # check a comment of max length + comment2 = ''.join(['%d' % (i**3 % 10) for i in range((1 << 16)-1)]) + comment2 = comment2.encode("ascii") + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment2 + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment2) + zipfr.close() + + # check a comment that is too long is truncated + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.comment = comment2 + b'oops' + zipf.writestr("foo.txt", "O, for a Muse of Fire!") + zipf.close() + zipfr = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(zipfr.comment, comment2) + zipfr.close() + def tearDown(self): support.unlink(TESTFN) support.unlink(TESTFN2) Modified: python/branches/py3k/Lib/test/test_zipfile64.py ============================================================================== --- python/branches/py3k/Lib/test/test_zipfile64.py (original) +++ python/branches/py3k/Lib/test/test_zipfile64.py Thu Jul 3 16:13:42 2008 @@ -2,6 +2,7 @@ # The support.requires call is the only reason for keeping this separate # from test_zipfile from test import support + # XXX(nnorwitz): disable this test by looking for extra largfile resource # which doesn't exist. This test takes over 30 minutes to run in general # and requires more disk space than most of the buildbots. @@ -92,8 +93,31 @@ if os.path.exists(fname): os.remove(fname) + +class OtherTests(unittest.TestCase): + def testMoreThan64kFiles(self): + # This test checks that more than 64k files can be added to an archive, + # and that the resulting archive can be read properly by ZipFile + zipf = zipfile.ZipFile(TESTFN, mode="w") + zipf.debug = 100 + numfiles = (1 << 16) * 3/2 + for i in xrange(numfiles): + zipf.writestr("foo%08d" % i, "%d" % (i**3 % 57)) + self.assertEqual(len(zipf.namelist()), numfiles) + zipf.close() + + zipf2 = zipfile.ZipFile(TESTFN, mode="r") + self.assertEqual(len(zipf2.namelist()), numfiles) + for i in xrange(numfiles): + self.assertEqual(zipf2.read("foo%08d" % i), "%d" % (i**3 % 57)) + zipf.close() + + def tearDown(self): + test_support.unlink(TESTFN) + test_support.unlink(TESTFN2) + def test_main(): - run_unittest(TestsWithSourceFile) + run_unittest(TestsWithSourceFile, OtherTests) if __name__ == "__main__": test_main() Modified: python/branches/py3k/Lib/zipfile.py ============================================================================== --- python/branches/py3k/Lib/zipfile.py (original) +++ python/branches/py3k/Lib/zipfile.py Thu Jul 3 16:13:42 2008 @@ -29,31 +29,79 @@ 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 -# Here are some struct module formats for reading headers -structEndArchive = "<4s4H2LH" # 9 items, end of archive, 22 bytes -stringEndArchive = b"PK\005\006" # magic number for end of archive record -structCentralDir = "<4s4B4HLLL5HLL"# 19 items, central directory, 46 bytes -stringCentralDir = b"PK\001\002" # magic number for central directory -structFileHeader = "<4s2B4HLLL2H" # 12 items, file header record, 30 bytes -stringFileHeader = b"PK\003\004" # magic number for file header -structEndArchive64Locator = "<4sLQL" # 4 items, locate Zip64 header, 20 bytes -stringEndArchive64Locator = b"PK\x06\x07" # magic token for locator header -structEndArchive64 = "<4sQHHLLQQQQ" # 10 items, end of archive (Zip64), 56 bytes -stringEndArchive64 = b"PK\x06\x06" # magic token for Zip64 header - +# 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) +structEndCentDir = b"<4s4H2LH" +magicEndCentDir = b"PK\005\006" +sizeEndCentDir = struct.calcsize(structEndCentDir) + +_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" +magicCentralDir = b"PK\001\002" +sizeCentralDir = struct.calcsize(structCentralDir) + +# The "local file header" structure, magic number, size, and indices +# (section V.A in the format document) +structFileHeader = "<4s2B4HL2L2H" +magicFileHeader = b"PK\003\004" +sizeFileHeader = struct.calcsize(structFileHeader) + +# The "Zip64 end of central directory locator" structure, magic number, and size +structEndCentDir64Locator = "<4sLQL" +magicEndCentDir64Locator = b"PK\x06\x07" +sizeEndCentDir64Locator = struct.calcsize(structEndCentDir64Locator) + +# The "Zip64 end of central directory" record, magic number, size, and indices +# (section V.G in the format document) +structEndCentDir64 = "<4sQ2H2L4Q" +magicEndCentDir64 = b"PK\x06\x06" +sizeEndCentDir64 = struct.calcsize(structEndCentDir64) + +_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 # 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 # is this meaningful? +_CD_EXTRACT_SYSTEM = 4 _CD_FLAG_BITS = 5 _CD_COMPRESS_TYPE = 6 _CD_TIME = 7 @@ -69,10 +117,15 @@ _CD_EXTERNAL_FILE_ATTRIBUTES = 17 _CD_LOCAL_HEADER_OFFSET = 18 -# indexes of entries in the local file header structure +# The "local file header" structure, magic number, size, and indices +# (section V.A in the format document) +structFileHeader = "<4s2B4HL2L2H" +magicFileHeader = b"PK\003\004" +sizeFileHeader = struct.calcsize(structFileHeader) + _FH_SIGNATURE = 0 _FH_EXTRACT_VERSION = 1 -_FH_EXTRACT_SYSTEM = 2 # is this meaningful? +_FH_EXTRACT_SYSTEM = 2 _FH_GENERAL_PURPOSE_FLAG_BITS = 3 _FH_COMPRESSION_METHOD = 4 _FH_LAST_MOD_TIME = 5 @@ -83,6 +136,28 @@ _FH_FILENAME_LENGTH = 10 _FH_EXTRA_FIELD_LENGTH = 11 +# The "Zip64 end of central directory locator" structure, magic number, and size +structEndCentDir64Locator = "<4sLQL" +magicEndCentDir64Locator = b"PK\x06\x07" +sizeEndCentDir64Locator = struct.calcsize(structEndCentDir64Locator) + +# The "Zip64 end of central directory" record, magic number, size, and indices +# (section V.G in the format document) +structEndCentDir64 = "<4sQ2H2L4Q" +magicEndCentDir64 = b"PK\x06\x06" +sizeEndCentDir64 = struct.calcsize(structEndCentDir64) + +_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 is_zipfile(filename): """Quickly see if file is a ZIP file by checking the magic number.""" try: @@ -99,33 +174,31 @@ """ Read the ZIP64 end-of-archive records and use that to update endrec """ - locatorSize = struct.calcsize(structEndArchive64Locator) - fpin.seek(offset - locatorSize, 2) - data = fpin.read(locatorSize) - sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data) - if sig != stringEndArchive64Locator: + fpin.seek(offset - sizeEndCentDir64Locator, 2) + data = fpin.read(sizeEndCentDir64Locator) + sig, diskno, reloff, disks = struct.unpack(structEndCentDir64Locator, data) + if sig != magicEndCentDir64Locator: return endrec if diskno != 0 or disks != 1: raise BadZipfile("zipfiles that span multiple disks are not supported") # Assume no 'zip64 extensible data' - endArchiveSize = struct.calcsize(structEndArchive64) - fpin.seek(offset - locatorSize - endArchiveSize, 2) - data = fpin.read(endArchiveSize) + fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2) + data = fpin.read(sizeEndCentDir64) sig, sz, create_version, read_version, disk_num, disk_dir, \ dircount, dircount2, dirsize, diroffset = \ - struct.unpack(structEndArchive64, data) - if sig != stringEndArchive64: + struct.unpack(structEndCentDir64, data) + if sig != magicEndCentDir64: return endrec # Update the original endrec using data from the ZIP64 record - endrec[1] = disk_num - endrec[2] = disk_dir - endrec[3] = dircount - endrec[4] = dircount2 - endrec[5] = dirsize - endrec[6] = diroffset + 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 @@ -134,38 +207,59 @@ 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.""" - fpin.seek(-22, 2) # Assume no archive comment. - filesize = fpin.tell() + 22 # Get file size + + # 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). + fpin.seek(-sizeEndCentDir, 2) data = fpin.read() - if data[0:4] == stringEndArchive and data[-2:] == b"\000\000": - endrec = struct.unpack(structEndArchive, data) - endrec = list(endrec) - endrec.append("") # Append the archive comment - endrec.append(filesize - 22) # Append the record start offset - if endrec[-4] == 0xffffffff: - return _EndRecData64(fpin, -22, endrec) + if data[0:4] == magicEndCentDir and data[-2:] == b"\000\000": + # the signature is correct and there's no comment, unpack structure + endrec = struct.unpack(structEndCentDir, data) + endrec=list(endrec) + + # Append a blank comment and record start offset + endrec.append(b"") + endrec.append(filesize - sizeEndCentDir) + if endrec[_ECD_OFFSET] == 0xffffffff: + # the value for the "offset of the start of the central directory" + # indicates that there is a "Zip64 end of central directory" + # structure present, so go look for it + return _EndRecData64(fpin, -sizeEndCentDir, endrec) + return endrec - # Search the last END_BLOCK bytes of the file for the record signature. - # The comment is appended to the ZIP file and has a 16 bit length. - # So the comment may be up to 64K long. We limit the search for the - # signature to a few Kbytes at the end of the file for efficiency. - # also, the signature must not appear in the comment. - END_BLOCK = min(filesize, 1024 * 4) - fpin.seek(filesize - END_BLOCK, 0) + + # 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: # Correct signature string was found - endrec = struct.unpack(structEndArchive, data[start:start+22]) - endrec = list(endrec) - comment = data[start+22:] - if endrec[7] == len(comment): # Comment length checks out + start = data.rfind(magicEndCentDir) + if start >= 0: + # found the magic number; attempt to unpack and interpret + recData = data[start:start+sizeEndCentDir] + endrec = list(struct.unpack(structEndCentDir, recData)) + comment = data[start+sizeEndCentDir:] + # check that comment length is correct + if endrec[_ECD_COMMENT_SIZE] == len(comment): # Append the archive comment and start offset endrec.append(comment) - endrec.append(filesize - END_BLOCK + start) - if endrec[-4] == 0xffffffff: - return _EndRecData64(fpin, - END_BLOCK + start, endrec) + endrec.append(maxCommentStart + start) + if endrec[_ECD_OFFSET] == 0xffffffff: + # There is apparently a "Zip64 end of central directory" + # structure present, so go look for it + return _EndRecData64(fpin, start - filesize, endrec) return endrec - return # Error, return None + + # Unable to find a valid end of central directory structure + return class ZipInfo (object): @@ -252,13 +346,13 @@ fmt = ' 1: print(endrec) - size_cd = endrec[5] # bytes in central directory - offset_cd = endrec[6] # offset of central directory - self.comment = endrec[8] # archive comment - # endrec[9] is the offset of the "End of Central Dir" record - if endrec[9] > ZIP64_LIMIT: - x = endrec[9] - size_cd - 56 - 20 - else: - x = endrec[9] - size_cd + 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 = x - offset_cd + concat = endrec[_ECD_LOCATION] - size_cd - offset_cd + if endrec[_ECD_LOCATION] > ZIP64_LIMIT: + # If the offset of the "End of Central Dir" record requires Zip64 + # extension structures, account for them + concat -= (sizeEndCentDir64 + sizeEndCentDir64Locator) + if self.debug > 2: - print("given, inferred, offset", offset_cd, x, concat) + 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) @@ -680,9 +776,8 @@ fp = io.BytesIO(data) total = 0 while total < size_cd: - centdir = fp.read(46) - total = total + 46 - if centdir[0:4] != stringCentralDir: + centdir = fp.read(sizeCentralDir) + if centdir[0:4] != magicCentralDir: raise BadZipfile("Bad magic number for central directory") centdir = struct.unpack(structCentralDir, centdir) if self.debug > 2: @@ -699,9 +794,6 @@ x = ZipInfo(filename) x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) x.comment = fp.read(centdir[_CD_COMMENT_LENGTH]) - total = (total + centdir[_CD_FILENAME_LENGTH] - + centdir[_CD_EXTRA_FIELD_LENGTH] - + 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, @@ -716,6 +808,12 @@ x.header_offset = x.header_offset + concat 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) @@ -749,7 +847,6 @@ except BadZipfile: return zinfo.filename - def getinfo(self, name): """Return the instance of ZipInfo given 'name'.""" info = self.NameToInfo.get(name) @@ -794,8 +891,8 @@ zef_file.seek(zinfo.header_offset, 0) # Skip the file header: - fheader = zef_file.read(30) - if fheader[0:4] != stringFileHeader: + fheader = zef_file.read(sizeFileHeader) + if fheader[0:4] != magicFileHeader: raise BadZipfile("Bad magic number for file header") fheader = struct.unpack(structFileHeader, fheader) @@ -1059,15 +1156,15 @@ or zinfo.compress_size > ZIP64_LIMIT: extra.append(zinfo.file_size) extra.append(zinfo.compress_size) - file_size = 0xffffffff #-1 - compress_size = 0xffffffff #-1 + 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 = 0xffffffff # -1 32 bit + header_offset = 0xffffffff else: header_offset = zinfo.header_offset @@ -1084,15 +1181,26 @@ extract_version = zinfo.extract_version create_version = zinfo.create_version - 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) + try: + filename, flag_bits = zinfo._encodeFilenameFlags() + centdir = struct.pack(structCentralDir, + magicCentralDir, 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) @@ -1100,27 +1208,35 @@ pos2 = self.fp.tell() # Write end-of-zip-archive record + centDirOffset = pos1 if pos1 > ZIP64_LIMIT: # Need to write the ZIP64 end-of-archive records zip64endrec = struct.pack( - structEndArchive64, stringEndArchive64, + structEndCentDir64, magicEndCentDir64, 44, 45, 45, 0, 0, count, count, pos2 - pos1, pos1) self.fp.write(zip64endrec) zip64locrec = struct.pack( - structEndArchive64Locator, - stringEndArchive64Locator, 0, pos2, 1) + structEndCentDir64Locator, + magicEndCentDir64Locator, 0, pos2, 1) self.fp.write(zip64locrec) + centDirOffset = 0xFFFFFFFF - endrec = struct.pack(structEndArchive, stringEndArchive, - 0, 0, count, count, pos2 - pos1, 0xffffffff, 0) - self.fp.write(endrec) - - else: - endrec = struct.pack(structEndArchive, stringEndArchive, - 0, 0, count, count, pos2 - pos1, pos1, 0) - self.fp.write(endrec) + # check for valid comment length + if len(self.comment) >= ZIP_MAX_COMMENT: + if self.debug > 0: + msg = 'Archive comment is too long; truncating to %d bytes' \ + % ZIP_MAX_COMMENT + self.comment = self.comment[:ZIP_MAX_COMMENT] + + endrec = struct.pack(structEndCentDir, magicEndCentDir, + 0, 0, count % ZIP_FILECOUNT_LIMIT, + count % ZIP_FILECOUNT_LIMIT, pos2 - pos1, + centDirOffset, len(self.comment)) + self.fp.write(endrec) + self.fp.write(self.comment) self.fp.flush() + if not self._filePassed: self.fp.close() self.fp = None Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Thu Jul 3 16:13:42 2008 @@ -17,8 +17,21 @@ Library ------- +<<<<<<< .working - Issue #2683: Fix inconsistency in subprocess.Popen.communicate(): the argument now must be a bytes object in any case. +======= +- Issue #1622: Correct interpretation of various ZIP header fields. + +- Issue #1526: Allow more than 64k files to be added to Zip64 file. + +- Issue #1746: Correct handling of zipfile archive comments (previously + archives with comments over 4k were flagged as invalid). Allow writing + Zip files with archives by setting the 'comment' attribute of a ZipFile. + +- Issue #449227: Now with the rlcompleter module, callable objects are added + "(" when completed. +>>>>>>> .merge-right.r64688 - Issue #3145: help("modules whatever") failed when trying to load the source code of every single module of the standard library, including invalid files From python-3000-checkins at python.org Thu Jul 3 16:45:21 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 3 Jul 2008 16:45:21 +0200 (CEST) Subject: [Python-3000-checkins] r64692 - python/branches/py3k/Doc/library/dis.rst Message-ID: <20080703144521.0B7221E400A@bag.python.org> Author: benjamin.peterson Date: Thu Jul 3 16:45:20 2008 New Revision: 64692 Log: document LOAD_BUILD_CLASS Modified: python/branches/py3k/Doc/library/dis.rst Modified: python/branches/py3k/Doc/library/dis.rst ============================================================================== --- python/branches/py3k/Doc/library/dis.rst (original) +++ python/branches/py3k/Doc/library/dis.rst Thu Jul 3 16:45:20 2008 @@ -412,10 +412,10 @@ with the outer-next block. -.. opcode:: BUILD_CLASS () +.. opcode:: LOAD_BUILD_CLASS () - Creates a new class object. TOS is the methods dictionary, TOS1 the tuple of - the names of the base classes, and TOS2 the class name. + Pushes builtins.__build_class__ onto the stack. It is later called by + ```CALL_FUNCTION`` to construct a class. .. opcode:: WITH_CLEANUP () From python-3000-checkins at python.org Thu Jul 3 22:28:26 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 3 Jul 2008 22:28:26 +0200 (CEST) Subject: [Python-3000-checkins] r64696 - in python/branches/py3k/Doc: glossary.rst howto/functional.rst reference/expressions.rst Message-ID: <20080703202827.086401E400A@bag.python.org> Author: benjamin.peterson Date: Thu Jul 3 22:28:26 2008 New Revision: 64696 Log: remove traces of .next Modified: python/branches/py3k/Doc/glossary.rst python/branches/py3k/Doc/howto/functional.rst python/branches/py3k/Doc/reference/expressions.rst Modified: python/branches/py3k/Doc/glossary.rst ============================================================================== --- python/branches/py3k/Doc/glossary.rst (original) +++ python/branches/py3k/Doc/glossary.rst Thu Jul 3 22:28:26 2008 @@ -168,7 +168,7 @@ :keyword:`yield` elements back to the caller. The function execution is stopped at the :keyword:`yield` keyword (returning the result) and is resumed there when the next element is requested by calling the - :meth:`next` method of the returned iterator. + :meth:`__next__` method of the returned iterator. .. index:: single: generator expression @@ -266,11 +266,12 @@ iterator An object representing a stream of data. Repeated calls to the iterator's - :meth:`next` method return successive items in the stream. When no more - data is available a :exc:`StopIteration` exception is raised instead. At - this point, the iterator object is exhausted and any further calls to its - :meth:`next` method just raise :exc:`StopIteration` again. Iterators are - required to have an :meth:`__iter__` method that returns the iterator + :meth:`__next__` (or passing it to the builtin function) :func:`next` + method return successive items in the stream. When no more data is + available a :exc:`StopIteration` exception is raised instead. At this + point, the iterator object is exhausted and any further calls to its + :meth:`__next__` method just raise :exc:`StopIteration` again. Iterators + are required to have an :meth:`__iter__` method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted. One notable exception is code that attempts multiple iteration passes. A container object (such as a Modified: python/branches/py3k/Doc/howto/functional.rst ============================================================================== --- python/branches/py3k/Doc/howto/functional.rst (original) +++ python/branches/py3k/Doc/howto/functional.rst Thu Jul 3 22:28:26 2008 @@ -184,11 +184,11 @@ An iterator is an object representing a stream of data; this object returns the data one element at a time. A Python iterator must support a method called -``next()`` that takes no arguments and always returns the next element of the -stream. If there are no more elements in the stream, ``next()`` must raise the -``StopIteration`` exception. Iterators don't have to be finite, though; it's -perfectly reasonable to write an iterator that produces an infinite stream of -data. +``__next__()`` that takes no arguments and always returns the next element of +the stream. If there are no more elements in the stream, ``__next__()`` must +raise the ``StopIteration`` exception. Iterators don't have to be finite, +though; it's perfectly reasonable to write an iterator that produces an infinite +stream of data. The built-in :func:`iter` function takes an arbitrary object and tries to return an iterator that will return the object's contents or elements, raising @@ -203,13 +203,13 @@ >>> it = iter(L) >>> it <...iterator object at ...> - >>> it.next() + >>> it.__next__() 1 - >>> it.next() + >>> next(it) 2 - >>> it.next() + >>> next(it) 3 - >>> it.next() + >>> next(it) Traceback (most recent call last): File "", line 1, in ? StopIteration @@ -467,20 +467,20 @@ ``return`` statement. The big difference between ``yield`` and a ``return`` statement is that on reaching a ``yield`` the generator's state of execution is suspended and local variables are preserved. On the next call to the -generator's ``.next()`` method, the function will resume executing. +generator's ``.__next__()`` method, the function will resume executing. Here's a sample usage of the ``generate_ints()`` generator: >>> gen = generate_ints(3) >>> gen - >>> gen.next() + >>> next(gen) 0 - >>> gen.next() + >>> next(gen) 1 - >>> gen.next() + >>> next(gen) 2 - >>> gen.next() + >>> next(gen) Traceback (most recent call last): File "stdin", line 1, in ? File "stdin", line 2, in generate_ints @@ -500,7 +500,7 @@ You could achieve the effect of generators manually by writing your own class and storing all the local variables of the generator as instance variables. For example, returning a list of integers could be done by setting ``self.count`` to -0, and having the ``next()`` method increment ``self.count`` and return it. +0, and having the ``__next__()`` method increment ``self.count`` and return it. However, for a moderately complicated generator, writing a corresponding class can be much messier. @@ -555,7 +555,7 @@ Values are sent into a generator by calling its ``send(value)`` method. This method resumes the generator's code and the ``yield`` expression returns the -specified value. If the regular ``next()`` method is called, the ``yield`` +specified value. If the regular ``__next__()`` method is called, the ``yield`` returns ``None``. Here's a simple counter that increments by 1 and allows changing the value of @@ -576,15 +576,15 @@ And here's an example of changing the counter: >>> it = counter(10) - >>> it.next() + >>> next(it) 0 - >>> it.next() + >>> next(it) 1 >>> it.send(8) 8 - >>> it.next() + >>> next(it) 9 - >>> it.next() + >>> next(it) Traceback (most recent call last): File ``t.py'', line 15, in ? it.next() Modified: python/branches/py3k/Doc/reference/expressions.rst ============================================================================== --- python/branches/py3k/Doc/reference/expressions.rst (original) +++ python/branches/py3k/Doc/reference/expressions.rst Thu Jul 3 22:28:26 2008 @@ -375,8 +375,8 @@ Starts the execution of a generator function or resumes it at the last executed :keyword:`yield` expression. When a generator function is resumed - with a :meth:`next` method, the current :keyword:`yield` expression always - evaluates to :const:`None`. The execution then continues to the next + with a :meth:`__next__` method, the current :keyword:`yield` expression + always evaluates to :const:`None`. The execution then continues to the next :keyword:`yield` expression, where the generator is suspended again, and the value of the :token:`expression_list` is returned to :meth:`next`'s caller. If the generator exits without yielding another value, a :exc:`StopIteration` From python-3000-checkins at python.org Fri Jul 4 17:45:11 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Fri, 4 Jul 2008 17:45:11 +0200 (CEST) Subject: [Python-3000-checkins] r64700 - python/branches/py3k/Misc/NEWS Message-ID: <20080704154511.1CEA71E4003@bag.python.org> Author: georg.brandl Date: Fri Jul 4 17:45:10 2008 New Revision: 64700 Log: Fix committed merge conflict. Modified: python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 4 17:45:10 2008 @@ -17,21 +17,8 @@ Library ------- -<<<<<<< .working - Issue #2683: Fix inconsistency in subprocess.Popen.communicate(): the argument now must be a bytes object in any case. -======= -- Issue #1622: Correct interpretation of various ZIP header fields. - -- Issue #1526: Allow more than 64k files to be added to Zip64 file. - -- Issue #1746: Correct handling of zipfile archive comments (previously - archives with comments over 4k were flagged as invalid). Allow writing - Zip files with archives by setting the 'comment' attribute of a ZipFile. - -- Issue #449227: Now with the rlcompleter module, callable objects are added - "(" when completed. ->>>>>>> .merge-right.r64688 - Issue #3145: help("modules whatever") failed when trying to load the source code of every single module of the standard library, including invalid files From python-3000-checkins at python.org Fri Jul 4 17:55:07 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Fri, 4 Jul 2008 17:55:07 +0200 (CEST) Subject: [Python-3000-checkins] r64701 - in python/branches/py3k: Lib/test/test_unicode.py Misc/NEWS Modules/unicodename_db.h Objects/unicodectype.c Objects/unicodetype_db.h Tools/unicode/makeunicodedata.py Message-ID: <20080704155507.7A0961E400E@bag.python.org> Author: georg.brandl Date: Fri Jul 4 17:55:02 2008 New Revision: 64701 Log: Issue #3282: str.isprintable() should return False for undefined Unicode characters. Modified: python/branches/py3k/Lib/test/test_unicode.py python/branches/py3k/Misc/NEWS python/branches/py3k/Modules/unicodename_db.h python/branches/py3k/Objects/unicodectype.c python/branches/py3k/Objects/unicodetype_db.h python/branches/py3k/Tools/unicode/makeunicodedata.py Modified: python/branches/py3k/Lib/test/test_unicode.py ============================================================================== --- python/branches/py3k/Lib/test/test_unicode.py (original) +++ python/branches/py3k/Lib/test/test_unicode.py Fri Jul 4 17:55:02 2008 @@ -420,12 +420,17 @@ self.assertFalse(" ".isidentifier()) self.assertFalse("[".isidentifier()) self.assertFalse("?".isidentifier()) + self.assertFalse("0".isidentifier()) def test_isprintable(self): self.assertTrue("".isprintable()) self.assertTrue("abcdefg".isprintable()) self.assertFalse("abcdefg\n".isprintable()) - self.assertTrue("\u0370".isprintable()) + # some defined Unicode character + self.assertTrue("\u0374".isprintable()) + # undefined character + self.assertFalse("\u0370".isprintable()) + # single surrogate character self.assertFalse("\ud800".isprintable()) def test_contains(self): @@ -598,7 +603,7 @@ # format specifiers for user defined type self.assertEqual('{0:abc}'.format(C()), 'abc') - # !r, !s and !a coersions + # !r, !s and !a coercions self.assertEqual('{0!s}'.format('Hello'), 'Hello') self.assertEqual('{0!s:}'.format('Hello'), 'Hello') self.assertEqual('{0!s:15}'.format('Hello'), 'Hello ') @@ -606,11 +611,15 @@ self.assertEqual('{0!r}'.format('Hello'), "'Hello'") self.assertEqual('{0!r:}'.format('Hello'), "'Hello'") self.assertEqual('{0!r}'.format(F('Hello')), 'F(Hello)') - self.assertEqual('{0!r}'.format(F('\u0370')), 'F(\u0370)') + self.assertEqual('{0!r}'.format('\u0370'), "'\\u0370'") # nonprintable + self.assertEqual('{0!r}'.format('\u0374'), "'\u0374'") # printable + self.assertEqual('{0!r}'.format(F('\u0374')), 'F(\u0374)') self.assertEqual('{0!a}'.format('Hello'), "'Hello'") + self.assertEqual('{0!a}'.format('\u0370'), "'\\u0370'") # nonprintable + self.assertEqual('{0!a}'.format('\u0374'), "'\\u0374'") # printable self.assertEqual('{0!a:}'.format('Hello'), "'Hello'") self.assertEqual('{0!a}'.format(F('Hello')), 'F(Hello)') - self.assertEqual('{0!a}'.format(F('\u0370')), 'F(\\u0370)') + self.assertEqual('{0!a}'.format(F('\u0374')), 'F(\\u0374)') # test fallback to object.__format__ self.assertEqual('{0}'.format({}), '{}') Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 4 17:55:02 2008 @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Issue #3282: str.isprintable() should return False for undefined + Unicode characters. + - Issue #3236: Return small longs from PyLong_FromString. Library Modified: python/branches/py3k/Modules/unicodename_db.h ============================================================================== --- python/branches/py3k/Modules/unicodename_db.h (original) +++ python/branches/py3k/Modules/unicodename_db.h Fri Jul 4 17:55:02 2008 @@ -76,2971 +76,3075 @@ 193, 79, 88, 73, 65, 128, 83, 85, 66, 74, 79, 73, 78, 69, 196, 86, 65, 82, 73, 65, 128, 89, 65, 128, 66, 128, 67, 73, 82, 67, 76, 197, 72, 65, 128, 74, 128, 77, 65, 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 73, 71, - 72, 84, 128, 85, 80, 87, 65, 82, 68, 211, 80, 65, 83, 83, 73, 86, 69, 45, - 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 66, 89, - 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, - 65, 206, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, - 67, 73, 69, 85, 67, 128, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, - 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 65, 78, 84, 73, 67, 76, 79, 67, - 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 67, 69, 79, 78, 71, - 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 83, - 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, - 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, - 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, - 85, 80, 128, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, 79, 85, - 84, 80, 85, 212, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, - 69, 85, 67, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, - 67, 73, 69, 85, 67, 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, - 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, - 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, - 85, 84, 45, 72, 73, 69, 85, 72, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, - 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, 73, 69, 85, 80, 45, 83, 73, - 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73, - 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 75, 73, - 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 89, 69, - 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, - 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 73, 69, 85, 78, 71, 45, 83, 83, - 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 76, 79, 78, 71, 45, 66, 82, 65, - 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 80, 65, 82, 84, 73, 65, 76, 76, - 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 82, 73, 69, 85, 76, 45, 80, 73, - 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 83, 72, 79, 82, 84, 45, 84, 87, - 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 73, 79, 83, 45, 80, 73, 69, - 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 75, 65, 84, 65, 75, 65, 78, 65, - 45, 72, 73, 82, 65, 71, 65, 78, 193, 82, 73, 69, 85, 76, 45, 80, 73, 69, - 85, 80, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, - 65, 78, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, - 67, 73, 69, 85, 67, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, - 67, 65, 84, 79, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, - 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, - 85, 80, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, 79, - 83, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, - 204, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, - 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 75, - 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 65, 78, 84, - 73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, 67, 67, 69, 78, - 84, 45, 83, 84, 65, 67, 67, 65, 84, 79, 128, 65, 78, 84, 73, 75, 69, 78, - 79, 75, 89, 76, 73, 83, 77, 65, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, - 85, 77, 83, 73, 79, 83, 128, 67, 72, 73, 69, 85, 67, 72, 45, 75, 72, 73, - 69, 85, 75, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 72, 73, 69, 85, - 67, 72, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 56, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, - 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, - 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, - 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, - 80, 72, 45, 50, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 50, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, - 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, - 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 74, - 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 75, 82, 65, - 84, 73, 77, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, - 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 76, 79, 78, 71, 45, 66, 82, - 65, 78, 67, 72, 45, 77, 65, 68, 210, 77, 73, 69, 85, 77, 45, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, 70, - 73, 83, 77, 65, 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, - 79, 83, 128, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, - 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 82, - 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 84, 69, 65, - 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 80, 82, 79, 83, 71, - 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 84, 69, 65, 82, 68, 82, 79, 80, - 45, 83, 80, 79, 75, 69, 196, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, - 69, 82, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, - 196, 67, 79, 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 72, 73, - 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 65, 70, 79, 82, 69, - 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 82, 79, 85, 78, 68, 45, 80, - 82, 79, 70, 73, 76, 69, 128, 67, 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, - 78, 84, 69, 196, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, - 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, 84, 73, 79, 78, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, - 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, - 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, - 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, - 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, - 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, 78, 71, 45, - 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 77, 85, 76, 84, 73, 80, 76, 73, - 67, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, - 73, 79, 78, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, - 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 73, - 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 84, 69, 65, 82, 68, - 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 82, 79, 77, 73, 75, 79, 76, - 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, - 71, 77, 65, 128, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, - 196, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 82, 73, 71, - 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 77, 85, 76, 84, 73, 80, 76, - 73, 67, 65, 84, 73, 79, 206, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 79, - 87, 69, 196, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 75, - 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, - 69, 85, 84, 72, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, - 128, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 77, 73, 69, - 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 80, - 65, 78, 83, 73, 79, 83, 128, 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, - 65, 77, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, 80, - 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, - 69, 85, 84, 72, 128, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, 69, - 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 84, 69, 84, - 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 73, 75, 69, 85, 84, 45, - 75, 73, 89, 69, 79, 75, 128, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, - 85, 78, 196, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 65, - 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, 128, 66, 79, 84, 84, 79, - 77, 45, 76, 73, 71, 72, 84, 69, 196, 67, 72, 73, 69, 85, 67, 72, 45, 72, - 73, 69, 85, 72, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, - 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, 78, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, 69, 77, 66, 69, 76, 76, 73, - 83, 72, 77, 69, 78, 84, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, - 67, 72, 128, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 73, - 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, 71, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, - 73, 69, 85, 76, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, - 210, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, 78, 73, 69, - 85, 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 67, - 72, 73, 69, 85, 67, 72, 128, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, - 75, 72, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, - 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, - 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 89, 82, 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, - 128, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 69, - 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 89, 85, 85, 75, 65, 76, 69, - 65, 80, 73, 78, 84, 85, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, - 78, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 76, 69, 70, - 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 73, 78, 84, 69, 82, 83, 69, 67, - 84, 73, 79, 78, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, - 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 79, 87, 78, 45, - 80, 79, 73, 78, 84, 73, 78, 199, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, - 78, 79, 206, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 72, 89, - 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 67, 79, 78, 67, 65, 86, 69, - 45, 83, 73, 68, 69, 196, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, - 212, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, - 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 71, 72, 84, 45, 84, 79, 45, - 76, 69, 70, 212, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 67, - 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 68, 73, 77, 73, 78, 85, - 84, 73, 79, 78, 45, 49, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, 87, - 69, 196, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, 128, 71, 69, 79, - 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 73, 69, 85, 78, 71, 45, 75, 73, - 89, 69, 79, 75, 128, 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, - 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, - 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, - 85, 84, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 87, - 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, - 84, 72, 82, 69, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, - 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 85, 82, 65, - 77, 65, 90, 68, 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, - 65, 72, 65, 128, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 67, - 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, 89, 76, 73, 78, 68, - 82, 73, 67, 73, 84, 89, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, - 83, 128, 68, 69, 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 73, 70, - 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, 77, 73, 78, 73, 83, 72, - 77, 69, 78, 84, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, 128, - 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 83, 67, 79, - 78, 84, 73, 78, 85, 79, 85, 211, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, - 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, - 54, 55, 56, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 70, - 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, 71, 82, 79, 78, 84, 72, - 73, 83, 77, 65, 84, 65, 128, 72, 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, - 69, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, 45, 89, 82, 128, 73, 69, 85, - 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 78, 84, 69, 82, 83, 89, 76, - 76, 65, 66, 73, 195, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, - 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 76, 65, 66, 73, 65, - 76, 73, 90, 65, 84, 73, 79, 206, 77, 73, 78, 85, 83, 45, 79, 82, 45, 80, - 76, 85, 211, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 79, 80, - 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 80, 69, 82, 80, 69, 78, 68, - 73, 67, 85, 76, 65, 210, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 48, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 54, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 49, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, - 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 52, 128, + 72, 84, 128, 85, 80, 87, 65, 82, 68, 211, 90, 90, 89, 88, 128, 90, 90, + 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, + 80, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, + 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 79, + 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, + 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, + 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, + 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, + 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, + 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, + 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, + 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 82, 65, + 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, + 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, + 128, 90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, + 65, 199, 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, + 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, + 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, 82, + 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, 88, + 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, 90, + 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, 79, + 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, 128, 90, 72, 69, 88, + 128, 90, 72, 69, 84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, + 72, 69, 128, 90, 72, 197, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, + 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, + 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, 69, 84, 65, 128, 90, 69, + 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 74, 65, + 128, 90, 197, 90, 65, 89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, 86, + 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, 128, + 90, 65, 81, 69, 198, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 72, + 128, 90, 65, 200, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89, 89, + 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 65, 128, 89, 89, + 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, + 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, + 128, 89, 85, 88, 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, + 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, + 89, 85, 82, 128, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, + 128, 89, 85, 79, 80, 128, 89, 85, 79, 128, 89, 85, 68, 72, 128, 89, 85, + 68, 200, 89, 85, 65, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, + 89, 69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, + 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 128, 89, 85, 128, 89, 213, + 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, + 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, + 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 89, 79, 88, 128, 89, 79, + 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, + 204, 89, 79, 84, 128, 89, 79, 82, 73, 128, 89, 79, 80, 128, 89, 79, 79, + 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 128, 89, 79, + 196, 89, 79, 65, 128, 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, + 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, 45, 79, 128, 89, 79, 45, 73, + 128, 89, 79, 128, 89, 207, 89, 78, 128, 89, 73, 90, 69, 84, 128, 89, 73, + 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, 80, 128, 89, 73, + 78, 71, 128, 89, 73, 73, 128, 89, 73, 199, 89, 73, 69, 88, 128, 89, 73, + 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 128, 89, 73, 68, 68, 73, + 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 70, 69, 83, 73, 83, 128, + 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, 69, 89, 128, 89, 69, 87, + 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, + 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, + 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, + 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, + 65, 200, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, + 85, 128, 89, 69, 79, 45, 79, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, + 128, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65, 210, 89, 69, 65, 128, + 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, 90, 128, 89, 65, 89, + 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, 128, 89, 65, 86, 128, + 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, 65, + 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, 89, + 65, 82, 82, 128, 89, 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65, + 80, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, + 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, + 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, 75, 128, 89, 65, 74, 128, + 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, + 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, 71, 128, 89, 65, 70, 128, 89, + 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, + 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, + 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, + 65, 65, 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 79, 128, 89, 45, 67, + 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, + 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, 88, 89, 79, 128, 88, 89, + 73, 128, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, + 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, + 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, 86, 65, 128, 88, 85, + 79, 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, + 84, 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, + 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, 88, + 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, 128, + 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, 128, + 88, 71, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, + 88, 69, 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 87, 89, 78, + 78, 128, 87, 89, 78, 206, 87, 86, 128, 87, 85, 79, 88, 128, 87, 85, 79, + 80, 128, 87, 85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 128, 87, 82, 79, + 78, 71, 128, 87, 82, 73, 84, 73, 78, 199, 87, 82, 69, 65, 84, 200, 87, + 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, + 87, 79, 82, 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, + 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, + 79, 79, 68, 128, 87, 79, 206, 87, 79, 77, 65, 78, 128, 87, 79, 69, 128, + 87, 79, 65, 128, 87, 73, 78, 74, 65, 128, 87, 73, 78, 69, 128, 87, 73, + 78, 68, 128, 87, 73, 71, 71, 76, 217, 87, 73, 68, 69, 45, 72, 69, 65, 68, + 69, 196, 87, 73, 68, 197, 87, 72, 79, 76, 197, 87, 72, 73, 84, 69, 45, + 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, 72, 69, + 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, + 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, 71, 128, 87, + 69, 88, 128, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, + 69, 79, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, 87, 69, 68, + 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, 69, 65, 80, 79, 78, 128, 87, 66, + 128, 87, 65, 88, 128, 87, 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, + 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, + 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, + 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 83, + 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, + 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, + 65, 82, 78, 73, 78, 199, 87, 65, 80, 128, 87, 65, 78, 68, 69, 82, 69, 82, + 128, 87, 65, 76, 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, + 73, 84, 73, 78, 71, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, 65, + 65, 86, 85, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, 128, + 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 65, 128, 86, 85, + 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, + 80, 128, 86, 85, 76, 71, 65, 210, 86, 82, 65, 67, 72, 89, 128, 86, 79, + 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, 79, 87, + 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 80, 128, 86, 79, 76, 85, + 77, 197, 86, 79, 76, 84, 65, 71, 197, 86, 79, 73, 196, 86, 79, 73, 67, + 73, 78, 71, 128, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 204, 86, 79, + 128, 86, 73, 88, 128, 86, 73, 84, 128, 86, 73, 83, 65, 82, 71, 65, 89, + 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, 71, 193, + 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, 82, 71, 65, + 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, 78, 128, 86, + 73, 76, 76, 65, 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 68, 65, + 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, + 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, 128, 86, 69, 88, + 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 83, 83, 69, 204, 86, 69, 82, + 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, + 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, 82, 83, 73, + 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, 69, 128, 86, 69, + 80, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, 128, 86, 69, 197, 86, + 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, 89, 65, 78, 78, 65, + 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, 86, 65, 84, 72, 89, + 128, 86, 65, 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, + 83, 128, 86, 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, + 73, 65, 78, 212, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, + 65, 82, 69, 73, 193, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 76, + 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 85, 89, 65, + 78, 78, 65, 128, 85, 89, 128, 85, 85, 89, 65, 78, 78, 65, 128, 85, 85, + 128, 85, 83, 69, 196, 85, 83, 69, 128, 85, 82, 85, 218, 85, 82, 85, 83, + 128, 85, 82, 78, 128, 85, 82, 65, 78, 85, 83, 128, 85, 82, 65, 128, 85, + 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, + 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, 83, 73, 76, 79, 78, 128, + 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71, 72, 212, 85, 80, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, 85, 78, 78, 128, 85, 78, + 77, 65, 82, 82, 73, 69, 196, 85, 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, + 73, 84, 89, 128, 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, + 78, 128, 85, 78, 73, 79, 206, 85, 78, 68, 207, 85, 78, 68, 69, 82, 84, + 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, 69, 82, 68, + 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, 69, 210, + 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, 128, 85, 78, + 128, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, + 193, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 128, + 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, + 82, 73, 84, 73, 195, 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 128, 85, + 68, 65, 84, 84, 65, 128, 85, 66, 85, 70, 73, 76, 73, 128, 85, 66, 65, 68, + 65, 77, 65, 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 45, 69, 79, 45, + 69, 85, 128, 85, 45, 65, 69, 128, 84, 90, 85, 128, 84, 90, 79, 65, 128, + 84, 90, 79, 128, 84, 90, 73, 128, 84, 90, 69, 69, 128, 84, 90, 69, 128, + 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 89, 210, 84, 89, 80, 69, 45, + 183, 84, 89, 80, 69, 45, 182, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, + 45, 180, 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, + 69, 45, 177, 84, 89, 80, 197, 84, 89, 79, 128, 84, 89, 73, 128, 84, 89, + 69, 128, 84, 89, 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 76, 73, + 78, 197, 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 73, 73, 128, + 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, + 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, 45, 83, + 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, 84, 87, + 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 78, 73, + 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, 87, 69, + 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, + 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, + 87, 69, 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 76, 86, 69, + 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, + 87, 65, 128, 84, 86, 82, 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, + 210, 84, 85, 88, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, + 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, + 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, 84, 85, 82, 206, + 84, 85, 82, 66, 65, 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, + 79, 88, 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, + 84, 85, 71, 82, 73, 203, 84, 85, 65, 82, 69, 199, 84, 84, 85, 128, 84, + 84, 84, 72, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, + 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, + 65, 128, 84, 84, 73, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, + 84, 72, 69, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, 84, 84, + 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, 69, 69, + 128, 84, 84, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, 65, + 65, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, 72, 85, 71, 83, + 128, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, + 199, 84, 83, 72, 69, 128, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69, 128, + 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 65, 128, 84, + 83, 193, 84, 82, 89, 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128, 84, + 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85, 69, + 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, + 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, + 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, + 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, + 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, 128, 84, 82, 79, 75, 85, 84, + 65, 83, 84, 201, 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 84, + 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, 83, + 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, 79, + 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, 73, 80, 76, 197, 84, 82, + 73, 79, 206, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, + 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, + 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, + 73, 65, 84, 197, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, + 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, + 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, + 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, + 65, 128, 84, 82, 73, 128, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, + 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49, + 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, 68, 73, 78, + 71, 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, + 80, 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, + 79, 78, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 206, 84, 82, 65, + 68, 197, 84, 82, 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, + 84, 65, 204, 84, 79, 84, 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, + 82, 67, 85, 76, 85, 83, 128, 84, 79, 82, 67, 85, 76, 85, 211, 84, 79, 80, + 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, + 208, 84, 79, 79, 84, 72, 128, 84, 79, 79, 128, 84, 79, 78, 79, 83, 128, + 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, 78, 69, + 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, 128, + 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, + 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, + 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 76, 86, 128, 84, 76, + 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, 72, 85, 128, 84, 76, + 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, 128, 84, 76, 72, + 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, 65, 128, 84, + 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, + 84, 73, 84, 76, 79, 128, 84, 73, 84, 128, 84, 73, 82, 79, 78, 73, 65, + 206, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, 65, 128, + 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, 78, 69, + 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, + 77, 69, 211, 84, 73, 77, 69, 128, 84, 73, 76, 68, 197, 84, 73, 75, 69, + 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, + 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, + 212, 84, 73, 73, 128, 84, 73, 71, 72, 212, 84, 73, 71, 69, 82, 128, 84, + 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 128, + 84, 73, 67, 203, 84, 72, 90, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, + 65, 128, 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, + 85, 78, 71, 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, + 72, 85, 78, 68, 69, 82, 128, 84, 72, 85, 128, 84, 72, 82, 79, 85, 71, 72, + 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, + 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, 197, 84, 72, 82, 69, 69, 45, + 196, 84, 72, 82, 69, 65, 68, 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, + 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 72, 79, 85, 83, 65, 78, 196, 84, + 72, 79, 82, 78, 128, 84, 72, 79, 79, 128, 84, 72, 79, 78, 71, 128, 84, + 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, + 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 72, + 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84, 89, 128, 84, 72, + 73, 82, 84, 217, 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, + 69, 69, 206, 84, 72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, + 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, + 73, 128, 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 72, 128, 84, + 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, 128, 84, 72, 69, 84, 72, 69, + 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, + 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, + 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, + 128, 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, + 72, 69, 206, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, + 65, 128, 84, 72, 69, 77, 193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, + 72, 69, 69, 128, 84, 72, 197, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, + 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, + 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, 72, 65, 78, 128, 84, + 72, 65, 65, 76, 85, 128, 84, 72, 65, 65, 128, 84, 72, 45, 67, 82, 69, + 197, 84, 69, 88, 84, 128, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, + 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, + 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 70, 79, + 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, + 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, + 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, + 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, + 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 80, 128, 84, + 69, 78, 85, 84, 79, 128, 84, 69, 78, 84, 128, 84, 69, 78, 128, 84, 69, + 206, 84, 69, 77, 80, 85, 211, 84, 69, 76, 79, 85, 211, 84, 69, 76, 73, + 83, 72, 193, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, + 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 73, 87, 83, 128, + 84, 69, 197, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, + 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69, + 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 45, 85, 128, + 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, 84, 67, 72, + 69, 72, 128, 84, 67, 72, 69, 200, 84, 195, 84, 65, 88, 128, 84, 65, 87, + 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 128, 84, 65, 86, 73, 89, 65, 78, + 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84, + 65, 85, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, + 87, 69, 69, 204, 84, 65, 84, 128, 84, 65, 82, 128, 84, 65, 80, 69, 82, + 128, 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, + 69, 196, 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 128, + 84, 65, 76, 76, 128, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, + 212, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 128, 84, + 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, + 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, 193, 84, 65, 71, + 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, + 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 76, 69, 128, 84, + 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 50, 128, 83, 90, + 87, 71, 128, 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, + 90, 73, 128, 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, + 83, 90, 65, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, + 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, + 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, 65, 128, 83, 89, 78, 69, + 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89, 78, 67, 72, + 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, + 73, 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, 82, + 73, 195, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, + 56, 128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, + 54, 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, + 45, 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, + 79, 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, + 77, 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, + 89, 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, + 128, 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, + 52, 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, + 76, 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, + 79, 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, + 77, 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, + 83, 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, + 48, 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, + 50, 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, + 76, 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, + 66, 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, + 89, 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, + 128, 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, + 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, + 45, 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, + 79, 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, + 77, 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, + 83, 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, + 49, 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, + 45, 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 128, 83, 87, 85, 78, 199, + 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, 128, 83, 87, 79, 79, + 128, 83, 87, 79, 128, 83, 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, 69, + 69, 84, 128, 83, 87, 69, 128, 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, + 73, 78, 71, 128, 83, 87, 65, 65, 128, 83, 87, 128, 83, 85, 88, 128, 83, + 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 82, 88, + 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, + 196, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 128, + 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, + 83, 69, 128, 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, + 69, 212, 83, 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, + 73, 77, 80, 79, 83, 69, 196, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, + 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 71, 128, 83, 85, 78, 128, + 83, 85, 206, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, + 84, 73, 79, 206, 83, 85, 77, 128, 83, 85, 75, 85, 78, 128, 83, 85, 75, + 85, 206, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, + 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, + 67, 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, + 73, 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, + 83, 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, + 83, 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, + 82, 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, + 76, 73, 78, 69, 65, 210, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, + 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, + 85, 208, 83, 85, 65, 128, 83, 213, 83, 84, 87, 65, 128, 83, 84, 85, 68, + 89, 128, 83, 84, 82, 79, 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, 211, + 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, 128, + 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, 128, + 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, 128, + 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, 128, + 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, 49, + 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, 197, + 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, 83, 84, 82, 73, + 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, 69, 84, 67, 72, + 69, 196, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, 84, 72, 128, + 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, + 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, + 83, 84, 79, 86, 69, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, + 80, 80, 65, 71, 69, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83, + 84, 79, 67, 75, 128, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, + 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, 128, + 83, 84, 69, 77, 128, 83, 84, 69, 205, 83, 84, 69, 65, 77, 128, 83, 84, + 65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, + 82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 69, 82, 83, + 128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, + 83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, + 78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, 84, 65, 78, 128, 83, + 84, 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, + 198, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, 65, 67, 67, 65, 84, 73, + 83, 83, 73, 77, 79, 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, 128, 83, + 83, 89, 82, 88, 128, 83, 83, 89, 82, 128, 83, 83, 89, 80, 128, 83, 83, + 89, 128, 83, 83, 85, 88, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, + 83, 83, 85, 128, 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, + 80, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, + 83, 73, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, 80, 128, 83, + 83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, + 128, 83, 83, 69, 69, 128, 83, 83, 69, 128, 83, 83, 65, 88, 128, 83, 83, + 65, 84, 128, 83, 83, 65, 80, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, + 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, + 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83, 83, + 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, + 79, 75, 128, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, + 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, + 83, 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 65, 128, 83, 83, + 65, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, 71, 71, + 76, 197, 83, 81, 85, 65, 212, 83, 81, 85, 65, 82, 69, 83, 128, 83, 81, + 85, 65, 82, 69, 68, 128, 83, 81, 85, 65, 82, 69, 196, 83, 81, 85, 65, 82, + 69, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, 211, 83, 80, 82, 79, + 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, 80, 82, 69, 67, 72, 71, + 69, 83, 65, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, + 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, 73, 82, 73, 84, 128, 83, 80, 73, + 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 68, 69, 82, + 217, 83, 80, 73, 67, 69, 128, 83, 80, 72, 69, 82, 73, 67, 65, 204, 83, + 80, 69, 69, 67, 72, 128, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, 69, 65, + 82, 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 69, 128, + 83, 80, 65, 68, 197, 83, 79, 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, + 85, 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, + 82, 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, + 85, 128, 83, 79, 79, 128, 83, 79, 78, 128, 83, 79, 76, 73, 68, 85, 83, + 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 71, 68, 73, 65, 206, 83, 79, + 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, 83, 79, 70, + 212, 83, 79, 198, 83, 79, 67, 73, 69, 84, 89, 128, 83, 79, 65, 128, 83, + 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, 87, 70, 76, 65, 75, 69, + 128, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, + 78, 65, 75, 69, 128, 83, 78, 65, 75, 197, 83, 78, 193, 83, 77, 73, 76, + 73, 78, 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, + 65, 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, + 76, 85, 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 86, 79, 128, + 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 67, 69, + 128, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, + 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, + 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, 78, 128, + 83, 75, 69, 87, 69, 196, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84, + 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, + 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 128, 83, 73, 88, + 84, 69, 69, 78, 84, 200, 83, 73, 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, + 69, 69, 206, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, 88, 45, 80, + 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73, 216, 83, + 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, + 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, 83, + 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, 73, + 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, + 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 83, 73, 79, + 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 78, 73, 69, + 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, 73, 79, 83, + 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, + 75, 72, 128, 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, + 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, + 83, 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, + 73, 78, 75, 73, 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, + 83, 73, 78, 71, 76, 69, 128, 83, 73, 78, 71, 76, 197, 83, 73, 78, 197, + 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, 73, 69, + 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, + 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 128, 83, 73, 76, 75, 128, + 83, 73, 73, 128, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, + 73, 71, 77, 193, 83, 73, 71, 69, 204, 83, 73, 68, 69, 87, 65, 89, 211, + 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, + 66, 197, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82, 88, + 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, 72, 89, 128, 83, 72, + 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72, + 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 65, 65, 128, 83, 72, 87, + 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, + 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, + 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 70, 70, 76, + 197, 83, 72, 85, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 72, 84, 65, + 128, 83, 72, 79, 88, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, + 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, + 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, + 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, + 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, + 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, + 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, + 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, + 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, + 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, + 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 80, 128, 83, + 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, 72, + 79, 199, 83, 72, 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, + 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, + 193, 83, 72, 73, 73, 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, + 83, 72, 73, 128, 83, 72, 72, 65, 128, 83, 72, 69, 88, 128, 83, 72, 69, + 86, 65, 128, 83, 72, 69, 84, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, + 80, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, 83, 72, 69, 76, + 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, + 78, 85, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 69, 206, 83, 72, 69, + 69, 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 72, 67, 72, 65, 128, + 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65, + 84, 128, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, 65, 80, + 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, 128, 83, + 72, 65, 78, 71, 128, 83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, + 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 68, + 79, 87, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, + 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, + 65, 65, 128, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 65, 194, 83, 69, + 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, + 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, + 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 206, 83, 69, 83, 65, 77, 197, + 83, 69, 82, 86, 73, 67, 197, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, + 70, 211, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, 69, 80, 65, 82, 65, + 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, 210, 83, 69, 78, 84, 79, + 128, 83, 69, 78, 84, 73, 128, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, + 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83, 69, 77, + 73, 77, 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, + 69, 77, 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, + 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, + 82, 67, 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, + 45, 86, 79, 73, 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, + 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, + 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 53, 54, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, - 45, 65, 210, 83, 73, 79, 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, - 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 80, 72, - 73, 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, - 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 84, 72, 85, 78, - 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, - 69, 85, 76, 128, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, - 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, 78, 84, 89, - 45, 83, 69, 86, 69, 78, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, - 69, 210, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 89, 79, 85, - 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, - 84, 72, 65, 206, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, 80, 82, - 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 69, 82, 73, 83, 80, 79, 77, - 69, 78, 73, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 65, 82, - 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 80, 65, 82, 69, 78, 84, 72, 69, - 83, 73, 83, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 73, 78, - 84, 69, 82, 83, 69, 67, 84, 73, 79, 206, 67, 65, 78, 68, 82, 65, 66, 73, - 78, 68, 85, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 83, 85, - 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 66, 76, 65, 67, 75, 45, 76, 69, - 84, 84, 69, 210, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 67, 65, - 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 69, 75, 70, 79, 78, 73, 84, 73, - 75, 79, 78, 128, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 82, 73, - 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 83, 79, 85, 84, 72, 45, 83, 76, - 65, 86, 69, 217, 65, 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 83, - 84, 82, 79, 76, 79, 71, 73, 67, 65, 204, 71, 65, 89, 65, 78, 85, 75, 73, - 84, 84, 65, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 78, 73, - 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 72, 73, - 69, 85, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 82, 73, - 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 80, 73, - 69, 85, 80, 128, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 83, - 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 65, 67, 75, 78, 79, 87, 76, 69, - 68, 71, 69, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 73, 78, - 84, 69, 82, 83, 69, 67, 84, 73, 78, 199, 80, 73, 69, 85, 80, 45, 67, 73, - 69, 85, 67, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 82, 73, - 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 83, 73, 88, 84, 89, 45, 70, 79, - 85, 82, 84, 200, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, 128, 84, 87, - 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 87, 69, 68, 71, 69, 45, 84, 65, - 73, 76, 69, 196, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 71, - 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 77, 65, 76, 71, 65, 77, 65, - 84, 73, 79, 206, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 85, - 71, 77, 69, 78, 84, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 76, 65, - 84, 73, 79, 206, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, 128, 67, 79, - 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 84, 82, 65, 67, 84, - 73, 79, 78, 128, 67, 79, 78, 84, 82, 65, 82, 73, 69, 84, 89, 128, 67, 79, - 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 85, 78, 84, 69, 82, 66, - 79, 82, 69, 128, 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 68, 65, - 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, 69, 67, 82, 69, 83, 67, 69, - 78, 68, 79, 128, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, - 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, - 68, 69, 84, 128, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, 128, 68, 73, - 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, 68, 79, 65, 67, 72, 65, 83, 72, - 77, 69, 69, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, - 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, - 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, - 84, 83, 45, 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, - 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 128, 68, 79, - 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, - 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, - 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, 69, 65, 77, 72, 65, 78, 67, 72, - 79, 76, 76, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 70, 73, - 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 82, 79, 78, 84, 45, 84, 73, - 76, 84, 69, 196, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 72, 65, - 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 73, 69, 85, 72, 45, 77, 73, - 69, 85, 77, 128, 72, 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, - 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 82, 73, - 69, 85, 76, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, 73, 69, - 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 77, 73, - 69, 85, 77, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, 73, 78, - 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 82, 67, 65, 76, - 65, 84, 69, 128, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 75, 73, - 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 76, 65, 75, 75, 72, 65, 78, 71, - 89, 65, 79, 128, 77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 77, 73, - 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 85, 85, 83, 73, 75, 65, 84, - 79, 65, 78, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, 69, - 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 73, 69, 85, 78, 45, 80, 73, - 69, 85, 80, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 79, 66, - 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 80, 65, 82, 65, 75, 76, 73, 84, - 73, 75, 73, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, - 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 73, 69, 85, 80, 45, 78, 73, - 69, 85, 78, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 79, - 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, - 84, 73, 79, 206, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 82, 73, - 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, 82, 73, 78, 70, 79, 82, 90, 65, - 78, 68, 79, 128, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, 196, 83, 65, - 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, + 84, 79, 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 57, 57, 128, 83, 80, 82, 69, 67, 72, 71, 69, - 83, 65, 78, 199, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 84, 69, - 84, 82, 65, 70, 79, 78, 73, 65, 83, 128, 84, 72, 65, 78, 84, 72, 65, 75, - 72, 65, 84, 128, 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 79, - 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 82, 65, 78, 83, 77, 73, 83, - 83, 73, 79, 206, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, - 69, 78, 84, 89, 45, 78, 73, 78, 69, 128, 85, 78, 65, 83, 80, 73, 82, 65, - 84, 69, 68, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, 128, 83, 85, 80, - 69, 82, 83, 67, 82, 73, 80, 212, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 73, 78, 68, 69, 80, 69, - 78, 68, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 69, 88, - 67, 76, 65, 77, 65, 84, 73, 79, 206, 68, 69, 83, 67, 82, 73, 80, 84, 73, - 79, 206, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 68, 79, 85, 66, 76, - 69, 45, 76, 73, 78, 197, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 65, - 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 85, 80, 45, 80, 79, 73, 78, 84, - 73, 78, 199, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 73, 77, 80, 69, - 82, 70, 69, 67, 84, 85, 205, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, - 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 68, 79, 65, 67, 72, 65, 83, - 72, 77, 69, 197, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 76, 84, - 69, 82, 78, 65, 84, 73, 86, 197, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, - 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, - 73, 78, 69, 65, 210, 79, 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, - 80, 79, 83, 73, 84, 73, 79, 78, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, - 83, 128, 83, 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 83, 65, 78, 71, - 73, 69, 85, 78, 71, 128, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 65, - 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 67, 79, 78, 83, 69, 67, 85, 84, - 73, 86, 197, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 69, 78, 84, 69, - 82, 80, 82, 73, 83, 69, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, - 77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 71, 82, 65, - 77, 77, 79, 211, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 73, 69, - 85, 78, 45, 83, 73, 79, 83, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, - 199, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 75, 76, - 73, 84, 73, 75, 201, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 69, - 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, - 78, 128, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 73, - 76, 73, 78, 69, 65, 210, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, 212, 83, - 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 73, 79, 83, 45, 78, 73, 69, - 85, 78, 128, 83, 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, - 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, - 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 128, 84, 65, 66, 85, 76, 65, 84, - 73, 79, 78, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 72, 69, - 77, 65, 84, 73, 83, 77, 79, 211, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, - 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 65, 76, 84, 69, 82, 78, - 65, 84, 73, 79, 206, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, - 84, 73, 75, 69, 78, 79, 77, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, - 65, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 83, 84, 69, 82, - 73, 83, 67, 85, 83, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 66, - 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, 65, 82, 73, 89, 79, 79, 83, - 65, 78, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 67, 73, 82, 67, - 85, 76, 65, 84, 73, 79, 206, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, - 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 76, 73, 65, - 78, 67, 69, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 78, - 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, - 211, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 68, 69, 70, 73, 78, 73, - 84, 73, 79, 78, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 73, - 65, 69, 82, 69, 83, 73, 90, 69, 196, 68, 73, 77, 69, 78, 83, 73, 79, 78, - 65, 204, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 83, 80, 69, - 82, 83, 73, 79, 78, 128, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, - 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, 79, 84, 83, - 45, 49, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, - 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, - 68, 79, 84, 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, - 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, 68, 79, 84, - 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, - 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, - 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, 79, - 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, - 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 49, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, - 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, - 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, - 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 56, 128, - 68, 79, 84, 83, 45, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, - 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, - 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, - 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, - 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 56, 128, 69, 75, 83, 84, - 82, 69, 80, 84, 79, 78, 128, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, - 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 84, 72, 85, 83, 73, - 65, 83, 77, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, 88, 72, - 65, 85, 83, 84, 73, 79, 78, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, - 128, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 79, 82, 77, 65, 84, - 84, 73, 78, 71, 128, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, - 85, 82, 45, 83, 84, 82, 73, 78, 199, 72, 66, 65, 83, 65, 45, 69, 83, 65, - 83, 193, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 89, 80, 72, 69, - 78, 65, 84, 73, 79, 206, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, - 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 78, 70, 79, 82, 77, 65, 84, - 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, 69, 196, 75, 73, 82, 79, - 71, 85, 82, 65, 77, 85, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, - 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 73, 77, 73, 84, 65, 84, - 73, 79, 78, 128, 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 78, 65, 78, - 71, 77, 79, 78, 84, 72, 79, 128, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, - 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 79, 80, 80, 82, 69, 83, - 83, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, - 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 79, 83, 83, 69, 83, 83, 73, 79, - 78, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 74, 69, - 67, 84, 73, 86, 69, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, - 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 69, 83, 73, 83, 84, 65, 78, - 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 79, - 76, 85, 84, 73, 79, 78, 128, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, - 84, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, 79, 83, 45, - 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, - 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 84, 65, 78, 68, 83, 84, 73, - 76, 76, 128, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 83, - 84, 73, 84, 85, 84, 69, 128, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, - 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 72, 73, 82, 84, 89, 45, - 79, 78, 69, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 82, 65, - 78, 83, 86, 69, 82, 83, 65, 204, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 87, 73, 68, 69, 45, 72, - 69, 65, 68, 69, 196, 68, 69, 83, 67, 69, 78, 68, 69, 82, 128, 76, 69, 83, - 83, 45, 84, 72, 65, 78, 128, 65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 69, - 81, 85, 73, 86, 65, 76, 69, 78, 212, 83, 69, 80, 65, 82, 65, 84, 79, 82, - 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 76, 80, 65, 80, 82, 65, - 65, 78, 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 69, 88, 84, 69, 78, - 83, 73, 79, 78, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 80, 72, 65, - 82, 89, 78, 71, 69, 65, 204, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 83, - 69, 77, 73, 67, 79, 76, 79, 78, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, - 128, 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 65, 77, 80, 69, 82, 83, 65, - 78, 68, 128, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 84, 82, 79, 69, 90, - 69, 78, 73, 65, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 83, 69, 77, - 73, 68, 73, 82, 69, 67, 212, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 87, - 79, 79, 68, 83, 45, 67, 82, 69, 197, 66, 65, 67, 75, 83, 76, 65, 83, 72, - 128, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 69, 88, 84, 82, 65, 45, 72, - 73, 71, 200, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 73, 77, 80, 69, 82, - 70, 69, 67, 84, 193, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 82, 69, 67, - 84, 65, 78, 71, 76, 69, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 67, - 79, 78, 84, 65, 73, 78, 73, 78, 199, 68, 69, 76, 73, 77, 73, 84, 69, 82, - 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 80, 73, 68, 65, 85, 82, - 69, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 79, 85, 82, 71, - 76, 65, 83, 83, 128, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, - 73, 77, 73, 78, 73, 77, 193, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 84, - 82, 73, 65, 78, 71, 85, 76, 65, 210, 65, 80, 79, 83, 84, 82, 79, 70, 79, - 201, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 82, 80, 69, 71, 71, 73, - 65, 84, 207, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 67, 69, 78, 84, 82, - 69, 76, 73, 78, 197, 67, 72, 65, 82, 65, 67, 84, 69, 82, 128, 67, 79, 80, - 82, 79, 68, 85, 67, 84, 128, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 69, - 77, 66, 69, 68, 68, 73, 78, 71, 128, 70, 73, 78, 65, 78, 67, 73, 65, 76, - 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 82, 69, 84, 66, 79, 65, - 82, 68, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 79, 82, 84, 72, - 77, 73, 75, 79, 206, 73, 67, 72, 73, 77, 65, 84, 79, 83, 128, 75, 72, 65, - 75, 65, 83, 83, 73, 65, 206, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, - 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 69, 78, 84, 65, 83, 69, 77, 69, - 128, 80, 72, 73, 76, 73, 80, 80, 73, 78, 197, 83, 69, 77, 73, 67, 73, 82, - 67, 76, 197, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 80, 69, 82, - 86, 73, 83, 69, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, 89, 77, - 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, 79, - 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, - 66, 79, 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, - 89, 77, 66, 79, 76, 45, 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, - 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 84, 82, 65, 83, 69, - 77, 69, 128, 84, 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 77, 79, - 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, 79, 45, 51, 128, 84, 82, 73, - 71, 82, 65, 77, 77, 79, 211, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 65, - 65, 66, 65, 65, 70, 73, 76, 73, 128, 65, 66, 85, 78, 68, 65, 78, 67, 69, - 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 78, 84, 73, 70, 79, 78, - 73, 65, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, 82, 45, 82, 65, - 72, 69, 69, 77, 128, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 84, 84, - 69, 78, 84, 73, 79, 78, 128, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, - 69, 71, 73, 78, 78, 73, 78, 71, 128, 66, 73, 66, 76, 69, 45, 67, 82, 69, - 197, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 72, 65, 86, 73, 89, 65, - 78, 73, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, 79, 77, 80, 76, - 69, 84, 69, 68, 128, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 80, - 89, 82, 73, 71, 72, 84, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, - 65, 82, 75, 69, 78, 73, 78, 71, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, - 128, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 73, 70, 70, 69, 82, 69, - 78, 67, 197, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, - 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, - 83, 45, 49, 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, - 52, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, - 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, - 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, - 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, - 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, - 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, - 79, 84, 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, - 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, - 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, - 79, 84, 83, 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, - 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, - 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, - 83, 45, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 128, 68, - 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, - 54, 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, - 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, - 79, 84, 83, 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, - 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, - 54, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, - 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, - 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, - 79, 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 69, 69, 66, 69, 69, 70, 73, - 76, 73, 128, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 78, 68, 69, 65, - 86, 79, 85, 82, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 83, 84, - 73, 77, 65, 84, 69, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, - 89, 66, 69, 89, 70, 73, 76, 73, 128, 70, 79, 79, 84, 83, 84, 79, 79, 76, - 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 82, 73, 67, 65, 84, 73, - 86, 69, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 69, 77, 73, 78, - 65, 84, 73, 79, 206, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 79, 82, - 71, 79, 84, 69, 82, 73, 128, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, - 85, 82, 65, 77, 85, 84, 79, 78, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, - 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 89, 83, 84, 69, 82, 69, - 83, 73, 211, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 77, 73, 70, 84, - 72, 79, 82, 65, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, - 82, 69, 77, 69, 78, 84, 128, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, - 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 78, 79, 67, 69, 78, 67, 69, - 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 74, 69, 82, 85, 83, 65, 76, - 69, 77, 128, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 69, 77, 80, 72, - 82, 69, 78, 71, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 73, 82, - 79, 87, 65, 84, 84, 79, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, - 85, 82, 85, 90, 69, 73, 82, 79, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, - 128, 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 73, 71, 72, 84, 78, 73, - 78, 71, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, 84, 69, 82, - 73, 65, 76, 83, 128, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 73, 82, - 73, 66, 65, 65, 82, 85, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, - 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 85, 75, 80, 72, 82, 69, 78, 71, - 128, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 79, 65, 66, 79, 65, 70, 73, - 76, 73, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 82, 84, 72, 79, - 71, 79, 78, 65, 204, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 82, - 65, 71, 82, 65, 80, 72, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, - 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, - 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 79, 82, 82, 69, 67, 84, - 85, 83, 128, 80, 82, 65, 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, - 77, 85, 79, 89, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 81, 85, 65, - 84, 69, 82, 78, 73, 79, 206, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, - 85, 83, 72, 83, 72, 65, 89, 65, 128, 82, 69, 71, 73, 83, 84, 69, 82, 69, - 196, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 80, 82, 69, 83, 69, - 78, 84, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, 85, 80, - 73, 78, 85, 83, 128, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 83, 67, 65, - 78, 68, 73, 67, 85, 83, 128, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, 83, - 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, - 128, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, - 82, 69, 196, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 83, - 84, 82, 73, 78, 199, 83, 84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, - 79, 75, 69, 45, 49, 49, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, - 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 89, 77, 66, 79, 76, 45, 49, 48, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, - 76, 45, 50, 49, 128, 83, 89, 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, - 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, 45, 50, 54, 128, 83, - 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, - 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, 89, 77, 66, 79, 76, 45, - 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 52, 48, 128, 83, - 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, - 128, 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, - 52, 55, 128, 83, 89, 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, - 76, 45, 52, 57, 128, 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 84, 65, 75, - 72, 65, 76, 76, 85, 83, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, - 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, 72, 82, 69, 69, 45, 76, 73, 78, - 197, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 70, 79, 78, 73, - 65, 83, 128, 84, 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 85, 84, 69, 89, - 65, 83, 65, 84, 128, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 87, 65, 83, - 83, 65, 76, 76, 65, 77, 128, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, - 79, 82, 68, 83, 80, 65, 67, 69, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, - 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 68, 79, 87, 78, 87, 65, 82, 68, - 211, 84, 82, 73, 65, 78, 71, 76, 69, 128, 79, 80, 69, 82, 65, 84, 79, 82, - 128, 83, 85, 66, 83, 67, 82, 73, 80, 212, 84, 72, 79, 85, 83, 65, 78, 68, - 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 81, 85, 79, 84, 65, 84, 73, 79, - 206, 65, 83, 84, 69, 82, 73, 83, 75, 128, 79, 82, 78, 65, 77, 69, 78, 84, - 128, 82, 69, 84, 82, 79, 70, 76, 69, 216, 65, 82, 67, 72, 65, 73, 79, 78, - 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 66, 76, 65, 67, 75, 70, 79, 79, - 212, 68, 69, 78, 84, 73, 83, 84, 82, 217, 68, 73, 65, 76, 89, 84, 73, 75, - 193, 73, 78, 84, 69, 71, 82, 65, 76, 128, 65, 78, 85, 83, 86, 65, 82, 65, - 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 76, 69, 70, 84, 45, 83, 84, 69, - 205, 82, 69, 67, 89, 67, 76, 73, 78, 199, 65, 66, 75, 72, 65, 83, 73, 65, - 206, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 79, 68, 69, 75, 65, 84, 65, - 128, 69, 76, 76, 73, 80, 83, 73, 83, 128, 81, 85, 65, 68, 82, 65, 78, 84, - 128, 81, 85, 65, 68, 82, 85, 80, 76, 197, 68, 73, 65, 84, 79, 78, 73, 75, - 201, 69, 78, 67, 76, 79, 83, 73, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, - 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, - 196, 73, 84, 69, 82, 65, 84, 73, 79, 206, 78, 79, 84, 69, 72, 69, 65, 68, - 128, 78, 85, 77, 69, 82, 65, 84, 79, 210, 65, 86, 65, 71, 82, 65, 72, 65, - 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 78, - 128, 78, 73, 78, 69, 84, 69, 69, 78, 128, 83, 85, 80, 69, 82, 83, 69, 84, - 128, 84, 72, 73, 82, 84, 69, 69, 78, 128, 68, 73, 65, 71, 79, 78, 65, 76, - 128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 70, 76, 79, 82, 69, 84, 84, 69, - 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 75, 69, 78, 84, 73, 77, 65, 84, - 193, 80, 65, 82, 65, 71, 82, 65, 80, 200, 82, 69, 76, 65, 84, 73, 79, 78, - 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 69, 66, 65, 84, 66, 69, 73, - 212, 83, 69, 80, 65, 82, 65, 84, 79, 210, 65, 76, 84, 69, 82, 78, 65, 84, - 197, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 69, 80, 65, 82, 84, 73, 78, - 199, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 73, 83, 72, 72, 79, 79, 75, - 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 77, 79, 85, 78, 84, 65, 73, 78, - 128, 77, 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 85, 82, 68, 72, 65, 74, - 193, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 82, 69, 67, 69, 68, 69, 83, - 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 80, 72, 69, 82, 73, 67, 65, - 204, 83, 85, 66, 76, 73, 78, 69, 65, 210, 83, 85, 67, 67, 69, 69, 68, 83, - 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 84, 69, 76, 69, 80, 72, 79, 78, - 197, 84, 72, 79, 85, 83, 65, 78, 68, 211, 89, 69, 83, 73, 69, 85, 78, 71, - 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 67, 65, 85, 76, 68, 82, 79, 78, - 128, 67, 79, 78, 83, 84, 65, 78, 84, 128, 68, 73, 70, 79, 78, 73, 65, 83, - 128, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 82, 65, 67, 72, 77, 65, 83, - 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 71, 65, 82, 83, 72, 85, 78, 73, - 128, 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 76, 73, 83, 83, 65, 78, 68, - 207, 71, 82, 69, 71, 79, 82, 73, 65, 206, 73, 78, 67, 82, 69, 65, 83, 69, - 128, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 86, 73, 83, 73, 66, 76, - 197, 73, 83, 45, 80, 73, 76, 76, 65, 128, 79, 86, 69, 82, 82, 73, 68, 69, - 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 80, 69, 68, 69, 83, 84, 65, 76, - 128, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 82, 65, 77, 45, 66, 85, 79, - 206, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 79, 76, 79, 78, 71, 69, - 196, 80, 82, 79, 80, 69, 76, 76, 69, 210, 82, 69, 83, 79, 85, 82, 67, 69, - 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 86, 69, 82, 83, 69, 68, - 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 85, 66, 71, 82, 79, 85, 80, - 128, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 89, 77, 66, 79, 76, 45, 49, - 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 55, - 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, 89, 77, 77, 69, 84, 82, 73, - 195, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 82, 73, 83, 73, 77, 79, 85, - 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 85, 78, 68, 69, 82, 76, 73, 78, - 197, 85, 78, 68, 69, 82, 84, 73, 69, 128, 85, 78, 73, 86, 69, 82, 83, 65, - 204, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 69, 69, 89, 65, 78, 78, 65, - 128, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 78, 85, 68, 65, 84, 84, 65, - 128, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 84, 72, 69, 77, 65, - 128, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, 81, 85, 65, 82, 73, 85, 83, - 128, 65, 82, 45, 82, 65, 72, 77, 65, 206, 65, 82, 65, 69, 65, 45, 69, 79, - 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 73, 83, 84, 69, 82, 65, - 128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 84, 69, 82, 73, 83, 75, - 211, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 84, 84, 72, 65, 67, 65, 78, - 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 69, 86, 69, 82, 65, 71, 69, - 128, 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 83, 69, 67, 84, 73, 78, - 199, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 82, 65, 78, 67, 72, 73, 78, - 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 83, 83, 89, 69, 82, 85, - 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 82, 89, 83, 84, 73, 65, - 206, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 84, 84, 65, 87, 65, - 128, 67, 73, 86, 73, 76, 73, 65, 78, 128, 67, 76, 73, 77, 65, 67, 85, 83, - 128, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 71, 82, 85, 69, 78, - 212, 67, 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 84, 79, 85, 82, 69, - 196, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 82, 69, 83, 67, 69, 78, 84, - 128, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 82, 75, 69, 78, 73, 78, - 199, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 69, 67, 69, 77, 66, 69, 82, - 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 76, 73, 77, 73, 84, 69, - 210, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 71, 79, 82, 71, 79, 78, - 128, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, 79, 84, 83, 45, 49, 50, 51, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, 79, 84, 83, 45, 49, 50, 53, - 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, 50, 55, - 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, - 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, 51, 54, - 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, 45, 49, 51, 56, - 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, 45, 49, 52, 54, - 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, 84, 83, 45, 49, 52, 56, - 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, 84, 83, 45, 49, 53, 55, - 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, - 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, 84, 83, 45, 50, 51, 53, - 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 55, - 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 55, - 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, - 128, 68, 79, 84, 83, 45, 50, 53, 55, 128, 68, 79, 84, 83, 45, 50, 53, 56, - 128, 68, 79, 84, 83, 45, 50, 54, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, - 128, 68, 79, 84, 83, 45, 50, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, - 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, 52, 55, - 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, - 128, 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, 56, - 128, 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, 56, - 128, 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, - 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 56, - 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, - 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, - 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, - 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, 84, 84, 69, 68, 45, 76, - 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 80, - 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 86, 73, 83, 86, 65, 82, 65, - 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 78, 86, 69, 76, 79, 80, 69, - 128, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 83, 84, 73, 77, 65, 84, 69, - 196, 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 84, 69, 82, 78, 73, 84, 89, - 128, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 84, 72, 65, 84, 65, 78, - 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 83, 84, 73, 86, 65, 76, - 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 69, 45, 50, - 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 86, 69, 45, 76, 73, 78, - 197, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 82, 65, 71, 77, 69, 78, 84, - 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 85, 76, 76, 78, 69, 83, 83, - 128, 70, 85, 78, 67, 84, 73, 79, 78, 128, 71, 69, 78, 73, 84, 73, 86, 69, - 128, 71, 69, 79, 77, 69, 84, 82, 73, 195, 72, 65, 78, 45, 65, 75, 65, 84, - 128, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 77, 79, 78, 73, 67, - 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, 85, 65, 82, 65, 68, 68, 79, - 128, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, - 128, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, 67, 82, 69, 65, 83, 69, - 211, 73, 82, 85, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, 89, 65, 78, 73, - 128, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 84, 72, 73, 83, 84, 73, - 128, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 79, 78, 84, 69, 86, 77, 65, - 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 76, 65, 82, 89, 78, 71, 69, 65, - 204, 76, 69, 70, 84, 45, 83, 73, 68, 197, 76, 73, 65, 66, 73, 76, 73, 84, - 217, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 82, 82, 65, 73, 78, 69, - 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 73, 77, 65, 76, 65, 73, - 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 78, 71, 65, 76, 65, 77, - 128, 77, 65, 83, 67, 85, 76, 73, 78, 197, 77, 69, 68, 73, 67, 73, 78, 69, - 128, 77, 69, 83, 83, 69, 78, 73, 65, 206, 77, 73, 78, 73, 83, 84, 69, 82, - 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 78, 73, 75, 72, 65, 72, 73, 84, - 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 86, 69, 77, 66, 69, 82, - 128, 79, 86, 69, 82, 76, 65, 73, 68, 128, 80, 65, 65, 83, 69, 78, 84, 79, - 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 76, 79, 67, 72, 75, 65, - 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 82, 73, 67, 72, 79, 78, - 128, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 69, 76, 65, 83, 84, 79, 78, - 128, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80, 73, 84, 67, 72, 70, 79, 82, - 203, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 79, 82, 82, 69, 67, 84, 85, - 211, 80, 82, 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 80, 73, 73, - 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 71, 82, 69, 83, 83, - 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 81, 65, 73, 82, 84, 72, 82, 65, - 128, 81, 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 69, 83, 84, 73, 79, 78, - 128, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 79, 82, 68, 69, 82, - 128, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 84, 65, 78, 71, 76, - 197, 82, 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, 76, 73, 71, 73, 79, 78, - 128, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 73, 71, 72, 84, 72, 65, 78, - 196, 82, 85, 75, 75, 65, 75, 72, 65, 128, 83, 65, 78, 84, 73, 73, 77, 85, - 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 67, 65, 78, 68, 73, 67, 85, - 211, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 69, 77, 73, 67, 79, 76, 79, - 206, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 72, 65, 77, 82, 79, 67, 75, - 128, 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 73, 67, 75, 78, 69, 83, 83, - 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, 84, 65, 76, 76, 73, 79, 78, - 128, 83, 84, 79, 80, 80, 65, 71, 69, 128, 83, 84, 79, 80, 80, 73, 78, 71, - 128, 83, 84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 69, 84, 67, 72, 69, - 196, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, 69, 45, 50, - 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 52, - 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 54, - 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 56, - 128, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 85, 73, 84, 65, 66, 76, 69, - 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 89, 77, 66, 79, 76, 45, 51, - 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, 89, 77, 66, 79, 76, 45, 57, - 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 78, 68, 69, 83, 77, 79, - 211, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 69, 84, 82, 65, 80, 76, 73, - 128, 84, 79, 82, 67, 85, 76, 85, 83, 128, 84, 82, 69, 65, 68, 73, 78, 71, - 128, 84, 82, 73, 67, 79, 76, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 78, - 128, 84, 82, 85, 78, 67, 65, 84, 69, 196, 85, 73, 76, 76, 69, 65, 78, 78, - 128, 85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 78, 68, 69, 82, 68, 79, 84, - 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 86, 69, 82, 83, 73, 67, 76, 69, - 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 83, 65, 76, 76, 65, 77, - 128, 89, 65, 77, 65, 75, 75, 65, 78, 128, 89, 80, 79, 75, 82, 73, 83, 73, - 211, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 87, 65, 82, 65, 75, 65, 89, - 128, 73, 78, 86, 69, 82, 84, 69, 196, 78, 69, 71, 65, 84, 73, 86, 197, - 85, 71, 65, 82, 73, 84, 73, 195, 66, 85, 71, 73, 78, 69, 83, 197, 72, 85, - 78, 68, 82, 69, 68, 128, 67, 69, 68, 73, 76, 76, 65, 128, 84, 82, 73, 65, - 78, 71, 76, 197, 78, 79, 84, 69, 72, 69, 65, 196, 83, 85, 80, 69, 82, 83, - 69, 212, 70, 82, 65, 67, 84, 73, 79, 206, 81, 85, 69, 83, 84, 73, 79, - 206, 84, 65, 71, 66, 65, 78, 87, 193, 81, 85, 65, 68, 82, 65, 78, 212, - 68, 73, 65, 71, 79, 78, 65, 204, 85, 80, 83, 73, 76, 79, 78, 128, 79, 86, - 69, 82, 76, 65, 89, 128, 77, 65, 82, 84, 89, 82, 73, 193, 79, 86, 69, 82, - 66, 65, 82, 128, 68, 73, 65, 77, 79, 78, 68, 128, 69, 80, 83, 73, 76, 79, - 78, 128, 72, 65, 78, 71, 90, 72, 79, 213, 73, 78, 84, 69, 71, 82, 65, - 204, 77, 69, 65, 83, 85, 82, 69, 196, 79, 77, 73, 67, 82, 79, 78, 128, - 84, 79, 82, 84, 79, 73, 83, 197, 79, 82, 78, 65, 77, 69, 78, 212, 86, 73, - 83, 65, 82, 71, 65, 128, 69, 88, 84, 69, 78, 68, 69, 196, 72, 65, 82, 80, - 79, 79, 78, 128, 80, 82, 69, 67, 69, 68, 69, 211, 83, 79, 76, 73, 68, 85, - 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 84, 72, 69, 83, 80, 73, 65, - 206, 67, 79, 78, 84, 65, 73, 78, 211, 68, 73, 71, 82, 65, 80, 72, 128, - 77, 69, 84, 82, 73, 67, 65, 204, 77, 79, 78, 79, 71, 82, 65, 205, 67, 82, - 79, 83, 83, 73, 78, 199, 83, 73, 77, 65, 78, 83, 73, 211, 83, 84, 65, 84, - 69, 82, 83, 128, 83, 85, 66, 85, 78, 73, 84, 128, 83, 73, 68, 69, 87, 65, - 89, 211, 83, 81, 85, 65, 82, 69, 68, 128, 84, 65, 76, 69, 78, 84, 83, - 128, 84, 72, 79, 85, 83, 65, 78, 196, 66, 65, 82, 76, 73, 78, 69, 128, - 68, 73, 86, 73, 83, 73, 79, 206, 73, 79, 84, 73, 70, 73, 69, 196, 80, 65, - 82, 65, 76, 76, 69, 204, 83, 73, 88, 84, 69, 69, 78, 128, 83, 85, 66, 71, - 82, 79, 85, 208, 83, 85, 82, 82, 79, 85, 78, 196, 85, 80, 87, 65, 82, 68, - 83, 128, 70, 73, 70, 84, 69, 69, 78, 128, 79, 80, 69, 82, 65, 84, 79, - 210, 79, 82, 73, 71, 73, 78, 65, 204, 68, 73, 65, 83, 84, 79, 76, 201, - 68, 73, 86, 73, 68, 69, 82, 128, 70, 65, 84, 72, 65, 84, 65, 206, 73, 90, - 72, 73, 84, 83, 65, 128, 77, 89, 83, 76, 73, 84, 69, 128, 80, 79, 73, 78, - 84, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 212, 65, 83, 84, 69, 82, 73, - 83, 203, 66, 65, 89, 65, 78, 78, 65, 128, 67, 72, 82, 79, 78, 79, 78, - 128, 68, 73, 71, 79, 82, 71, 79, 206, 69, 73, 71, 72, 84, 72, 83, 128, - 70, 73, 78, 71, 69, 82, 69, 196, 71, 65, 89, 65, 78, 78, 65, 128, 72, 65, - 82, 75, 76, 69, 65, 206, 74, 65, 89, 65, 78, 78, 65, 128, 75, 79, 82, 79, - 78, 73, 83, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 79, 90, 69, 78, 71, - 69, 128, 77, 65, 75, 83, 85, 82, 65, 128, 78, 79, 45, 66, 82, 69, 65, - 203, 80, 73, 78, 87, 72, 69, 69, 204, 81, 85, 65, 82, 84, 69, 82, 211, - 82, 69, 80, 69, 65, 84, 69, 196, 83, 65, 89, 65, 78, 78, 65, 128, 83, 69, - 76, 69, 67, 84, 79, 210, 83, 81, 85, 73, 71, 71, 76, 197, 84, 69, 84, 65, - 82, 84, 79, 211, 84, 82, 79, 77, 73, 75, 79, 206, 65, 67, 84, 73, 86, 65, - 84, 197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 75, 72, 77, 73, 77, 73, - 195, 65, 80, 79, 68, 69, 82, 77, 193, 65, 82, 73, 83, 84, 69, 82, 193, - 66, 69, 84, 87, 69, 69, 78, 128, 66, 73, 76, 65, 66, 73, 65, 204, 67, 65, - 89, 65, 78, 78, 65, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 72, 65, 82, - 73, 79, 84, 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 82, 79, 78, 79, - 85, 128, 67, 76, 79, 84, 72, 69, 83, 128, 67, 79, 82, 78, 69, 82, 83, - 128, 68, 65, 77, 77, 65, 84, 65, 206, 68, 65, 80, 45, 66, 85, 79, 206, - 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, 80, 82, 65, 205, 68, 69, - 89, 84, 69, 82, 79, 211, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 83, 73, - 77, 79, 85, 128, 69, 77, 80, 72, 65, 83, 73, 211, 70, 69, 77, 73, 78, 73, - 78, 197, 70, 69, 82, 77, 65, 84, 65, 128, 70, 73, 83, 72, 72, 79, 79, - 203, 71, 76, 65, 71, 79, 76, 73, 128, 73, 78, 72, 69, 82, 69, 78, 212, - 73, 78, 84, 69, 82, 73, 79, 210, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, - 89, 65, 78, 78, 65, 128, 75, 79, 77, 66, 85, 86, 65, 128, 76, 45, 83, 72, - 65, 80, 69, 196, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 89, 65, 78, 78, - 65, 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 79, 71, 79, 84, 89, 80, - 197, 77, 69, 65, 83, 85, 82, 69, 128, 77, 85, 76, 84, 73, 83, 69, 212, - 78, 65, 89, 65, 78, 78, 65, 128, 79, 77, 73, 83, 83, 73, 79, 206, 80, 65, - 89, 65, 78, 78, 65, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 84, 65, - 76, 76, 69, 196, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 45, 80, - 73, 201, 81, 85, 65, 82, 84, 69, 82, 128, 82, 71, 89, 73, 78, 71, 83, - 128, 83, 45, 83, 72, 65, 80, 69, 196, 83, 69, 77, 73, 83, 79, 70, 212, - 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 72, - 65, 80, 73, 78, 71, 128, 83, 72, 84, 65, 80, 73, 67, 128, 83, 79, 67, 73, - 69, 84, 89, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 69, 67, 73, 65, - 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 82, 79, 75, 69, 83, - 128, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 85, 78, 68, 69, 82, 128, - 84, 82, 73, 83, 69, 77, 69, 128, 85, 66, 65, 68, 65, 77, 65, 128, 87, 65, - 73, 84, 73, 78, 71, 128, 90, 72, 73, 86, 69, 84, 69, 128, 65, 65, 89, 65, - 78, 78, 65, 128, 65, 66, 65, 70, 73, 76, 73, 128, 65, 68, 86, 65, 78, 67, - 69, 128, 65, 69, 89, 65, 78, 78, 65, 128, 65, 73, 89, 65, 78, 78, 65, - 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, 76, 86, 69, 79, 76, 65, 210, - 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, - 85, 83, 86, 65, 82, 193, 65, 80, 79, 84, 72, 69, 83, 128, 65, 82, 65, 69, - 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 85, 128, 65, 82, 67, 72, 65, 73, - 79, 206, 65, 82, 79, 85, 83, 73, 78, 199, 65, 85, 89, 65, 78, 78, 65, - 128, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 73, 82, 75, 65, 78, 128, - 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, - 84, 72, 84, 85, 66, 128, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 76, 71, - 84, 72, 79, 210, 66, 69, 82, 75, 65, 78, 65, 206, 66, 73, 68, 69, 78, 84, - 65, 204, 66, 79, 85, 78, 68, 65, 82, 217, 66, 82, 65, 75, 67, 69, 84, - 128, 66, 82, 73, 83, 84, 76, 69, 128, 66, 85, 85, 77, 73, 83, 72, 128, - 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, - 82, 82, 73, 65, 71, 197, 67, 69, 76, 83, 73, 85, 83, 128, 67, 72, 65, 77, - 73, 76, 73, 128, 67, 76, 73, 78, 71, 73, 78, 199, 67, 79, 77, 80, 65, 82, - 69, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 84, 65, 67, 84, - 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 82, 69, 67, 84, 128, - 67, 82, 69, 65, 84, 73, 86, 197, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, - 85, 90, 69, 73, 82, 207, 67, 85, 83, 84, 79, 77, 69, 210, 67, 87, 69, 79, - 82, 84, 72, 128, 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 82, 69, 78, 65, - 73, 195, 68, 65, 71, 65, 76, 71, 65, 128, 68, 69, 67, 65, 89, 69, 68, - 128, 68, 69, 89, 84, 69, 82, 79, 213, 68, 72, 65, 76, 65, 84, 72, 128, - 68, 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, - 71, 82, 65, 77, 77, 193, 68, 73, 77, 77, 73, 78, 71, 128, 68, 73, 80, 76, - 79, 85, 78, 128, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 86, 73, 68, 69, - 83, 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 51, - 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 53, 128, - 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 55, 128, 68, 79, - 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, - 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, 45, 50, - 54, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 56, - 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, 53, 128, - 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, - 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, - 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, - 56, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 55, - 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, - 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, 82, - 65, 67, 72, 77, 65, 128, 68, 82, 65, 70, 84, 73, 78, 199, 69, 65, 66, 72, - 65, 68, 72, 128, 69, 65, 68, 72, 65, 68, 72, 128, 69, 66, 69, 70, 73, 76, - 73, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 76, 65, 70, 82, 79, 78, - 128, 69, 76, 69, 67, 84, 82, 73, 195, 69, 78, 81, 85, 73, 82, 89, 128, - 69, 78, 84, 69, 82, 73, 78, 199, 69, 84, 78, 65, 72, 84, 65, 128, 69, 86, - 69, 78, 73, 78, 71, 128, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 89, 65, - 78, 78, 65, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 73, 83, 72, 69, 89, - 69, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, 79, 84, 78, 79, 84, - 197, 70, 79, 85, 82, 84, 69, 69, 206, 70, 82, 79, 87, 78, 73, 78, 199, - 71, 65, 82, 77, 69, 78, 84, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 82, - 65, 80, 72, 69, 77, 197, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 76, 65, - 78, 84, 65, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 83, 65, 78, 84, - 65, 128, 72, 65, 89, 65, 78, 78, 65, 128, 72, 69, 65, 68, 73, 78, 71, - 128, 72, 69, 65, 86, 69, 78, 76, 217, 73, 45, 65, 82, 65, 69, 65, 128, - 73, 66, 73, 70, 73, 76, 73, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 73, - 89, 65, 78, 78, 65, 128, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 70, 73, - 78, 73, 84, 217, 73, 78, 84, 69, 82, 69, 83, 212, 73, 79, 68, 72, 65, 68, - 72, 128, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, 80, 65, 78, 69, 83, - 197, 74, 85, 80, 73, 84, 69, 82, 128, 75, 65, 75, 65, 66, 65, 84, 128, - 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 73, - 78, 83, 72, 73, 80, 128, 75, 79, 78, 84, 69, 86, 77, 193, 75, 79, 79, 77, - 85, 85, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 76, 65, 78, 71, 85, 65, - 71, 197, 76, 79, 67, 65, 84, 73, 79, 206, 77, 65, 73, 75, 85, 82, 79, - 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, 78, 83, 89, 79, 78, 128, - 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, - 82, 82, 73, 65, 71, 197, 77, 65, 82, 82, 89, 73, 78, 199, 77, 65, 83, 83, - 73, 78, 71, 128, 77, 65, 89, 65, 78, 78, 65, 128, 77, 69, 71, 65, 84, 79, - 78, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, 69, 84, 82, 69, 84, 69, - 211, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 76, 76, 73, 79, 78, 211, - 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, - 82, 78, 73, 78, 71, 128, 77, 85, 76, 84, 73, 80, 76, 197, 78, 65, 84, 73, - 79, 78, 65, 204, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 80, 84, 85, 78, - 69, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 71, 69, 65, 68, 65, 76, - 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 78, 69, 84, 69, 69, 206, - 79, 66, 79, 70, 73, 76, 73, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 78, - 69, 45, 76, 73, 78, 197, 79, 78, 69, 83, 69, 76, 70, 128, 79, 79, 89, 65, - 78, 78, 65, 128, 79, 82, 84, 72, 79, 68, 79, 216, 79, 85, 84, 76, 73, 78, - 69, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 76, 76, 65, 87, 65, - 128, 80, 65, 84, 84, 69, 82, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, - 80, 69, 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 72, - 73, 78, 84, 72, 85, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 79, 68, 65, - 84, 85, 83, 128, 80, 82, 69, 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, - 69, 196, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 73, 86, 65, 84, 69, - 128, 80, 82, 79, 80, 69, 82, 84, 217, 82, 65, 75, 72, 65, 78, 71, 128, - 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 89, 65, 78, 78, 65, 128, 82, 69, - 65, 72, 77, 85, 75, 128, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 84, 82, - 69, 65, 84, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 85, 85, 66, 85, 82, - 85, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 76, 84, 73, 82, 69, - 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 78, 89, 79, 79, 71, 193, - 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 69, - 71, 77, 69, 78, 84, 128, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 78, 75, - 73, 78, 71, 128, 83, 73, 82, 73, 78, 71, 85, 128, 83, 73, 88, 45, 76, 73, - 78, 197, 83, 78, 79, 87, 77, 65, 78, 128, 83, 80, 73, 82, 65, 78, 84, - 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, 81, 85, 65, 82, 69, 83, 128, - 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, - 65, 86, 82, 79, 85, 128, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, 82, 73, - 67, 84, 76, 217, 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 67, 67, 69, 69, - 68, 128, 83, 89, 78, 69, 86, 77, 65, 128, 84, 65, 73, 83, 89, 79, 85, - 128, 84, 65, 84, 87, 69, 69, 76, 128, 84, 67, 72, 69, 72, 69, 72, 128, - 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 83, 69, 82, 65, 128, 84, 72, - 73, 82, 84, 69, 69, 206, 84, 72, 85, 82, 73, 83, 65, 218, 84, 73, 78, 65, - 71, 77, 65, 128, 84, 73, 82, 79, 78, 73, 65, 206, 84, 79, 82, 67, 85, 76, - 85, 211, 84, 82, 73, 73, 83, 65, 80, 128, 84, 82, 89, 66, 76, 73, 79, - 206, 84, 86, 73, 77, 65, 68, 85, 210, 84, 87, 79, 45, 76, 73, 78, 197, - 85, 45, 69, 79, 45, 69, 85, 128, 85, 66, 85, 70, 73, 76, 73, 128, 85, 77, - 66, 82, 69, 76, 76, 193, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 89, 65, - 78, 78, 65, 128, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, 76, 76, 65, 71, - 69, 128, 86, 79, 73, 67, 73, 78, 71, 128, 87, 65, 83, 65, 76, 76, 65, - 205, 87, 65, 83, 84, 73, 78, 71, 128, 89, 65, 89, 65, 78, 78, 65, 128, - 89, 79, 85, 84, 72, 70, 85, 204, 89, 80, 79, 82, 82, 79, 73, 128, 79, 83, - 77, 65, 78, 89, 193, 67, 73, 82, 67, 76, 69, 128, 66, 82, 65, 67, 75, 69, - 212, 85, 80, 83, 73, 76, 79, 206, 65, 67, 67, 69, 78, 84, 128, 68, 73, - 78, 71, 66, 65, 212, 69, 80, 83, 73, 76, 79, 206, 83, 76, 65, 78, 84, 69, - 196, 83, 81, 85, 65, 82, 69, 128, 72, 65, 78, 85, 78, 79, 207, 68, 65, - 71, 69, 83, 72, 128, 71, 76, 79, 84, 84, 65, 204, 84, 65, 71, 65, 76, 79, - 199, 79, 77, 73, 67, 82, 79, 206, 80, 65, 76, 65, 84, 65, 204, 78, 65, - 83, 75, 65, 80, 201, 67, 79, 82, 78, 69, 82, 128, 69, 76, 69, 77, 69, 78, - 212, 66, 85, 76, 76, 69, 84, 128, 68, 79, 84, 76, 69, 83, 211, 79, 71, - 79, 78, 69, 75, 128, 86, 73, 82, 65, 77, 65, 128, 75, 73, 82, 71, 72, 73, - 218, 82, 69, 86, 69, 82, 83, 197, 68, 73, 65, 77, 79, 78, 196, 84, 87, - 69, 78, 84, 89, 128, 68, 79, 85, 66, 76, 69, 128, 78, 69, 73, 84, 72, 69, - 210, 81, 85, 65, 82, 84, 69, 210, 83, 73, 77, 73, 76, 65, 210, 83, 73, - 78, 71, 76, 69, 128, 83, 79, 76, 73, 68, 85, 211, 83, 81, 85, 65, 82, 69, - 196, 67, 72, 73, 78, 69, 83, 197, 78, 85, 78, 65, 86, 73, 203, 83, 85, - 66, 83, 69, 84, 128, 84, 72, 45, 67, 82, 69, 197, 84, 82, 73, 71, 82, 65, - 205, 65, 82, 75, 84, 73, 75, 207, 69, 76, 69, 86, 69, 78, 128, 72, 85, - 78, 68, 82, 69, 196, 72, 89, 80, 72, 69, 78, 128, 73, 78, 83, 73, 68, 69, - 128, 77, 65, 82, 75, 69, 82, 128, 79, 80, 69, 78, 73, 78, 199, 84, 87, - 69, 76, 86, 69, 128, 69, 73, 71, 72, 84, 72, 211, 80, 65, 82, 84, 73, 65, - 204, 84, 72, 73, 82, 84, 89, 128, 86, 82, 65, 67, 72, 89, 128, 65, 82, - 82, 79, 87, 83, 128, 70, 65, 76, 76, 73, 78, 199, 79, 66, 76, 73, 81, 85, - 197, 80, 69, 82, 67, 69, 78, 212, 84, 72, 82, 79, 85, 71, 200, 67, 69, - 68, 73, 76, 76, 193, 67, 79, 78, 84, 82, 79, 204, 67, 85, 82, 86, 73, 78, - 199, 68, 73, 71, 82, 65, 80, 200, 69, 81, 85, 65, 76, 83, 128, 70, 73, - 76, 76, 69, 82, 128, 71, 65, 78, 71, 73, 65, 128, 73, 78, 86, 69, 82, 83, - 197, 73, 79, 84, 65, 84, 69, 196, 75, 69, 78, 84, 73, 77, 193, 77, 69, - 65, 83, 85, 82, 197, 82, 79, 85, 78, 68, 69, 196, 83, 65, 78, 89, 65, 75, - 193, 84, 67, 72, 69, 72, 69, 200, 84, 79, 80, 66, 65, 82, 128, 84, 85, - 82, 84, 76, 69, 128, 89, 73, 68, 68, 73, 83, 200, 45, 75, 72, 89, 73, 76, - 128, 66, 79, 84, 84, 79, 77, 128, 67, 69, 78, 84, 82, 69, 128, 67, 69, - 78, 84, 82, 69, 196, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 79, 85, - 210, 67, 82, 79, 83, 83, 69, 196, 68, 65, 78, 84, 65, 74, 193, 68, 73, - 86, 73, 68, 69, 196, 68, 79, 84, 84, 69, 68, 128, 68, 82, 65, 71, 79, 78, - 128, 70, 73, 70, 84, 72, 83, 128, 72, 69, 65, 86, 69, 78, 128, 75, 79, - 77, 66, 85, 86, 193, 75, 82, 65, 84, 73, 77, 193, 76, 69, 65, 68, 69, 82, - 128, 77, 65, 82, 66, 85, 84, 193, 77, 69, 77, 66, 69, 82, 128, 78, 65, - 84, 85, 82, 65, 204, 78, 73, 78, 69, 84, 89, 128, 80, 69, 78, 67, 73, 76, - 128, 81, 65, 77, 65, 84, 83, 128, 83, 75, 76, 73, 82, 79, 206, 83, 79, - 71, 68, 73, 65, 206, 83, 84, 73, 71, 77, 65, 128, 83, 89, 78, 65, 71, 77, - 193, 84, 65, 65, 76, 85, 74, 193, 84, 72, 69, 83, 69, 79, 211, 84, 79, - 78, 71, 85, 69, 128, 65, 67, 65, 68, 69, 77, 217, 65, 67, 67, 79, 85, 78, - 212, 65, 78, 67, 72, 79, 82, 128, 65, 78, 67, 79, 82, 65, 128, 65, 80, - 76, 79, 85, 78, 128, 65, 82, 67, 72, 65, 73, 195, 66, 65, 76, 85, 68, 65, - 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 83, 72, 75, 73, 210, 66, 73, - 78, 68, 73, 78, 199, 66, 73, 83, 72, 79, 80, 128, 66, 79, 87, 84, 73, 69, - 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 82, 73, 86, 73, 128, 67, 76, - 85, 83, 84, 69, 210, 68, 65, 71, 71, 69, 82, 128, 68, 65, 80, 45, 66, 69, - 201, 68, 65, 80, 45, 80, 73, 201, 68, 69, 67, 73, 77, 65, 204, 68, 73, - 86, 73, 68, 69, 128, 68, 74, 69, 82, 86, 73, 128, 68, 79, 85, 66, 76, 69, - 196, 68, 82, 65, 67, 72, 77, 193, 69, 65, 82, 84, 72, 76, 217, 69, 73, - 71, 72, 84, 89, 128, 69, 83, 67, 65, 80, 69, 128, 70, 69, 65, 84, 72, 69, - 210, 70, 76, 69, 88, 85, 83, 128, 71, 69, 82, 69, 83, 72, 128, 71, 72, - 85, 78, 78, 65, 128, 71, 82, 69, 65, 84, 69, 210, 72, 79, 76, 68, 73, 78, - 199, 73, 78, 72, 73, 66, 73, 212, 73, 83, 83, 72, 65, 82, 128, 73, 90, - 72, 73, 84, 83, 193, 75, 69, 69, 80, 73, 78, 199, 75, 72, 73, 69, 85, 75, - 200, 75, 76, 65, 83, 77, 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 79, - 82, 65, 78, 73, 195, 76, 69, 71, 69, 84, 79, 211, 77, 65, 76, 65, 75, 79, - 206, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 75, 45, 50, 128, 77, 79, - 82, 84, 65, 82, 128, 78, 69, 71, 65, 84, 69, 196, 78, 79, 84, 67, 72, 69, - 196, 79, 82, 68, 73, 78, 65, 204, 80, 72, 73, 69, 85, 80, 200, 80, 72, - 82, 65, 83, 69, 128, 80, 73, 76, 67, 82, 79, 215, 80, 76, 65, 71, 73, 79, - 211, 80, 79, 75, 79, 74, 73, 128, 82, 69, 84, 85, 82, 78, 128, 82, 73, - 75, 82, 73, 75, 128, 83, 69, 82, 73, 70, 83, 128, 83, 72, 65, 80, 69, 83, - 128, 83, 73, 88, 84, 69, 69, 206, 83, 76, 79, 80, 73, 78, 199, 83, 77, - 65, 76, 76, 69, 210, 83, 77, 73, 76, 73, 78, 199, 83, 80, 69, 69, 67, 72, - 128, 83, 80, 73, 68, 69, 82, 217, 84, 65, 77, 73, 78, 71, 128, 84, 69, - 76, 69, 73, 65, 128, 84, 69, 76, 73, 83, 72, 193, 84, 69, 83, 83, 69, 82, - 193, 84, 72, 69, 84, 72, 69, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, - 82, 69, 65, 68, 128, 84, 72, 82, 69, 69, 45, 196, 84, 86, 82, 73, 68, 79, - 128, 85, 80, 84, 85, 82, 78, 128, 89, 69, 76, 76, 79, 87, 128, 89, 79, - 45, 89, 65, 69, 128, 89, 85, 45, 89, 69, 79, 128, 90, 69, 77, 76, 74, 65, - 128, 65, 66, 89, 83, 77, 65, 204, 65, 70, 71, 72, 65, 78, 201, 65, 70, - 82, 73, 67, 65, 206, 65, 72, 65, 71, 71, 65, 210, 65, 73, 72, 86, 85, 83, - 128, 65, 73, 86, 73, 76, 73, 203, 65, 76, 65, 89, 72, 69, 128, 65, 76, - 73, 71, 78, 69, 196, 65, 78, 78, 85, 73, 84, 217, 65, 80, 65, 65, 84, 79, - 128, 65, 82, 65, 69, 65, 69, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, - 82, 73, 86, 69, 128, 65, 82, 83, 69, 79, 83, 128, 65, 82, 85, 72, 85, 65, - 128, 65, 83, 67, 69, 78, 84, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, - 83, 84, 82, 65, 204, 65, 86, 69, 82, 65, 71, 197, 66, 65, 68, 71, 69, 82, - 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 78, 84, 79, 67, 128, 66, 65, - 82, 76, 69, 89, 128, 66, 65, 82, 82, 69, 69, 128, 66, 69, 78, 90, 69, 78, - 197, 66, 69, 84, 87, 69, 69, 206, 66, 69, 89, 89, 65, 76, 128, 66, 73, - 84, 84, 69, 82, 128, 66, 79, 82, 85, 84, 79, 128, 66, 82, 65, 78, 67, 72, - 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 79, 78, 90, 69, 128, 66, 85, - 67, 75, 76, 69, 128, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, 82, - 128, 67, 65, 84, 65, 87, 65, 128, 67, 65, 85, 84, 73, 79, 206, 67, 72, - 65, 77, 75, 79, 128, 67, 72, 65, 78, 71, 69, 128, 67, 72, 65, 82, 73, 79, - 212, 67, 72, 69, 86, 82, 79, 206, 67, 72, 73, 82, 69, 84, 128, 67, 72, - 85, 82, 67, 72, 128, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 45, 50, - 128, 67, 76, 73, 86, 73, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 79, - 70, 70, 73, 78, 128, 67, 79, 78, 73, 67, 65, 204, 67, 79, 82, 80, 83, 69, - 128, 67, 85, 82, 82, 69, 78, 212, 68, 65, 65, 68, 72, 85, 128, 68, 65, - 76, 65, 84, 72, 128, 68, 65, 77, 65, 82, 85, 128, 68, 65, 83, 69, 73, 65, - 128, 68, 68, 65, 72, 65, 76, 128, 68, 69, 76, 69, 84, 69, 128, 68, 69, - 76, 80, 72, 73, 195, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 82, 77, 65, - 128, 68, 73, 69, 83, 73, 83, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, - 86, 79, 82, 67, 197, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 45, 50, - 128, 68, 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, - 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 55, - 128, 68, 79, 84, 83, 45, 56, 128, 68, 85, 84, 73, 69, 83, 128, 69, 73, - 71, 72, 84, 72, 128, 69, 78, 65, 82, 88, 73, 211, 69, 88, 67, 69, 83, 83, - 128, 69, 88, 73, 83, 84, 83, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, - 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 52, - 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 54, 128, 70, 65, - 77, 73, 76, 89, 128, 70, 65, 84, 72, 69, 82, 128, 70, 69, 77, 65, 76, 69, - 128, 70, 69, 82, 77, 65, 84, 193, 70, 73, 70, 84, 69, 69, 206, 70, 76, - 65, 71, 45, 49, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 51, - 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, - 73, 71, 72, 84, 128, 70, 76, 79, 87, 69, 82, 128, 70, 79, 82, 67, 69, 83, - 128, 70, 85, 78, 69, 82, 65, 204, 71, 69, 68, 79, 76, 65, 128, 71, 69, - 77, 73, 78, 73, 128, 71, 69, 78, 69, 82, 73, 195, 71, 72, 65, 73, 78, 85, - 128, 71, 72, 65, 77, 65, 76, 128, 71, 82, 79, 85, 78, 68, 128, 71, 85, - 65, 82, 65, 78, 201, 72, 65, 70, 85, 75, 72, 128, 72, 69, 73, 83, 69, 73, - 128, 72, 69, 76, 77, 69, 84, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, - 82, 77, 69, 83, 128, 72, 69, 82, 85, 84, 85, 128, 72, 82, 89, 86, 78, 73, - 193, 72, 85, 73, 73, 84, 79, 128, 73, 45, 66, 69, 65, 77, 128, 73, 77, - 73, 83, 69, 79, 211, 73, 78, 71, 87, 65, 90, 128, 73, 78, 73, 78, 71, 85, - 128, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 85, 76, 65, 210, 74, 79, - 73, 78, 69, 68, 128, 75, 65, 78, 65, 75, 79, 128, 75, 65, 78, 84, 65, 74, - 193, 75, 69, 70, 85, 76, 65, 128, 75, 69, 89, 67, 65, 80, 128, 75, 72, - 79, 77, 85, 84, 128, 75, 76, 73, 84, 79, 78, 128, 75, 79, 82, 85, 78, 65, - 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 85, 82, 73, 73, 128, 76, 65, - 77, 65, 68, 72, 128, 76, 65, 84, 69, 82, 65, 204, 76, 69, 71, 73, 79, 78, - 128, 76, 69, 73, 77, 77, 65, 128, 76, 69, 84, 84, 69, 82, 128, 76, 73, - 77, 73, 84, 69, 196, 76, 73, 78, 69, 45, 49, 128, 76, 73, 78, 69, 45, 51, - 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 57, 128, 76, 73, - 78, 75, 73, 78, 199, 76, 79, 90, 69, 78, 71, 197, 77, 65, 73, 68, 69, 78, - 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 82, 75, 45, 51, 128, 77, 65, - 82, 75, 45, 52, 128, 77, 65, 82, 85, 75, 85, 128, 77, 65, 84, 82, 73, 88, - 128, 77, 65, 88, 73, 77, 65, 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, - 71, 65, 76, 73, 128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 84, 82, 73, 65, - 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 76, 76, 69, 84, 128, 77, 73, - 78, 73, 77, 65, 128, 77, 79, 68, 69, 76, 83, 128, 77, 79, 84, 72, 69, 82, - 128, 77, 85, 81, 68, 65, 77, 128, 78, 65, 85, 84, 72, 83, 128, 78, 69, - 78, 65, 78, 79, 128, 78, 73, 82, 85, 71, 85, 128, 78, 79, 75, 72, 85, 75, - 128, 78, 79, 77, 73, 78, 65, 204, 78, 85, 77, 66, 69, 82, 128, 78, 85, - 78, 65, 86, 85, 212, 79, 66, 69, 76, 79, 83, 128, 79, 77, 65, 76, 79, 78, - 128, 79, 80, 69, 78, 45, 80, 128, 79, 80, 80, 79, 83, 69, 128, 79, 82, - 73, 71, 73, 78, 128, 79, 84, 72, 65, 76, 65, 206, 80, 65, 76, 85, 84, 65, - 128, 80, 65, 83, 72, 84, 65, 128, 80, 69, 78, 73, 72, 73, 128, 80, 69, - 82, 83, 79, 78, 128, 80, 73, 75, 85, 82, 85, 128, 80, 73, 80, 73, 78, 71, - 128, 80, 73, 83, 67, 69, 83, 128, 80, 79, 73, 78, 84, 79, 128, 80, 82, - 69, 67, 69, 68, 197, 80, 82, 69, 70, 65, 67, 197, 80, 82, 79, 68, 85, 67, - 212, 80, 85, 82, 73, 84, 89, 128, 80, 85, 83, 72, 73, 78, 199, 81, 69, - 84, 65, 78, 65, 128, 81, 85, 66, 85, 84, 83, 128, 82, 69, 80, 69, 65, 84, - 128, 82, 73, 84, 85, 65, 76, 128, 82, 85, 78, 79, 85, 84, 128, 83, 65, - 65, 68, 72, 85, 128, 83, 65, 74, 68, 65, 72, 128, 83, 65, 77, 69, 75, 72, - 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 84, 85, 82, 78, 128, 83, 67, - 65, 76, 69, 83, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 73, 80, 84, - 128, 83, 69, 65, 71, 85, 76, 204, 83, 69, 67, 79, 78, 68, 128, 83, 69, - 67, 82, 69, 84, 128, 83, 69, 67, 84, 79, 82, 128, 83, 69, 73, 83, 77, 65, - 128, 83, 69, 82, 86, 73, 67, 197, 83, 69, 86, 69, 78, 84, 217, 83, 72, - 65, 68, 68, 65, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 69, 69, 78, 85, - 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 85, 70, 70, 76, 197, 83, 73, - 67, 75, 76, 69, 128, 83, 73, 88, 84, 72, 83, 128, 83, 76, 79, 87, 76, 89, - 128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 73, 82, 73, 84, 128, 83, 80, - 82, 79, 85, 84, 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 82, 65, 73, 70, - 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 79, 75, 69, 211, 83, 85, - 66, 73, 84, 79, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 82, 70, 65, 67, - 197, 83, 87, 79, 82, 68, 83, 128, 83, 89, 78, 65, 70, 73, 128, 83, 89, - 79, 85, 87, 65, 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 85, 82, 85, 83, - 128, 84, 69, 78, 85, 84, 79, 128, 84, 72, 65, 65, 76, 85, 128, 84, 72, - 65, 72, 65, 78, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 73, 82, 68, 83, - 128, 84, 72, 73, 85, 84, 72, 128, 84, 73, 80, 69, 72, 65, 128, 84, 79, - 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 52, - 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 54, 128, 84, 82, - 73, 80, 76, 73, 128, 84, 82, 73, 80, 79, 68, 128, 84, 83, 72, 85, 71, 83, - 128, 84, 84, 69, 72, 69, 72, 128, 84, 85, 82, 66, 65, 78, 128, 85, 80, - 82, 73, 71, 72, 212, 85, 80, 87, 65, 82, 68, 128, 85, 82, 65, 78, 85, 83, - 128, 86, 65, 76, 76, 69, 89, 128, 86, 65, 82, 69, 73, 65, 201, 86, 65, - 82, 73, 65, 78, 212, 86, 65, 82, 73, 75, 65, 128, 86, 73, 67, 84, 79, 82, - 217, 86, 73, 82, 73, 65, 77, 128, 86, 73, 83, 65, 82, 71, 193, 86, 79, - 76, 84, 65, 71, 197, 87, 65, 82, 78, 73, 78, 199, 87, 69, 65, 80, 79, 78, - 128, 87, 72, 69, 69, 76, 69, 196, 87, 82, 73, 84, 73, 78, 199, 89, 70, - 69, 83, 73, 83, 128, 89, 79, 45, 89, 69, 79, 128, 89, 80, 83, 73, 76, 73, - 128, 83, 89, 76, 79, 84, 201, 67, 65, 82, 79, 78, 128, 66, 82, 69, 86, - 69, 128, 66, 76, 65, 67, 75, 128, 77, 73, 68, 68, 76, 197, 65, 67, 67, - 69, 78, 212, 84, 82, 73, 80, 76, 197, 68, 79, 84, 84, 69, 196, 83, 84, - 82, 79, 75, 197, 86, 69, 83, 83, 69, 204, 69, 81, 85, 65, 76, 211, 71, - 79, 84, 72, 73, 195, 72, 69, 65, 86, 89, 128, 83, 73, 78, 71, 76, 197, - 66, 76, 79, 67, 75, 128, 77, 65, 78, 67, 72, 213, 84, 79, 78, 79, 83, - 128, 66, 79, 84, 84, 79, 205, 70, 84, 72, 79, 82, 193, 77, 69, 68, 73, - 85, 205, 79, 77, 69, 71, 65, 128, 83, 73, 71, 77, 65, 128, 65, 76, 80, - 72, 65, 128, 67, 76, 79, 83, 69, 196, 68, 65, 83, 73, 65, 128, 83, 85, - 66, 83, 69, 212, 67, 79, 77, 77, 65, 128, 68, 69, 76, 84, 65, 128, 86, - 85, 76, 71, 65, 210, 67, 79, 82, 78, 69, 210, 69, 81, 85, 65, 76, 128, - 76, 65, 77, 68, 65, 128, 67, 82, 79, 83, 83, 128, 73, 67, 72, 79, 83, - 128, 83, 65, 89, 73, 83, 201, 84, 72, 69, 84, 65, 128, 87, 72, 73, 84, - 69, 128, 65, 76, 77, 79, 83, 212, 75, 65, 80, 80, 65, 128, 77, 65, 67, - 82, 79, 206, 78, 85, 66, 73, 65, 206, 89, 45, 67, 82, 69, 197, 66, 69, - 83, 73, 68, 197, 67, 69, 78, 84, 82, 197, 83, 72, 65, 68, 68, 193, 84, - 87, 69, 78, 84, 217, 69, 65, 82, 84, 72, 128, 70, 73, 70, 84, 89, 128, - 76, 69, 78, 71, 84, 200, 78, 79, 82, 77, 65, 204, 84, 72, 73, 82, 84, - 217, 68, 65, 83, 72, 69, 196, 68, 73, 71, 82, 65, 205, 80, 82, 73, 77, - 69, 128, 85, 78, 73, 79, 78, 128, 67, 65, 78, 68, 82, 193, 82, 69, 80, - 69, 65, 212, 84, 69, 77, 80, 85, 211, 84, 85, 65, 82, 69, 199, 76, 85, - 78, 65, 84, 197, 82, 73, 83, 73, 78, 199, 82, 84, 65, 71, 83, 128, 68, - 73, 69, 83, 73, 211, 68, 73, 80, 76, 73, 128, 73, 78, 68, 69, 88, 128, - 75, 79, 80, 80, 65, 128, 78, 65, 66, 76, 65, 128, 78, 85, 75, 84, 65, - 128, 79, 84, 84, 65, 86, 193, 82, 65, 73, 83, 69, 196, 83, 67, 72, 87, - 65, 128, 83, 72, 73, 77, 65, 128, 83, 84, 65, 70, 70, 128, 89, 70, 69, - 83, 73, 211, 66, 65, 76, 76, 79, 212, 66, 65, 82, 82, 69, 197, 67, 76, - 73, 67, 75, 128, 67, 85, 66, 69, 68, 128, 67, 85, 82, 86, 69, 196, 70, - 69, 77, 65, 76, 197, 70, 69, 78, 67, 69, 128, 75, 79, 82, 69, 65, 206, - 76, 69, 73, 77, 77, 193, 76, 73, 84, 84, 76, 197, 78, 69, 83, 84, 69, - 196, 85, 73, 71, 72, 85, 210, 87, 65, 84, 69, 82, 128, 87, 69, 73, 71, - 72, 212, 65, 76, 65, 89, 72, 197, 66, 65, 83, 83, 65, 128, 66, 82, 73, - 68, 71, 197, 67, 72, 82, 79, 77, 193, 68, 65, 78, 68, 65, 128, 68, 69, - 71, 82, 69, 197, 68, 69, 86, 73, 67, 197, 68, 79, 76, 76, 65, 210, 80, - 65, 73, 82, 69, 196, 80, 65, 84, 65, 72, 128, 80, 73, 69, 67, 69, 128, - 80, 79, 69, 84, 82, 217, 83, 65, 77, 80, 73, 128, 83, 75, 69, 87, 69, - 196, 84, 73, 77, 69, 83, 128, 84, 84, 69, 72, 69, 200, 87, 73, 71, 71, - 76, 217, 90, 73, 71, 90, 65, 199, 65, 82, 79, 85, 78, 196, 65, 82, 83, - 69, 79, 211, 66, 82, 79, 75, 69, 206, 67, 65, 82, 69, 84, 128, 67, 76, - 73, 70, 70, 128, 67, 76, 79, 84, 72, 128, 68, 65, 71, 69, 83, 200, 68, - 65, 77, 77, 65, 128, 70, 76, 79, 82, 65, 204, 70, 79, 82, 84, 89, 128, - 72, 69, 65, 82, 84, 128, 76, 65, 77, 69, 68, 128, 77, 65, 80, 73, 81, - 128, 78, 45, 67, 82, 69, 197, 80, 79, 83, 84, 65, 204, 80, 84, 72, 65, - 72, 193, 83, 67, 72, 69, 77, 193, 83, 69, 71, 79, 76, 128, 83, 72, 65, - 68, 69, 128, 83, 77, 65, 76, 76, 128, 83, 84, 82, 69, 83, 211, 84, 72, - 79, 82, 78, 128, 84, 73, 84, 76, 79, 128, 84, 79, 79, 84, 72, 128, 86, - 65, 82, 69, 73, 193, 87, 72, 69, 65, 84, 128, 90, 81, 65, 80, 72, 193, - 65, 76, 65, 80, 72, 128, 66, 69, 65, 77, 69, 196, 66, 69, 82, 66, 69, - 210, 66, 73, 78, 65, 82, 217, 66, 73, 78, 68, 73, 128, 66, 79, 87, 84, - 73, 197, 67, 72, 69, 67, 75, 128, 67, 85, 82, 86, 69, 128, 68, 65, 76, - 68, 65, 128, 68, 65, 76, 69, 84, 128, 68, 68, 65, 72, 65, 204, 68, 69, - 65, 84, 72, 128, 68, 79, 66, 82, 79, 128, 68, 90, 69, 76, 79, 128, 69, - 84, 69, 82, 79, 206, 70, 65, 67, 84, 79, 210, 70, 73, 71, 85, 82, 197, - 70, 76, 79, 79, 82, 128, 70, 79, 82, 75, 69, 196, 70, 82, 73, 84, 85, - 128, 71, 65, 80, 80, 69, 196, 71, 69, 78, 73, 75, 201, 71, 72, 65, 73, - 78, 128, 71, 72, 79, 83, 84, 128, 71, 72, 85, 78, 78, 193, 71, 78, 89, - 73, 83, 128, 71, 79, 82, 71, 73, 128, 72, 65, 77, 77, 69, 210, 72, 65, - 77, 90, 65, 128, 72, 73, 82, 73, 81, 128, 72, 79, 76, 65, 77, 128, 72, - 79, 82, 83, 69, 128, 72, 87, 65, 73, 82, 128, 73, 65, 85, 68, 65, 128, - 75, 65, 90, 65, 75, 200, 75, 73, 89, 69, 79, 203, 75, 76, 65, 83, 77, - 193, 76, 65, 66, 79, 82, 128, 76, 65, 82, 71, 69, 210, 76, 65, 85, 76, - 65, 128, 76, 69, 83, 83, 69, 210, 77, 69, 84, 65, 76, 128, 77, 79, 85, - 84, 72, 128, 78, 65, 83, 72, 73, 128, 78, 79, 84, 69, 83, 128, 79, 71, - 79, 78, 69, 203, 79, 76, 73, 71, 79, 206, 79, 82, 78, 65, 84, 197, 80, - 73, 65, 83, 77, 193, 80, 76, 65, 78, 67, 203, 80, 79, 73, 78, 84, 128, - 80, 79, 87, 69, 82, 128, 80, 82, 79, 84, 79, 211, 81, 65, 84, 65, 78, - 128, 81, 85, 69, 69, 78, 128, 81, 85, 73, 76, 76, 128, 82, 69, 65, 67, - 72, 128, 82, 71, 89, 65, 78, 128, 82, 73, 84, 83, 73, 128, 83, 67, 82, - 69, 69, 206, 83, 69, 71, 78, 79, 128, 83, 69, 82, 73, 70, 211, 83, 69, - 83, 65, 77, 197, 83, 72, 65, 78, 71, 128, 83, 72, 65, 82, 80, 128, 83, - 72, 67, 72, 65, 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 76, 70, 128, - 83, 72, 69, 76, 76, 128, 83, 72, 79, 82, 84, 211, 83, 72, 87, 65, 65, - 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 79, 79, 128, 83, 73, 71, 78, - 83, 128, 83, 73, 78, 68, 72, 201, 83, 73, 88, 84, 89, 128, 83, 76, 79, - 86, 79, 128, 83, 80, 69, 65, 82, 128, 83, 80, 73, 82, 73, 212, 83, 84, - 79, 67, 75, 128, 83, 84, 85, 68, 89, 128, 83, 85, 75, 85, 78, 128, 84, - 65, 78, 78, 69, 196, 84, 69, 76, 79, 85, 211, 84, 72, 87, 65, 65, 128, - 84, 73, 71, 69, 82, 128, 84, 73, 75, 69, 85, 212, 84, 82, 85, 78, 75, - 128, 84, 83, 65, 68, 73, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, - 83, 128, 84, 87, 69, 76, 86, 197, 87, 65, 84, 67, 72, 128, 87, 79, 77, - 65, 78, 128, 89, 69, 83, 84, 85, 128, 89, 79, 45, 89, 65, 128, 89, 85, - 45, 89, 69, 128, 90, 90, 73, 69, 84, 128, 45, 67, 72, 65, 76, 128, 45, - 75, 72, 89, 85, 196, 45, 80, 72, 82, 85, 128, 65, 68, 68, 65, 75, 128, - 65, 71, 65, 73, 78, 128, 65, 72, 83, 68, 65, 128, 65, 76, 73, 70, 85, - 128, 65, 77, 79, 85, 78, 212, 65, 78, 80, 69, 65, 128, 65, 80, 65, 82, - 84, 128, 65, 80, 82, 73, 76, 128, 65, 82, 69, 80, 65, 128, 65, 82, 73, - 69, 83, 128, 65, 82, 76, 65, 85, 199, 65, 82, 79, 85, 82, 193, 65, 82, - 82, 65, 89, 128, 65, 82, 84, 65, 66, 197, 66, 66, 73, 69, 80, 128, 66, - 66, 73, 69, 84, 128, 66, 66, 73, 69, 88, 128, 66, 66, 85, 79, 80, 128, - 66, 66, 85, 79, 88, 128, 66, 66, 85, 82, 88, 128, 66, 69, 69, 84, 65, - 128, 66, 69, 70, 79, 82, 197, 66, 69, 72, 69, 72, 128, 66, 69, 73, 84, - 72, 128, 66, 72, 69, 84, 72, 128, 66, 73, 82, 71, 65, 128, 66, 73, 84, - 73, 78, 199, 66, 76, 65, 78, 75, 128, 66, 76, 79, 79, 68, 128, 66, 82, - 65, 67, 69, 128, 66, 82, 65, 78, 67, 200, 66, 82, 69, 65, 84, 200, 66, - 82, 85, 83, 72, 128, 66, 83, 84, 65, 82, 128, 66, 85, 76, 76, 69, 212, - 67, 65, 77, 78, 85, 195, 67, 65, 78, 67, 69, 204, 67, 65, 85, 68, 65, - 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 69, 69, 128, 67, 69, 65, 76, - 67, 128, 67, 69, 73, 82, 84, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, - 73, 82, 128, 67, 72, 65, 78, 71, 128, 67, 72, 73, 76, 68, 128, 67, 72, - 73, 78, 71, 128, 67, 72, 79, 75, 69, 128, 67, 72, 85, 76, 65, 128, 67, - 72, 85, 79, 80, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 88, 128, - 67, 72, 85, 82, 88, 128, 67, 72, 89, 82, 88, 128, 67, 76, 79, 85, 68, - 128, 67, 79, 69, 78, 71, 128, 67, 79, 76, 79, 82, 128, 67, 79, 77, 69, - 84, 128, 67, 79, 77, 73, 78, 199, 67, 79, 77, 77, 79, 206, 67, 79, 86, - 69, 82, 128, 67, 82, 69, 68, 73, 212, 67, 82, 79, 73, 88, 128, 68, 65, - 65, 83, 85, 128, 68, 65, 76, 65, 84, 200, 68, 65, 82, 71, 65, 128, 68, - 65, 86, 73, 68, 128, 68, 68, 68, 72, 65, 128, 68, 68, 73, 69, 80, 128, - 68, 68, 73, 69, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, 88, - 128, 68, 68, 85, 82, 88, 128, 68, 69, 76, 69, 84, 197, 68, 69, 82, 69, - 84, 128, 68, 73, 70, 65, 84, 128, 68, 73, 80, 84, 69, 128, 68, 73, 86, - 73, 68, 197, 68, 79, 77, 65, 73, 206, 68, 79, 85, 66, 84, 128, 68, 82, - 73, 86, 69, 128, 68, 82, 79, 80, 83, 128, 69, 69, 75, 65, 65, 128, 69, - 73, 71, 72, 84, 217, 69, 76, 69, 86, 69, 206, 69, 76, 73, 70, 73, 128, - 69, 78, 84, 69, 82, 128, 69, 79, 76, 72, 88, 128, 69, 81, 85, 73, 68, - 128, 69, 85, 45, 69, 85, 128, 69, 88, 73, 83, 84, 128, 70, 65, 65, 70, - 85, 128, 70, 65, 73, 72, 85, 128, 70, 65, 84, 72, 65, 128, 70, 69, 65, - 82, 78, 128, 70, 72, 84, 79, 82, 193, 70, 73, 69, 76, 68, 128, 70, 73, - 70, 84, 72, 128, 70, 73, 71, 72, 84, 128, 70, 73, 76, 76, 69, 196, 70, - 73, 78, 73, 84, 197, 70, 76, 79, 87, 69, 210, 70, 76, 85, 84, 69, 128, - 70, 79, 76, 76, 89, 128, 70, 79, 82, 67, 69, 128, 70, 79, 82, 84, 69, - 128, 70, 82, 65, 77, 69, 128, 70, 82, 69, 78, 67, 200, 70, 82, 79, 87, - 78, 128, 71, 65, 65, 70, 85, 128, 71, 65, 68, 79, 76, 128, 71, 65, 77, - 65, 76, 128, 71, 65, 77, 76, 65, 128, 71, 65, 78, 77, 65, 128, 71, 65, - 82, 79, 78, 128, 71, 69, 78, 84, 76, 197, 71, 69, 82, 69, 83, 200, 71, - 69, 82, 77, 65, 206, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 88, 128, - 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 88, - 128, 71, 71, 85, 82, 88, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 69, - 69, 128, 71, 73, 77, 69, 76, 128, 71, 73, 78, 73, 73, 128, 71, 76, 69, - 73, 67, 200, 71, 82, 65, 67, 69, 128, 71, 82, 65, 73, 78, 128, 71, 82, - 65, 83, 83, 128, 72, 45, 84, 89, 80, 197, 72, 65, 45, 72, 65, 128, 72, - 65, 71, 76, 65, 218, 72, 65, 73, 84, 85, 128, 72, 65, 78, 68, 83, 128, - 72, 69, 65, 86, 69, 206, 72, 73, 68, 73, 78, 199, 72, 76, 73, 69, 80, - 128, 72, 76, 73, 69, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, - 88, 128, 72, 76, 85, 82, 88, 128, 72, 76, 89, 82, 88, 128, 72, 77, 73, - 69, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, - 85, 79, 88, 128, 72, 77, 85, 82, 88, 128, 72, 77, 89, 82, 88, 128, 72, - 78, 73, 69, 80, 128, 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 88, 128, - 72, 78, 85, 79, 88, 128, 72, 79, 79, 82, 85, 128, 72, 79, 85, 83, 69, - 128, 72, 85, 77, 65, 78, 128, 72, 85, 82, 65, 78, 128, 72, 88, 73, 69, - 80, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 88, 128, 72, 88, 85, - 79, 80, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 88, 128, 72, 89, - 80, 72, 69, 206, 73, 67, 72, 79, 85, 128, 73, 71, 71, 87, 83, 128, 73, - 78, 78, 69, 82, 128, 73, 83, 65, 75, 73, 193, 74, 74, 73, 69, 80, 128, - 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 88, 128, 74, 74, 85, 79, 80, - 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 82, 88, 128, 74, 79, 89, 79, - 85, 211, 74, 85, 68, 71, 69, 128, 74, 85, 69, 85, 73, 128, 75, 65, 65, - 70, 85, 128, 75, 65, 73, 82, 73, 128, 75, 65, 83, 82, 65, 128, 75, 65, - 84, 65, 86, 193, 75, 65, 85, 78, 65, 128, 75, 69, 69, 83, 85, 128, 75, - 69, 72, 69, 72, 128, 75, 69, 76, 86, 73, 206, 75, 69, 78, 65, 84, 128, - 75, 72, 65, 78, 68, 193, 75, 72, 65, 80, 72, 128, 75, 72, 85, 65, 84, - 128, 75, 72, 87, 65, 73, 128, 75, 78, 73, 70, 69, 128, 75, 79, 79, 80, - 79, 128, 75, 85, 83, 77, 65, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, - 69, 69, 128, 76, 45, 84, 89, 80, 197, 76, 65, 65, 77, 85, 128, 76, 65, - 71, 85, 83, 128, 76, 65, 77, 66, 68, 193, 76, 65, 85, 75, 65, 218, 76, - 69, 77, 79, 73, 128, 76, 73, 66, 82, 65, 128, 76, 73, 77, 73, 84, 128, - 76, 73, 78, 69, 83, 128, 76, 73, 81, 85, 73, 196, 76, 79, 78, 71, 65, - 128, 76, 79, 84, 85, 83, 128, 76, 79, 85, 82, 69, 128, 77, 65, 68, 68, - 65, 128, 77, 65, 68, 68, 65, 200, 77, 65, 72, 72, 65, 128, 77, 65, 73, - 82, 85, 128, 77, 65, 78, 78, 65, 128, 77, 65, 78, 78, 65, 218, 77, 65, - 81, 65, 70, 128, 77, 65, 82, 67, 72, 128, 77, 65, 83, 79, 82, 193, 77, - 69, 69, 77, 85, 128, 77, 69, 73, 90, 73, 128, 77, 69, 76, 79, 78, 128, - 77, 69, 77, 66, 69, 210, 77, 69, 82, 75, 72, 193, 77, 69, 84, 69, 71, - 128, 77, 69, 90, 90, 79, 128, 77, 71, 73, 69, 88, 128, 77, 71, 85, 79, - 80, 128, 77, 71, 85, 79, 88, 128, 77, 71, 85, 82, 88, 128, 77, 73, 75, - 82, 73, 128, 77, 73, 75, 82, 79, 206, 77, 73, 82, 69, 68, 128, 77, 73, - 83, 82, 65, 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 85, 76, 207, 77, - 79, 78, 84, 72, 128, 77, 79, 85, 78, 68, 128, 77, 85, 78, 65, 72, 128, - 77, 85, 83, 73, 67, 128, 78, 65, 82, 82, 79, 215, 78, 65, 85, 68, 73, - 218, 78, 65, 88, 73, 65, 206, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, - 88, 128, 78, 66, 85, 82, 88, 128, 78, 66, 89, 82, 88, 128, 78, 68, 73, - 69, 88, 128, 78, 68, 85, 82, 88, 128, 78, 71, 65, 65, 73, 128, 78, 71, - 73, 69, 80, 128, 78, 71, 73, 69, 88, 128, 78, 71, 79, 69, 72, 128, 78, - 71, 85, 79, 84, 128, 78, 71, 85, 79, 88, 128, 78, 73, 78, 69, 84, 217, - 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 88, - 128, 78, 74, 85, 79, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 89, 82, - 88, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, - 79, 79, 128, 78, 79, 79, 78, 85, 128, 78, 79, 84, 67, 72, 128, 78, 79, - 84, 84, 79, 128, 78, 82, 85, 82, 88, 128, 78, 82, 89, 82, 88, 128, 78, - 85, 77, 69, 82, 207, 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 84, 128, - 78, 89, 73, 69, 88, 128, 78, 89, 85, 79, 80, 128, 78, 89, 85, 79, 88, - 128, 78, 90, 73, 69, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 85, 79, - 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 89, 82, 88, 128, 79, 66, 74, - 69, 67, 212, 79, 74, 69, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 78, - 75, 65, 82, 128, 79, 80, 84, 73, 79, 206, 79, 84, 72, 65, 76, 128, 79, - 85, 78, 75, 73, 193, 79, 88, 69, 73, 65, 201, 80, 65, 65, 84, 85, 128, - 80, 65, 83, 69, 81, 128, 80, 65, 83, 85, 81, 128, 80, 65, 84, 65, 75, - 128, 80, 65, 90, 69, 82, 128, 80, 69, 65, 67, 69, 128, 80, 69, 69, 90, - 73, 128, 80, 69, 72, 69, 72, 128, 80, 69, 73, 84, 72, 128, 80, 69, 78, - 83, 85, 128, 80, 69, 79, 82, 84, 200, 80, 69, 82, 84, 72, 207, 80, 69, - 83, 69, 84, 193, 80, 72, 78, 65, 69, 203, 80, 72, 85, 78, 71, 128, 80, - 73, 65, 78, 79, 128, 80, 76, 85, 84, 79, 128, 80, 79, 69, 84, 73, 195, - 80, 79, 78, 68, 79, 128, 80, 82, 73, 78, 84, 128, 80, 82, 79, 79, 70, - 128, 80, 82, 79, 86, 69, 128, 81, 65, 65, 70, 85, 128, 81, 65, 68, 77, - 65, 128, 81, 65, 77, 65, 84, 211, 81, 65, 82, 78, 69, 217, 81, 72, 87, - 65, 65, 128, 81, 72, 87, 69, 69, 128, 82, 45, 67, 82, 69, 197, 82, 65, - 73, 68, 65, 128, 82, 65, 83, 72, 65, 128, 82, 65, 83, 79, 85, 204, 82, - 65, 84, 73, 79, 128, 82, 69, 67, 79, 82, 196, 82, 69, 84, 85, 82, 206, - 82, 69, 86, 73, 65, 128, 82, 69, 86, 77, 65, 128, 82, 72, 79, 84, 73, - 195, 82, 73, 86, 69, 82, 128, 82, 78, 79, 79, 78, 128, 82, 79, 66, 65, - 84, 128, 82, 82, 85, 79, 88, 128, 82, 82, 85, 82, 88, 128, 82, 82, 89, - 82, 88, 128, 82, 85, 80, 73, 73, 128, 82, 87, 65, 72, 65, 128, 83, 65, - 68, 72, 69, 128, 83, 65, 70, 72, 65, 128, 83, 65, 77, 69, 75, 200, 83, - 65, 77, 75, 65, 128, 83, 65, 77, 89, 79, 203, 83, 65, 78, 65, 72, 128, - 83, 65, 85, 73, 76, 128, 83, 69, 69, 78, 85, 128, 83, 69, 73, 83, 77, - 193, 83, 69, 78, 84, 73, 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 81, - 69, 204, 83, 72, 69, 86, 65, 128, 83, 72, 73, 73, 78, 128, 83, 72, 79, - 79, 84, 128, 83, 72, 79, 82, 84, 128, 83, 72, 85, 79, 80, 128, 83, 72, - 85, 79, 88, 128, 83, 72, 85, 82, 88, 128, 83, 72, 89, 82, 88, 128, 83, - 73, 88, 84, 72, 128, 83, 76, 65, 86, 69, 128, 83, 76, 73, 67, 69, 128, - 83, 76, 79, 80, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 73, 76, 69, - 128, 83, 78, 65, 75, 69, 128, 83, 78, 79, 85, 84, 128, 83, 79, 85, 78, - 68, 128, 83, 79, 87, 73, 76, 207, 83, 80, 73, 67, 69, 128, 83, 80, 79, - 79, 78, 128, 83, 80, 85, 78, 71, 211, 83, 81, 85, 73, 83, 200, 83, 83, - 73, 69, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 89, 82, 88, 128, 83, - 84, 65, 78, 68, 128, 83, 84, 65, 82, 75, 128, 83, 84, 69, 65, 77, 128, - 83, 84, 79, 78, 69, 128, 83, 84, 79, 86, 69, 128, 83, 87, 69, 69, 84, - 128, 83, 87, 79, 82, 68, 128, 83, 89, 82, 77, 65, 128, 84, 65, 76, 69, - 78, 212, 84, 65, 80, 69, 82, 128, 84, 67, 72, 69, 72, 128, 84, 69, 73, - 87, 83, 128, 84, 69, 86, 73, 82, 128, 84, 72, 73, 71, 72, 128, 84, 72, - 73, 82, 68, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 84, 65, 128, 84, - 72, 79, 78, 71, 128, 84, 72, 85, 78, 71, 128, 84, 73, 78, 78, 69, 128, - 84, 73, 80, 80, 73, 128, 84, 76, 72, 69, 69, 128, 84, 82, 65, 67, 75, - 128, 84, 82, 73, 84, 79, 211, 84, 82, 85, 84, 72, 128, 84, 83, 69, 82, - 69, 128, 84, 84, 83, 69, 69, 128, 84, 84, 84, 72, 65, 128, 84, 85, 71, - 82, 73, 203, 84, 85, 82, 79, 50, 128, 84, 89, 80, 69, 45, 177, 84, 89, - 80, 69, 45, 178, 84, 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 180, 84, - 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 182, 84, 89, 80, 69, 45, 183, - 85, 78, 73, 84, 89, 128, 85, 80, 87, 65, 82, 196, 86, 65, 65, 86, 85, - 128, 86, 65, 83, 73, 83, 128, 86, 65, 84, 72, 89, 128, 86, 69, 67, 84, - 79, 210, 86, 69, 82, 71, 69, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, - 71, 79, 128, 86, 79, 76, 85, 77, 197, 87, 65, 65, 86, 85, 128, 87, 65, - 83, 76, 65, 128, 87, 72, 69, 69, 76, 128, 87, 73, 78, 74, 65, 128, 87, - 82, 69, 65, 84, 200, 87, 82, 79, 78, 71, 128, 88, 69, 83, 84, 69, 211, - 89, 65, 45, 89, 79, 128, 89, 65, 65, 68, 79, 128, 89, 65, 65, 82, 85, - 128, 89, 65, 68, 68, 72, 128, 89, 65, 71, 72, 72, 128, 89, 65, 75, 72, - 72, 128, 89, 69, 79, 45, 79, 128, 89, 69, 79, 45, 85, 128, 89, 69, 84, - 73, 86, 128, 89, 73, 90, 69, 84, 128, 89, 85, 45, 69, 79, 128, 90, 65, - 82, 81, 65, 128, 90, 65, 89, 73, 78, 128, 90, 72, 65, 73, 78, 128, 90, - 72, 85, 79, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 82, 88, 128, - 90, 72, 89, 82, 88, 128, 90, 73, 76, 68, 69, 128, 90, 73, 78, 79, 82, - 128, 90, 89, 71, 79, 83, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, - 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, 89, 82, 88, 128, 78, 65, 71, - 82, 201, 83, 72, 79, 82, 212, 83, 72, 69, 69, 206, 90, 69, 82, 79, 128, - 82, 79, 77, 65, 206, 84, 73, 76, 68, 197, 76, 69, 70, 84, 128, 79, 71, - 72, 65, 205, 86, 79, 67, 65, 204, 78, 79, 82, 84, 200, 67, 85, 82, 76, - 217, 65, 84, 84, 73, 195, 83, 79, 85, 84, 200, 66, 69, 76, 79, 215, 66, - 85, 72, 73, 196, 80, 79, 73, 78, 212, 84, 65, 67, 75, 128, 68, 65, 83, - 72, 128, 68, 79, 87, 78, 128, 73, 79, 84, 65, 128, 78, 45, 65, 82, 217, - 82, 69, 83, 84, 128, 71, 72, 65, 73, 206, 65, 67, 85, 84, 197, 66, 69, - 84, 65, 128, 66, 82, 69, 86, 197, 67, 79, 77, 77, 193, 71, 82, 65, 86, - 197, 75, 79, 69, 84, 128, 86, 65, 82, 73, 193, 90, 69, 84, 65, 128, 67, - 72, 69, 83, 211, 67, 85, 82, 76, 128, 83, 72, 69, 76, 204, 84, 72, 69, - 84, 193, 83, 79, 85, 78, 196, 85, 78, 73, 79, 206, 65, 76, 69, 70, 128, - 65, 84, 84, 65, 203, 68, 79, 84, 83, 128, 70, 79, 82, 84, 217, 72, 65, - 76, 70, 128, 78, 79, 84, 69, 128, 84, 79, 78, 65, 204, 73, 77, 65, 71, - 197, 80, 76, 85, 83, 128, 65, 71, 79, 71, 201, 69, 77, 80, 84, 217, 72, - 69, 65, 82, 212, 83, 85, 73, 84, 128, 70, 73, 70, 84, 217, 70, 73, 76, - 76, 128, 75, 65, 84, 79, 128, 75, 69, 72, 69, 200, 76, 65, 82, 71, 197, - 83, 72, 65, 68, 128, 66, 69, 71, 73, 206, 67, 65, 82, 69, 212, 70, 65, - 82, 83, 201, 70, 73, 82, 69, 128, 72, 79, 82, 73, 128, 75, 65, 80, 80, - 193, 77, 79, 79, 78, 128, 83, 69, 86, 69, 206, 83, 72, 69, 73, 128, 83, - 72, 73, 78, 128, 83, 85, 78, 71, 128, 84, 73, 67, 75, 128, 67, 76, 69, - 70, 128, 67, 82, 79, 83, 211, 70, 65, 84, 72, 193, 70, 73, 82, 83, 212, - 77, 65, 68, 68, 193, 81, 85, 65, 68, 128, 82, 85, 80, 69, 197, 83, 73, - 71, 77, 193, 83, 84, 69, 77, 128, 84, 67, 72, 69, 200, 84, 73, 77, 69, - 211, 84, 83, 72, 69, 199, 89, 65, 78, 71, 128, 65, 76, 84, 65, 128, 66, - 69, 72, 69, 200, 67, 72, 69, 67, 203, 67, 82, 79, 80, 128, 68, 65, 77, - 77, 193, 70, 73, 84, 65, 128, 71, 82, 69, 65, 212, 72, 65, 78, 68, 128, - 73, 90, 72, 69, 128, 74, 79, 73, 78, 128, 75, 65, 80, 65, 128, 75, 65, - 83, 82, 193, 75, 72, 69, 73, 128, 75, 87, 65, 65, 128, 76, 79, 78, 71, - 128, 78, 71, 79, 69, 200, 79, 66, 79, 76, 211, 80, 69, 72, 69, 200, 82, - 65, 70, 69, 128, 82, 78, 79, 79, 206, 82, 84, 65, 71, 211, 83, 67, 72, - 87, 193, 83, 72, 65, 82, 208, 84, 72, 65, 65, 128, 84, 72, 69, 69, 128, - 86, 65, 78, 69, 128, 87, 65, 86, 69, 128, 87, 73, 78, 68, 128, 65, 76, - 76, 79, 128, 66, 73, 82, 68, 128, 67, 65, 82, 79, 206, 67, 72, 65, 82, - 128, 67, 72, 73, 78, 128, 67, 72, 82, 79, 193, 67, 73, 69, 85, 195, 67, - 87, 65, 65, 128, 68, 69, 76, 84, 193, 70, 79, 79, 84, 128, 71, 72, 65, - 78, 128, 71, 79, 76, 68, 128, 71, 82, 65, 83, 211, 72, 65, 84, 65, 198, - 73, 69, 85, 78, 199, 74, 72, 65, 78, 128, 75, 69, 84, 84, 201, 75, 72, - 65, 82, 128, 76, 76, 76, 65, 128, 76, 79, 79, 80, 128, 77, 78, 65, 83, - 128, 77, 85, 83, 73, 195, 77, 87, 65, 65, 128, 78, 87, 65, 65, 128, 79, - 85, 84, 69, 210, 79, 88, 69, 73, 193, 80, 65, 80, 69, 210, 80, 69, 68, - 65, 204, 80, 72, 65, 82, 128, 80, 79, 76, 69, 128, 80, 82, 73, 77, 197, - 80, 87, 65, 65, 128, 82, 79, 79, 84, 128, 83, 69, 69, 78, 128, 83, 72, - 87, 65, 128, 83, 73, 76, 75, 128, 83, 73, 77, 65, 128, 83, 84, 65, 82, - 212, 83, 87, 65, 65, 128, 83, 87, 65, 83, 200, 84, 72, 73, 73, 128, 84, - 72, 73, 82, 196, 84, 83, 72, 65, 128, 84, 84, 72, 79, 128, 84, 87, 65, - 65, 128, 87, 73, 78, 69, 128, 89, 65, 71, 72, 128, 89, 65, 90, 72, 128, - 89, 73, 87, 78, 128, 89, 87, 65, 65, 128, 90, 72, 65, 82, 128, 90, 72, - 69, 69, 128, 45, 68, 90, 85, 196, 65, 76, 70, 65, 128, 65, 80, 69, 83, - 207, 65, 82, 71, 73, 128, 66, 66, 85, 84, 128, 66, 69, 65, 84, 128, 66, - 76, 65, 68, 197, 66, 76, 85, 69, 128, 66, 79, 78, 69, 128, 66, 82, 85, - 83, 200, 66, 85, 75, 89, 128, 66, 90, 85, 78, 199, 67, 65, 82, 84, 128, - 67, 85, 79, 80, 128, 67, 85, 82, 86, 197, 67, 87, 73, 73, 128, 67, 87, - 79, 79, 128, 68, 65, 76, 69, 212, 68, 68, 85, 82, 128, 68, 69, 69, 82, - 128, 68, 90, 72, 65, 128, 68, 90, 72, 69, 128, 68, 90, 74, 69, 128, 69, - 65, 82, 84, 200, 69, 82, 65, 83, 197, 70, 69, 69, 68, 128, 70, 73, 83, - 72, 128, 70, 76, 65, 71, 128, 70, 76, 65, 84, 128, 70, 82, 79, 71, 128, - 70, 87, 65, 65, 128, 71, 65, 84, 69, 128, 71, 67, 73, 71, 128, 71, 71, - 79, 80, 128, 71, 71, 85, 79, 128, 71, 72, 65, 68, 128, 71, 72, 72, 65, - 128, 71, 73, 77, 69, 204, 71, 79, 65, 76, 128, 71, 82, 65, 67, 197, 71, - 83, 85, 77, 128, 71, 89, 65, 83, 128, 71, 89, 79, 78, 128, 72, 65, 84, - 69, 128, 72, 65, 86, 69, 128, 72, 66, 65, 83, 193, 72, 69, 82, 85, 128, - 72, 72, 65, 65, 128, 72, 73, 69, 85, 200, 72, 88, 73, 84, 128, 72, 88, - 79, 80, 128, 72, 88, 85, 79, 128, 74, 65, 68, 69, 128, 74, 69, 69, 77, - 128, 74, 72, 69, 72, 128, 74, 74, 73, 69, 128, 74, 74, 85, 84, 128, 75, - 65, 75, 79, 128, 75, 72, 65, 72, 128, 75, 72, 65, 78, 199, 75, 72, 72, - 65, 128, 75, 78, 73, 70, 197, 75, 83, 83, 65, 128, 75, 87, 73, 73, 128, - 75, 87, 79, 79, 128, 76, 69, 65, 70, 128, 76, 73, 87, 78, 128, 76, 79, - 78, 71, 193, 76, 79, 87, 45, 185, 76, 87, 65, 65, 128, 76, 87, 73, 73, - 128, 76, 87, 79, 79, 128, 77, 69, 65, 84, 128, 77, 69, 69, 77, 128, 77, - 69, 69, 84, 128, 77, 69, 83, 79, 128, 77, 73, 69, 85, 205, 77, 79, 85, - 78, 196, 77, 87, 73, 73, 128, 77, 87, 79, 79, 128, 78, 65, 77, 69, 128, - 78, 65, 78, 65, 128, 78, 66, 73, 69, 128, 78, 73, 69, 85, 206, 78, 78, - 78, 65, 128, 78, 79, 68, 69, 128, 78, 89, 73, 80, 128, 78, 89, 79, 80, - 128, 78, 90, 85, 80, 128, 80, 65, 87, 78, 128, 80, 73, 69, 85, 208, 80, - 73, 87, 82, 128, 80, 76, 65, 67, 197, 80, 79, 85, 78, 196, 80, 87, 73, - 73, 128, 80, 87, 79, 79, 128, 81, 85, 79, 84, 197, 82, 65, 89, 83, 128, - 82, 66, 65, 83, 193, 82, 73, 69, 85, 204, 82, 73, 83, 72, 128, 82, 79, - 79, 75, 128, 82, 87, 65, 65, 128, 83, 65, 76, 76, 193, 83, 65, 76, 84, - 128, 83, 69, 65, 76, 128, 83, 72, 65, 65, 128, 83, 72, 65, 84, 128, 83, - 72, 69, 69, 128, 83, 72, 72, 65, 128, 83, 72, 73, 70, 212, 83, 72, 79, - 71, 201, 83, 72, 85, 82, 128, 83, 72, 87, 69, 128, 83, 72, 87, 73, 128, - 83, 72, 87, 79, 128, 83, 76, 85, 82, 128, 83, 77, 65, 83, 200, 83, 78, - 79, 85, 212, 83, 80, 65, 68, 197, 83, 81, 85, 65, 212, 83, 84, 65, 70, - 198, 83, 85, 75, 85, 206, 83, 87, 73, 73, 128, 83, 87, 79, 79, 128, 84, - 69, 88, 84, 128, 84, 72, 69, 82, 197, 84, 72, 79, 79, 128, 84, 73, 77, - 69, 128, 84, 73, 87, 78, 128, 84, 76, 72, 65, 128, 84, 76, 72, 69, 128, - 84, 76, 72, 73, 128, 84, 76, 72, 79, 128, 84, 82, 69, 69, 128, 84, 82, - 85, 69, 128, 84, 83, 72, 69, 128, 84, 87, 73, 73, 128, 84, 87, 79, 79, - 128, 85, 78, 68, 69, 210, 86, 69, 68, 69, 128, 86, 73, 68, 65, 128, 87, - 65, 76, 75, 128, 87, 65, 83, 76, 193, 87, 65, 84, 69, 210, 87, 72, 79, - 76, 197, 87, 79, 79, 68, 128, 87, 79, 79, 76, 128, 87, 89, 78, 78, 128, - 89, 65, 75, 72, 128, 89, 65, 84, 73, 128, 89, 69, 82, 73, 128, 89, 79, - 45, 73, 128, 89, 79, 71, 72, 128, 89, 85, 45, 73, 128, 89, 87, 73, 73, - 128, 89, 87, 79, 79, 128, 90, 65, 73, 78, 128, 90, 65, 81, 69, 198, 90, - 65, 84, 65, 128, 90, 76, 65, 77, 193, 45, 67, 72, 65, 210, 65, 69, 83, - 67, 128, 65, 70, 84, 69, 210, 65, 72, 83, 65, 128, 65, 73, 76, 77, 128, - 65, 73, 78, 78, 128, 65, 75, 66, 65, 210, 65, 76, 71, 73, 218, 65, 76, - 76, 65, 200, 65, 76, 80, 65, 128, 65, 77, 80, 83, 128, 65, 78, 72, 85, - 128, 65, 78, 75, 72, 128, 65, 78, 83, 85, 218, 65, 82, 77, 89, 128, 65, - 84, 78, 65, 200, 65, 85, 78, 78, 128, 65, 89, 65, 72, 128, 66, 48, 49, - 56, 128, 66, 48, 49, 57, 128, 66, 48, 50, 50, 128, 66, 48, 51, 52, 128, - 66, 48, 52, 55, 128, 66, 48, 52, 57, 128, 66, 48, 53, 54, 128, 66, 48, - 54, 51, 128, 66, 48, 54, 52, 128, 66, 48, 55, 57, 128, 66, 48, 56, 50, - 128, 66, 48, 56, 51, 128, 66, 48, 56, 54, 128, 66, 48, 56, 57, 128, 66, - 49, 48, 53, 198, 66, 49, 48, 53, 205, 66, 49, 48, 54, 198, 66, 49, 48, - 54, 205, 66, 49, 48, 55, 198, 66, 49, 48, 55, 205, 66, 49, 48, 56, 198, - 66, 49, 48, 56, 205, 66, 49, 48, 57, 198, 66, 49, 48, 57, 205, 66, 49, - 51, 50, 128, 66, 49, 52, 50, 128, 66, 49, 52, 54, 128, 66, 49, 53, 48, - 128, 66, 49, 53, 50, 128, 66, 49, 53, 51, 128, 66, 49, 53, 52, 128, 66, - 49, 53, 53, 128, 66, 49, 53, 55, 128, 66, 49, 53, 56, 128, 66, 49, 54, - 48, 128, 66, 49, 54, 49, 128, 66, 49, 54, 52, 128, 66, 49, 54, 53, 128, - 66, 49, 54, 54, 128, 66, 49, 54, 55, 128, 66, 49, 54, 56, 128, 66, 49, - 54, 57, 128, 66, 49, 55, 48, 128, 66, 49, 55, 49, 128, 66, 49, 55, 50, - 128, 66, 49, 55, 52, 128, 66, 49, 55, 55, 128, 66, 49, 55, 56, 128, 66, - 49, 55, 57, 128, 66, 49, 56, 48, 128, 66, 49, 56, 49, 128, 66, 49, 56, - 50, 128, 66, 49, 56, 51, 128, 66, 49, 56, 52, 128, 66, 49, 56, 53, 128, - 66, 49, 56, 57, 128, 66, 49, 57, 48, 128, 66, 50, 48, 48, 128, 66, 50, - 48, 49, 128, 66, 50, 48, 50, 128, 66, 50, 48, 51, 128, 66, 50, 48, 52, - 128, 66, 50, 48, 53, 128, 66, 50, 48, 54, 128, 66, 50, 48, 55, 128, 66, - 50, 48, 56, 128, 66, 50, 48, 57, 128, 66, 50, 49, 48, 128, 66, 50, 49, - 49, 128, 66, 50, 49, 50, 128, 66, 50, 49, 51, 128, 66, 50, 49, 52, 128, - 66, 50, 49, 53, 128, 66, 50, 49, 54, 128, 66, 50, 49, 55, 128, 66, 50, - 49, 56, 128, 66, 50, 49, 57, 128, 66, 50, 50, 49, 128, 66, 50, 50, 50, - 128, 66, 50, 50, 54, 128, 66, 50, 50, 55, 128, 66, 50, 50, 56, 128, 66, - 50, 50, 57, 128, 66, 50, 51, 50, 128, 66, 50, 51, 52, 128, 66, 50, 51, - 54, 128, 66, 50, 52, 53, 128, 66, 50, 52, 54, 128, 66, 50, 52, 56, 128, - 66, 50, 52, 57, 128, 66, 50, 53, 48, 128, 66, 50, 53, 49, 128, 66, 50, - 53, 50, 128, 66, 50, 53, 51, 128, 66, 50, 53, 53, 128, 66, 50, 53, 54, - 128, 66, 50, 53, 55, 128, 66, 50, 53, 56, 128, 66, 50, 53, 57, 128, 66, - 51, 48, 53, 128, 66, 65, 67, 75, 128, 66, 65, 71, 65, 128, 66, 65, 72, - 84, 128, 66, 65, 82, 83, 128, 66, 65, 83, 69, 128, 66, 66, 65, 80, 128, - 66, 66, 65, 84, 128, 66, 66, 65, 88, 128, 66, 66, 69, 80, 128, 66, 66, - 69, 88, 128, 66, 66, 73, 69, 128, 66, 66, 73, 80, 128, 66, 66, 73, 84, - 128, 66, 66, 73, 88, 128, 66, 66, 79, 80, 128, 66, 66, 79, 84, 128, 66, - 66, 79, 88, 128, 66, 66, 85, 79, 128, 66, 66, 85, 80, 128, 66, 66, 85, - 82, 128, 66, 66, 85, 88, 128, 66, 66, 89, 80, 128, 66, 66, 89, 84, 128, - 66, 66, 89, 88, 128, 66, 67, 65, 68, 128, 66, 69, 65, 78, 128, 66, 69, - 69, 72, 128, 66, 69, 76, 76, 128, 66, 69, 76, 84, 128, 66, 69, 78, 68, - 128, 66, 69, 79, 82, 195, 66, 69, 84, 72, 128, 66, 73, 82, 85, 128, 66, - 76, 65, 78, 203, 66, 79, 65, 82, 128, 66, 79, 65, 84, 128, 66, 79, 68, - 89, 128, 66, 83, 68, 85, 211, 66, 83, 75, 65, 173, 66, 83, 75, 85, 210, - 66, 85, 76, 76, 128, 66, 85, 77, 80, 217, 66, 87, 69, 69, 128, 67, 65, - 65, 73, 128, 67, 65, 76, 67, 128, 67, 65, 76, 76, 128, 67, 65, 80, 79, - 128, 67, 65, 86, 69, 128, 67, 65, 89, 78, 128, 67, 67, 65, 65, 128, 67, - 67, 69, 69, 128, 67, 67, 72, 65, 128, 67, 67, 72, 69, 128, 67, 67, 72, - 73, 128, 67, 67, 72, 79, 128, 67, 67, 72, 85, 128, 67, 72, 65, 78, 128, - 67, 72, 65, 80, 128, 67, 72, 65, 84, 128, 67, 72, 65, 88, 128, 67, 72, - 69, 80, 128, 67, 72, 69, 84, 128, 67, 72, 69, 88, 128, 67, 72, 79, 65, - 128, 67, 72, 79, 69, 128, 67, 72, 79, 80, 128, 67, 72, 79, 84, 128, 67, - 72, 79, 88, 128, 67, 72, 85, 79, 128, 67, 72, 85, 80, 128, 67, 72, 85, - 82, 128, 67, 72, 85, 88, 128, 67, 72, 89, 80, 128, 67, 72, 89, 82, 128, - 67, 72, 89, 84, 128, 67, 72, 89, 88, 128, 67, 73, 69, 80, 128, 67, 73, - 69, 84, 128, 67, 73, 69, 88, 128, 67, 76, 65, 78, 128, 67, 76, 65, 87, - 128, 67, 76, 69, 65, 210, 67, 76, 79, 83, 197, 67, 79, 68, 65, 128, 67, - 79, 76, 76, 128, 67, 79, 80, 89, 128, 67, 85, 79, 88, 128, 67, 85, 82, - 88, 128, 67, 89, 82, 88, 128, 68, 65, 71, 65, 218, 68, 65, 71, 83, 128, - 68, 65, 73, 82, 128, 68, 65, 77, 80, 128, 68, 65, 82, 84, 128, 68, 68, - 65, 65, 128, 68, 68, 65, 76, 128, 68, 68, 65, 80, 128, 68, 68, 65, 84, - 128, 68, 68, 65, 88, 128, 68, 68, 69, 69, 128, 68, 68, 69, 80, 128, 68, - 68, 69, 88, 128, 68, 68, 72, 79, 128, 68, 68, 73, 69, 128, 68, 68, 73, - 80, 128, 68, 68, 73, 84, 128, 68, 68, 73, 88, 128, 68, 68, 79, 65, 128, - 68, 68, 79, 80, 128, 68, 68, 79, 84, 128, 68, 68, 79, 88, 128, 68, 68, - 85, 79, 128, 68, 68, 85, 80, 128, 68, 68, 85, 84, 128, 68, 68, 85, 88, - 128, 68, 68, 87, 65, 128, 68, 69, 65, 68, 128, 68, 69, 66, 73, 212, 68, - 69, 69, 76, 128, 68, 69, 72, 73, 128, 68, 69, 75, 65, 128, 68, 69, 83, - 73, 128, 68, 72, 65, 76, 128, 68, 73, 80, 76, 201, 68, 73, 83, 72, 128, - 68, 73, 84, 84, 207, 68, 76, 69, 69, 128, 68, 79, 73, 84, 128, 68, 79, - 79, 82, 128, 68, 79, 82, 85, 128, 68, 82, 85, 77, 128, 68, 89, 69, 72, - 128, 68, 90, 69, 69, 128, 69, 72, 87, 65, 218, 69, 74, 69, 67, 212, 69, - 78, 84, 69, 210, 69, 84, 72, 69, 204, 69, 85, 45, 85, 128, 69, 85, 76, - 69, 210, 70, 65, 65, 73, 128, 70, 65, 78, 71, 128, 70, 76, 73, 80, 128, - 70, 79, 82, 77, 211, 70, 82, 65, 78, 195, 70, 85, 82, 88, 128, 70, 85, - 83, 69, 128, 70, 87, 69, 69, 128, 71, 65, 77, 65, 204, 71, 68, 65, 78, - 128, 71, 69, 65, 82, 128, 71, 71, 65, 65, 128, 71, 71, 65, 80, 128, 71, - 71, 65, 84, 128, 71, 71, 65, 88, 128, 71, 71, 69, 69, 128, 71, 71, 69, - 80, 128, 71, 71, 69, 84, 128, 71, 71, 69, 88, 128, 71, 71, 73, 69, 128, - 71, 71, 73, 84, 128, 71, 71, 73, 88, 128, 71, 71, 79, 84, 128, 71, 71, - 79, 88, 128, 71, 71, 85, 80, 128, 71, 71, 85, 82, 128, 71, 71, 85, 84, - 128, 71, 71, 85, 88, 128, 71, 71, 87, 65, 128, 71, 71, 87, 69, 128, 71, - 71, 87, 73, 128, 71, 72, 69, 69, 128, 71, 73, 66, 65, 128, 71, 73, 69, - 84, 128, 71, 73, 71, 65, 128, 71, 79, 73, 78, 199, 71, 79, 82, 84, 128, - 71, 85, 69, 72, 128, 71, 89, 65, 65, 128, 71, 89, 69, 69, 128, 72, 65, - 69, 71, 204, 72, 65, 71, 76, 128, 72, 69, 77, 80, 128, 72, 72, 69, 69, - 128, 72, 72, 87, 65, 128, 72, 73, 69, 88, 128, 72, 73, 90, 66, 128, 72, - 76, 65, 80, 128, 72, 76, 65, 84, 128, 72, 76, 65, 88, 128, 72, 76, 69, - 80, 128, 72, 76, 69, 88, 128, 72, 76, 73, 69, 128, 72, 76, 73, 80, 128, - 72, 76, 73, 84, 128, 72, 76, 73, 88, 128, 72, 76, 79, 80, 128, 72, 76, - 79, 88, 128, 72, 76, 85, 79, 128, 72, 76, 85, 80, 128, 72, 76, 85, 82, - 128, 72, 76, 85, 84, 128, 72, 76, 85, 88, 128, 72, 76, 89, 80, 128, 72, - 76, 89, 82, 128, 72, 76, 89, 84, 128, 72, 76, 89, 88, 128, 72, 77, 65, - 80, 128, 72, 77, 65, 84, 128, 72, 77, 65, 88, 128, 72, 77, 73, 69, 128, - 72, 77, 73, 80, 128, 72, 77, 73, 84, 128, 72, 77, 73, 88, 128, 72, 77, - 79, 80, 128, 72, 77, 79, 84, 128, 72, 77, 79, 88, 128, 72, 77, 85, 79, - 128, 72, 77, 85, 80, 128, 72, 77, 85, 82, 128, 72, 77, 85, 84, 128, 72, - 77, 85, 88, 128, 72, 77, 89, 80, 128, 72, 77, 89, 82, 128, 72, 77, 89, - 88, 128, 72, 78, 65, 80, 128, 72, 78, 65, 84, 128, 72, 78, 65, 88, 128, - 72, 78, 69, 80, 128, 72, 78, 69, 88, 128, 72, 78, 73, 69, 128, 72, 78, - 73, 80, 128, 72, 78, 73, 84, 128, 72, 78, 73, 88, 128, 72, 78, 79, 80, - 128, 72, 78, 79, 84, 128, 72, 78, 79, 88, 128, 72, 78, 85, 79, 128, 72, - 78, 85, 84, 128, 72, 79, 79, 78, 128, 72, 79, 84, 65, 128, 72, 80, 87, - 71, 128, 72, 85, 77, 65, 206, 72, 88, 65, 80, 128, 72, 88, 65, 84, 128, - 72, 88, 65, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 88, 128, 72, 88, - 73, 69, 128, 72, 88, 73, 80, 128, 72, 88, 73, 88, 128, 72, 88, 79, 84, - 128, 72, 88, 79, 88, 128, 72, 90, 87, 71, 128, 72, 90, 90, 80, 128, 72, - 90, 90, 90, 128, 73, 45, 69, 85, 128, 73, 45, 89, 65, 128, 73, 68, 76, - 69, 128, 73, 70, 73, 78, 128, 73, 76, 85, 89, 128, 73, 78, 67, 72, 128, - 73, 78, 78, 69, 210, 73, 78, 78, 78, 128, 73, 78, 84, 73, 128, 73, 83, - 79, 78, 128, 73, 84, 69, 77, 128, 73, 85, 74, 65, 128, 74, 69, 82, 65, - 206, 74, 74, 69, 69, 128, 74, 74, 73, 80, 128, 74, 74, 73, 84, 128, 74, - 74, 73, 88, 128, 74, 74, 79, 80, 128, 74, 74, 79, 84, 128, 74, 74, 79, - 88, 128, 74, 74, 85, 79, 128, 74, 74, 85, 80, 128, 74, 74, 85, 82, 128, - 74, 74, 85, 88, 128, 74, 74, 89, 80, 128, 74, 74, 89, 84, 128, 74, 74, - 89, 88, 128, 74, 85, 76, 89, 128, 74, 85, 78, 69, 128, 74, 85, 79, 84, - 128, 75, 65, 65, 70, 128, 75, 65, 65, 73, 128, 75, 65, 80, 72, 128, 75, - 65, 80, 79, 128, 75, 67, 65, 76, 128, 75, 72, 65, 65, 128, 75, 72, 65, - 73, 128, 75, 72, 65, 78, 128, 75, 72, 69, 69, 128, 75, 72, 79, 78, 128, - 75, 73, 67, 75, 128, 75, 73, 69, 80, 128, 75, 73, 69, 88, 128, 75, 73, - 82, 79, 128, 75, 75, 69, 69, 128, 75, 79, 77, 66, 213, 75, 79, 84, 79, - 128, 75, 85, 79, 80, 128, 75, 85, 79, 88, 128, 75, 85, 82, 84, 128, 75, - 85, 82, 88, 128, 75, 85, 85, 72, 128, 75, 87, 69, 69, 128, 75, 88, 65, - 65, 128, 75, 88, 69, 69, 128, 75, 88, 87, 65, 128, 75, 88, 87, 69, 128, - 75, 88, 87, 73, 128, 75, 89, 65, 65, 128, 75, 89, 69, 69, 128, 76, 65, - 65, 73, 128, 76, 65, 65, 78, 128, 76, 65, 69, 86, 128, 76, 65, 77, 69, - 128, 76, 65, 77, 69, 196, 76, 68, 65, 78, 128, 76, 69, 69, 75, 128, 76, - 69, 71, 83, 128, 76, 69, 86, 69, 204, 76, 69, 90, 72, 128, 76, 72, 65, - 65, 128, 76, 72, 73, 73, 128, 76, 72, 79, 79, 128, 76, 73, 69, 84, 128, - 76, 73, 70, 69, 128, 76, 73, 84, 82, 193, 76, 79, 76, 76, 128, 76, 79, - 79, 84, 128, 76, 85, 73, 83, 128, 76, 85, 79, 84, 128, 77, 65, 65, 73, - 128, 77, 65, 82, 69, 128, 77, 69, 82, 73, 128, 77, 69, 83, 72, 128, 77, - 69, 83, 73, 128, 77, 71, 65, 80, 128, 77, 71, 65, 84, 128, 77, 71, 65, - 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 88, 128, 77, 71, 73, 69, 128, - 77, 71, 79, 80, 128, 77, 71, 79, 84, 128, 77, 71, 79, 88, 128, 77, 71, - 85, 79, 128, 77, 71, 85, 80, 128, 77, 71, 85, 82, 128, 77, 71, 85, 84, - 128, 77, 71, 85, 88, 128, 77, 73, 67, 82, 207, 77, 73, 73, 78, 128, 77, - 73, 76, 76, 197, 77, 73, 77, 69, 128, 77, 73, 78, 89, 128, 77, 73, 82, - 73, 128, 77, 78, 89, 65, 205, 77, 79, 78, 84, 200, 77, 79, 85, 84, 200, - 77, 79, 86, 69, 196, 77, 85, 73, 78, 128, 77, 85, 76, 84, 201, 77, 85, - 79, 84, 128, 77, 87, 69, 69, 128, 78, 65, 65, 73, 128, 78, 65, 73, 82, - 193, 78, 65, 78, 68, 128, 78, 66, 65, 80, 128, 78, 66, 65, 84, 128, 78, - 66, 65, 88, 128, 78, 66, 73, 80, 128, 78, 66, 73, 84, 128, 78, 66, 73, - 88, 128, 78, 66, 79, 80, 128, 78, 66, 79, 84, 128, 78, 66, 79, 88, 128, - 78, 66, 85, 80, 128, 78, 66, 85, 82, 128, 78, 66, 85, 84, 128, 78, 66, - 85, 88, 128, 78, 66, 89, 80, 128, 78, 66, 89, 82, 128, 78, 66, 89, 84, - 128, 78, 66, 89, 88, 128, 78, 68, 65, 80, 128, 78, 68, 65, 84, 128, 78, - 68, 65, 88, 128, 78, 68, 69, 80, 128, 78, 68, 73, 69, 128, 78, 68, 73, - 80, 128, 78, 68, 73, 84, 128, 78, 68, 73, 88, 128, 78, 68, 79, 80, 128, - 78, 68, 79, 84, 128, 78, 68, 79, 88, 128, 78, 68, 85, 80, 128, 78, 68, - 85, 82, 128, 78, 68, 85, 84, 128, 78, 68, 85, 88, 128, 78, 71, 65, 73, - 128, 78, 71, 65, 80, 128, 78, 71, 65, 84, 128, 78, 71, 65, 88, 128, 78, - 71, 69, 80, 128, 78, 71, 69, 88, 128, 78, 71, 73, 69, 128, 78, 71, 75, - 65, 128, 78, 71, 79, 80, 128, 78, 71, 79, 84, 128, 78, 71, 79, 88, 128, - 78, 71, 85, 79, 128, 78, 74, 73, 69, 128, 78, 74, 73, 80, 128, 78, 74, - 73, 84, 128, 78, 74, 73, 88, 128, 78, 74, 79, 80, 128, 78, 74, 79, 84, - 128, 78, 74, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 80, 128, 78, - 74, 85, 82, 128, 78, 74, 85, 88, 128, 78, 74, 89, 80, 128, 78, 74, 89, - 82, 128, 78, 74, 89, 84, 128, 78, 74, 89, 88, 128, 78, 78, 71, 65, 128, - 78, 78, 71, 73, 128, 78, 78, 71, 79, 128, 78, 79, 83, 69, 128, 78, 82, - 65, 80, 128, 78, 82, 65, 84, 128, 78, 82, 65, 88, 128, 78, 82, 69, 80, - 128, 78, 82, 69, 84, 128, 78, 82, 69, 88, 128, 78, 82, 79, 80, 128, 78, - 82, 79, 88, 128, 78, 82, 85, 80, 128, 78, 82, 85, 82, 128, 78, 82, 85, - 84, 128, 78, 82, 85, 88, 128, 78, 82, 89, 80, 128, 78, 82, 89, 82, 128, - 78, 82, 89, 84, 128, 78, 82, 89, 88, 128, 78, 85, 76, 76, 128, 78, 85, - 79, 80, 128, 78, 85, 82, 88, 128, 78, 85, 85, 78, 128, 78, 89, 65, 65, - 128, 78, 89, 67, 65, 128, 78, 89, 69, 69, 128, 78, 89, 69, 72, 128, 78, - 89, 73, 69, 128, 78, 89, 73, 84, 128, 78, 89, 73, 88, 128, 78, 89, 79, - 65, 128, 78, 89, 79, 84, 128, 78, 89, 79, 88, 128, 78, 89, 85, 79, 128, - 78, 89, 85, 80, 128, 78, 89, 85, 84, 128, 78, 89, 85, 88, 128, 78, 89, - 87, 65, 128, 78, 90, 65, 80, 128, 78, 90, 65, 84, 128, 78, 90, 65, 88, - 128, 78, 90, 69, 88, 128, 78, 90, 73, 69, 128, 78, 90, 73, 80, 128, 78, - 90, 73, 84, 128, 78, 90, 73, 88, 128, 78, 90, 79, 80, 128, 78, 90, 79, - 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 82, 128, 78, 90, 85, 88, 128, - 78, 90, 89, 80, 128, 78, 90, 89, 82, 128, 78, 90, 89, 84, 128, 78, 90, - 89, 88, 128, 79, 45, 69, 79, 128, 79, 45, 89, 69, 128, 79, 78, 83, 85, - 128, 79, 79, 77, 85, 128, 79, 79, 90, 69, 128, 79, 85, 78, 67, 197, 80, - 65, 65, 73, 128, 80, 65, 68, 77, 193, 80, 65, 82, 65, 128, 80, 69, 65, - 67, 197, 80, 69, 69, 80, 128, 80, 69, 78, 78, 217, 80, 69, 83, 79, 128, - 80, 72, 65, 65, 128, 80, 72, 65, 78, 128, 80, 72, 69, 69, 128, 80, 72, - 79, 65, 128, 80, 72, 87, 65, 128, 80, 73, 67, 75, 128, 80, 73, 69, 80, - 128, 80, 73, 69, 88, 128, 80, 73, 75, 79, 128, 80, 76, 79, 87, 128, 80, - 82, 65, 77, 128, 80, 82, 73, 78, 212, 80, 85, 79, 80, 128, 80, 85, 79, - 88, 128, 80, 85, 82, 88, 128, 80, 87, 69, 69, 128, 80, 89, 82, 88, 128, - 81, 65, 65, 70, 128, 81, 65, 65, 73, 128, 81, 65, 80, 72, 128, 81, 72, - 65, 65, 128, 81, 72, 69, 69, 128, 81, 72, 87, 65, 128, 81, 72, 87, 69, - 128, 81, 72, 87, 73, 128, 81, 73, 69, 80, 128, 81, 73, 69, 84, 128, 81, - 73, 69, 88, 128, 81, 79, 80, 65, 128, 81, 85, 79, 80, 128, 81, 85, 79, - 84, 128, 81, 85, 79, 88, 128, 81, 85, 82, 88, 128, 81, 85, 85, 86, 128, - 81, 87, 65, 65, 128, 81, 87, 69, 69, 128, 81, 89, 65, 65, 128, 81, 89, - 69, 69, 128, 81, 89, 82, 88, 128, 82, 65, 65, 73, 128, 82, 65, 73, 68, - 207, 82, 65, 78, 71, 197, 82, 69, 77, 85, 128, 82, 73, 67, 69, 128, 82, - 73, 69, 76, 128, 82, 73, 82, 65, 128, 82, 79, 65, 82, 128, 82, 82, 65, - 88, 128, 82, 82, 69, 72, 128, 82, 82, 69, 80, 128, 82, 82, 69, 84, 128, - 82, 82, 69, 88, 128, 82, 82, 79, 80, 128, 82, 82, 79, 84, 128, 82, 82, - 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 80, 128, 82, 82, 85, 82, - 128, 82, 82, 85, 84, 128, 82, 82, 85, 88, 128, 82, 82, 89, 80, 128, 82, - 82, 89, 82, 128, 82, 82, 89, 84, 128, 82, 82, 89, 88, 128, 82, 85, 73, - 83, 128, 82, 85, 76, 69, 128, 82, 85, 79, 80, 128, 82, 85, 83, 73, 128, - 83, 65, 45, 73, 128, 83, 65, 65, 73, 128, 83, 65, 68, 69, 128, 83, 65, - 73, 76, 128, 83, 65, 76, 65, 128, 83, 65, 76, 65, 205, 83, 66, 82, 85, - 204, 83, 67, 87, 65, 128, 83, 68, 79, 78, 199, 83, 72, 65, 80, 128, 83, - 72, 65, 88, 128, 83, 72, 69, 80, 128, 83, 72, 69, 84, 128, 83, 72, 69, - 88, 128, 83, 72, 73, 73, 128, 83, 72, 73, 77, 193, 83, 72, 79, 65, 128, - 83, 72, 79, 79, 128, 83, 72, 79, 84, 128, 83, 72, 79, 88, 128, 83, 72, - 85, 79, 128, 83, 72, 85, 80, 128, 83, 72, 85, 84, 128, 83, 72, 85, 88, - 128, 83, 72, 89, 80, 128, 83, 72, 89, 82, 128, 83, 72, 89, 84, 128, 83, - 72, 89, 88, 128, 83, 73, 71, 69, 204, 83, 73, 88, 84, 217, 83, 75, 73, - 78, 128, 83, 75, 85, 76, 204, 83, 75, 87, 65, 128, 83, 78, 65, 75, 197, - 83, 80, 79, 84, 128, 83, 80, 87, 65, 128, 83, 83, 65, 65, 128, 83, 83, - 65, 80, 128, 83, 83, 65, 84, 128, 83, 83, 65, 88, 128, 83, 83, 69, 69, - 128, 83, 83, 69, 80, 128, 83, 83, 69, 88, 128, 83, 83, 73, 69, 128, 83, - 83, 73, 80, 128, 83, 83, 73, 84, 128, 83, 83, 73, 88, 128, 83, 83, 79, - 80, 128, 83, 83, 79, 84, 128, 83, 83, 79, 88, 128, 83, 83, 85, 80, 128, - 83, 83, 85, 84, 128, 83, 83, 85, 88, 128, 83, 83, 89, 80, 128, 83, 83, - 89, 82, 128, 83, 83, 89, 84, 128, 83, 83, 89, 88, 128, 83, 84, 65, 78, - 128, 83, 84, 69, 80, 128, 83, 84, 73, 76, 197, 83, 84, 73, 76, 204, 83, - 84, 87, 65, 128, 83, 85, 79, 80, 128, 83, 85, 79, 88, 128, 83, 85, 82, - 88, 128, 83, 87, 85, 78, 199, 83, 90, 65, 65, 128, 83, 90, 69, 69, 128, - 83, 90, 87, 65, 128, 83, 90, 87, 71, 128, 84, 65, 65, 73, 128, 84, 65, - 75, 69, 128, 84, 65, 76, 76, 128, 84, 69, 45, 85, 128, 84, 69, 78, 84, - 128, 84, 69, 84, 72, 128, 84, 72, 69, 72, 128, 84, 72, 69, 77, 193, 84, - 72, 69, 89, 128, 84, 72, 79, 65, 128, 84, 72, 85, 82, 211, 84, 72, 87, - 65, 128, 84, 73, 69, 80, 128, 84, 73, 69, 88, 128, 84, 73, 71, 72, 212, - 84, 73, 78, 89, 128, 84, 73, 87, 65, 218, 84, 76, 69, 69, 128, 84, 76, - 72, 85, 128, 84, 79, 84, 65, 204, 84, 82, 65, 68, 197, 84, 82, 73, 79, - 206, 84, 83, 65, 65, 128, 84, 83, 65, 68, 201, 84, 83, 87, 65, 128, 84, - 84, 65, 65, 128, 84, 84, 69, 69, 128, 84, 84, 69, 72, 128, 84, 84, 72, - 69, 128, 84, 84, 72, 73, 128, 84, 84, 83, 65, 128, 84, 84, 83, 69, 128, - 84, 84, 83, 73, 128, 84, 84, 83, 79, 128, 84, 84, 83, 85, 128, 84, 85, - 79, 80, 128, 84, 85, 79, 84, 128, 84, 85, 79, 88, 128, 84, 85, 82, 88, - 128, 84, 90, 65, 65, 128, 84, 90, 69, 69, 128, 84, 90, 79, 65, 128, 85, - 45, 65, 69, 128, 85, 65, 84, 72, 128, 86, 73, 69, 80, 128, 86, 73, 69, - 84, 128, 86, 73, 69, 88, 128, 86, 85, 82, 88, 128, 86, 89, 82, 88, 128, - 87, 65, 69, 78, 128, 87, 65, 76, 76, 128, 87, 69, 76, 76, 128, 87, 69, - 83, 84, 128, 87, 79, 82, 75, 128, 87, 82, 65, 80, 128, 87, 85, 78, 74, - 207, 87, 85, 79, 80, 128, 87, 85, 79, 88, 128, 88, 73, 82, 79, 206, 88, - 89, 65, 65, 128, 88, 89, 69, 69, 128, 88, 89, 82, 88, 128, 89, 65, 45, - 79, 128, 89, 65, 65, 73, 128, 89, 65, 66, 72, 128, 89, 65, 67, 72, 128, - 89, 65, 68, 68, 128, 89, 65, 68, 72, 128, 89, 65, 71, 78, 128, 89, 65, - 72, 72, 128, 89, 65, 82, 82, 128, 89, 65, 83, 72, 128, 89, 65, 83, 83, - 128, 89, 65, 84, 72, 128, 89, 65, 84, 84, 128, 89, 65, 90, 90, 128, 89, - 69, 82, 65, 200, 89, 73, 45, 85, 128, 89, 73, 78, 71, 128, 89, 79, 45, - 79, 128, 89, 79, 77, 79, 128, 89, 79, 82, 73, 128, 89, 85, 45, 65, 128, - 89, 85, 45, 69, 128, 89, 85, 45, 85, 128, 89, 85, 65, 78, 128, 89, 85, - 68, 72, 128, 89, 85, 79, 84, 128, 89, 85, 82, 88, 128, 89, 89, 82, 88, - 128, 90, 65, 89, 73, 206, 90, 72, 65, 65, 128, 90, 72, 65, 80, 128, 90, - 72, 65, 84, 128, 90, 72, 65, 88, 128, 90, 72, 69, 80, 128, 90, 72, 69, - 84, 128, 90, 72, 69, 88, 128, 90, 72, 79, 80, 128, 90, 72, 79, 84, 128, - 90, 72, 79, 88, 128, 90, 72, 85, 79, 128, 90, 72, 85, 80, 128, 90, 72, - 85, 82, 128, 90, 72, 85, 84, 128, 90, 72, 85, 88, 128, 90, 72, 87, 65, - 128, 90, 72, 89, 80, 128, 90, 72, 89, 82, 128, 90, 72, 89, 84, 128, 90, - 72, 89, 88, 128, 90, 85, 79, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, - 80, 128, 90, 90, 65, 84, 128, 90, 90, 65, 88, 128, 90, 90, 69, 69, 128, - 90, 90, 69, 80, 128, 90, 90, 69, 88, 128, 90, 90, 73, 69, 128, 90, 90, - 73, 80, 128, 90, 90, 73, 84, 128, 90, 90, 73, 88, 128, 90, 90, 79, 80, - 128, 90, 90, 79, 88, 128, 90, 90, 85, 80, 128, 90, 90, 85, 82, 128, 90, - 90, 85, 88, 128, 90, 90, 89, 80, 128, 90, 90, 89, 82, 128, 90, 90, 89, - 84, 128, 90, 90, 89, 88, 128, 79, 80, 69, 206, 70, 85, 76, 204, 83, 69, - 69, 206, 73, 79, 84, 193, 69, 65, 83, 212, 70, 82, 79, 205, 84, 79, 68, - 207, 70, 73, 86, 197, 72, 79, 85, 210, 84, 69, 78, 128, 83, 73, 66, 197, - 70, 79, 85, 210, 79, 86, 69, 210, 72, 79, 82, 206, 81, 85, 65, 196, 68, - 65, 83, 200, 78, 69, 79, 128, 80, 72, 73, 128, 80, 83, 73, 128, 84, 72, - 69, 200, 75, 79, 77, 201, 82, 72, 79, 128, 89, 85, 83, 128, 71, 72, 65, - 128, 79, 88, 73, 193, 82, 79, 67, 128, 66, 72, 65, 128, 83, 65, 82, 193, - 84, 65, 67, 203, 84, 65, 85, 128, 68, 79, 69, 211, 74, 72, 65, 128, 82, - 82, 65, 128, 87, 73, 68, 197, 82, 68, 69, 204, 83, 72, 73, 206, 87, 65, - 86, 217, 90, 65, 73, 206, 68, 73, 71, 193, 83, 72, 79, 128, 65, 82, 67, - 128, 75, 65, 70, 128, 76, 69, 71, 128, 83, 84, 79, 208, 84, 65, 77, 128, - 89, 65, 78, 199, 68, 90, 69, 128, 71, 72, 69, 128, 71, 79, 65, 204, 71, - 84, 69, 210, 78, 85, 78, 128, 78, 89, 79, 128, 83, 84, 65, 210, 83, 85, - 78, 128, 84, 65, 73, 204, 87, 65, 86, 197, 87, 65, 87, 128, 87, 79, 82, - 196, 90, 69, 82, 207, 65, 80, 76, 201, 66, 69, 69, 200, 67, 76, 69, 198, - 68, 74, 69, 128, 68, 75, 65, 210, 68, 89, 69, 200, 68, 90, 65, 128, 69, - 73, 69, 128, 70, 69, 72, 128, 70, 73, 83, 200, 71, 65, 78, 128, 71, 85, - 69, 200, 72, 73, 69, 128, 75, 83, 73, 128, 76, 65, 77, 197, 76, 74, 69, - 128, 77, 69, 77, 128, 77, 71, 79, 128, 77, 85, 67, 200, 77, 87, 65, 128, - 78, 65, 77, 197, 78, 65, 82, 128, 78, 74, 69, 128, 78, 79, 87, 128, 78, - 87, 65, 128, 78, 89, 69, 200, 78, 89, 73, 128, 79, 79, 85, 128, 80, 69, - 69, 128, 82, 65, 65, 128, 84, 72, 69, 206, 84, 73, 67, 203, 84, 84, 69, - 200, 89, 79, 68, 128, 66, 65, 83, 197, 66, 69, 69, 128, 66, 79, 87, 128, - 66, 90, 72, 201, 67, 79, 87, 128, 68, 79, 78, 128, 70, 76, 65, 212, 70, - 82, 69, 197, 72, 65, 69, 128, 74, 73, 76, 128, 75, 69, 72, 128, 75, 72, - 73, 128, 75, 72, 79, 128, 75, 87, 69, 128, 75, 87, 73, 128, 76, 65, 83, - 128, 76, 79, 79, 128, 76, 87, 65, 128, 77, 69, 78, 128, 77, 87, 69, 128, - 77, 87, 73, 128, 78, 65, 65, 128, 78, 89, 73, 211, 80, 65, 82, 128, 80, - 69, 72, 128, 80, 72, 79, 128, 80, 87, 69, 128, 80, 87, 73, 128, 81, 65, - 65, 128, 81, 65, 82, 128, 82, 65, 69, 128, 82, 72, 65, 128, 83, 72, 79, - 197, 83, 72, 85, 128, 83, 83, 73, 128, 83, 83, 79, 128, 83, 83, 85, 128, - 84, 72, 65, 204, 84, 79, 79, 128, 84, 87, 69, 128, 86, 69, 69, 128, 86, - 73, 78, 128, 87, 65, 69, 128, 87, 65, 76, 203, 87, 69, 79, 128, 88, 65, - 78, 128, 88, 69, 72, 128, 89, 65, 75, 128, 89, 65, 84, 128, 89, 89, 65, - 128, 90, 69, 78, 128, 65, 76, 76, 201, 65, 89, 66, 128, 65, 90, 85, 128, - 66, 65, 65, 128, 66, 69, 72, 128, 66, 69, 78, 128, 66, 79, 76, 212, 66, - 87, 65, 128, 67, 73, 80, 128, 67, 76, 85, 194, 67, 79, 79, 128, 67, 85, - 80, 128, 67, 87, 69, 128, 67, 87, 73, 128, 67, 87, 79, 128, 67, 89, 80, - 128, 67, 89, 84, 128, 68, 68, 65, 204, 68, 68, 69, 128, 68, 68, 73, 128, - 68, 68, 85, 128, 68, 69, 73, 128, 68, 74, 65, 128, 68, 76, 65, 128, 68, - 79, 71, 128, 68, 82, 85, 205, 69, 87, 69, 128, 70, 65, 65, 128, 70, 69, - 69, 128, 70, 69, 73, 128, 70, 76, 89, 128, 70, 85, 82, 128, 70, 85, 83, - 193, 70, 87, 65, 128, 71, 65, 89, 128, 71, 71, 65, 128, 71, 71, 69, 128, - 71, 71, 73, 128, 71, 71, 79, 128, 71, 71, 85, 128, 71, 72, 79, 128, 71, - 73, 77, 128, 71, 74, 69, 128, 72, 65, 82, 196, 72, 77, 79, 128, 72, 78, - 65, 128, 73, 83, 79, 206, 74, 74, 73, 128, 74, 74, 79, 128, 74, 74, 85, - 128, 74, 74, 89, 128, 75, 65, 73, 128, 75, 69, 78, 128, 75, 72, 69, 128, - 75, 73, 84, 128, 75, 74, 69, 128, 75, 75, 65, 128, 75, 79, 79, 128, 75, - 86, 65, 128, 75, 87, 79, 128, 76, 65, 65, 128, 76, 87, 69, 128, 76, 87, - 73, 128, 76, 87, 79, 128, 77, 65, 65, 128, 77, 79, 79, 128, 77, 79, 79, - 206, 77, 80, 65, 128, 77, 87, 79, 128, 78, 69, 69, 128, 78, 71, 65, 211, - 78, 73, 66, 128, 78, 79, 79, 128, 78, 82, 65, 128, 78, 87, 69, 128, 78, - 89, 85, 128, 79, 72, 77, 128, 79, 73, 76, 128, 79, 75, 84, 207, 79, 78, - 78, 128, 79, 84, 85, 128, 80, 65, 65, 128, 80, 65, 82, 212, 80, 65, 84, - 200, 80, 72, 85, 210, 80, 79, 76, 201, 80, 79, 79, 128, 80, 85, 84, 128, - 80, 87, 79, 128, 80, 89, 84, 128, 81, 65, 73, 128, 81, 73, 73, 128, 81, - 79, 84, 128, 81, 85, 79, 128, 81, 85, 85, 128, 82, 71, 89, 193, 82, 78, - 65, 205, 82, 82, 69, 200, 82, 82, 79, 128, 83, 69, 72, 128, 83, 72, 65, - 196, 83, 72, 79, 199, 83, 72, 89, 128, 83, 73, 79, 211, 83, 74, 69, 128, - 83, 79, 79, 128, 83, 79, 85, 128, 83, 83, 69, 128, 83, 87, 69, 128, 83, - 87, 73, 128, 83, 87, 79, 128, 84, 65, 71, 128, 84, 65, 84, 128, 84, 65, - 86, 128, 84, 69, 84, 128, 84, 74, 69, 128, 84, 76, 65, 128, 84, 76, 73, - 128, 84, 76, 85, 128, 84, 79, 84, 128, 84, 82, 69, 197, 84, 84, 73, 128, - 84, 87, 73, 128, 85, 83, 69, 196, 86, 65, 86, 128, 86, 69, 80, 128, 86, - 69, 82, 217, 86, 69, 87, 128, 86, 79, 85, 128, 86, 85, 82, 128, 87, 65, - 85, 128, 88, 86, 65, 128, 89, 65, 74, 128, 89, 65, 81, 128, 89, 65, 90, - 128, 89, 69, 65, 210, 89, 69, 82, 213, 89, 70, 69, 206, 89, 79, 79, 128, - 89, 87, 69, 128, 89, 87, 73, 128, 89, 87, 79, 128, 90, 72, 73, 128, 90, - 72, 79, 128, 90, 72, 85, 128, 90, 79, 84, 128, 90, 90, 65, 128, 90, 90, - 69, 128, 90, 90, 73, 128, 90, 90, 85, 128, 65, 65, 89, 128, 65, 68, 65, - 203, 65, 77, 66, 193, 65, 82, 67, 200, 65, 84, 79, 205, 65, 85, 69, 128, - 65, 87, 69, 128, 65, 88, 69, 128, 65, 89, 69, 210, 66, 48, 48, 177, 66, - 48, 48, 178, 66, 48, 48, 179, 66, 48, 48, 180, 66, 48, 48, 181, 66, 48, - 48, 182, 66, 48, 48, 183, 66, 48, 48, 184, 66, 48, 48, 185, 66, 48, 49, - 176, 66, 48, 49, 177, 66, 48, 49, 178, 66, 48, 49, 179, 66, 48, 49, 180, - 66, 48, 49, 181, 66, 48, 49, 182, 66, 48, 49, 183, 66, 48, 50, 176, 66, - 48, 50, 177, 66, 48, 50, 179, 66, 48, 50, 180, 66, 48, 50, 181, 66, 48, - 50, 182, 66, 48, 50, 183, 66, 48, 50, 184, 66, 48, 50, 185, 66, 48, 51, - 176, 66, 48, 51, 177, 66, 48, 51, 178, 66, 48, 51, 179, 66, 48, 51, 182, - 66, 48, 51, 183, 66, 48, 51, 184, 66, 48, 51, 185, 66, 48, 52, 176, 66, - 48, 52, 177, 66, 48, 52, 178, 66, 48, 52, 179, 66, 48, 52, 180, 66, 48, - 52, 181, 66, 48, 52, 182, 66, 48, 52, 184, 66, 48, 53, 176, 66, 48, 53, - 177, 66, 48, 53, 178, 66, 48, 53, 179, 66, 48, 53, 180, 66, 48, 53, 181, - 66, 48, 53, 183, 66, 48, 53, 184, 66, 48, 53, 185, 66, 48, 54, 176, 66, - 48, 54, 177, 66, 48, 54, 178, 66, 48, 54, 181, 66, 48, 54, 182, 66, 48, - 54, 183, 66, 48, 54, 184, 66, 48, 54, 185, 66, 48, 55, 176, 66, 48, 55, - 177, 66, 48, 55, 178, 66, 48, 55, 179, 66, 48, 55, 180, 66, 48, 55, 181, - 66, 48, 55, 182, 66, 48, 55, 183, 66, 48, 55, 184, 66, 48, 56, 176, 66, - 48, 56, 177, 66, 48, 56, 181, 66, 48, 56, 183, 66, 48, 57, 176, 66, 48, - 57, 177, 66, 49, 48, 176, 66, 49, 48, 178, 66, 49, 48, 180, 66, 49, 48, - 181, 66, 49, 50, 176, 66, 49, 50, 177, 66, 49, 50, 178, 66, 49, 50, 179, - 66, 49, 50, 181, 66, 49, 50, 183, 66, 49, 50, 184, 66, 49, 51, 176, 66, - 49, 51, 177, 66, 49, 51, 179, 66, 49, 51, 181, 66, 49, 52, 176, 66, 49, - 52, 177, 66, 49, 52, 181, 66, 49, 53, 177, 66, 49, 53, 182, 66, 49, 53, - 185, 66, 49, 54, 178, 66, 49, 54, 179, 66, 49, 55, 179, 66, 49, 55, 182, - 66, 49, 57, 177, 66, 50, 50, 176, 66, 50, 50, 181, 66, 50, 51, 176, 66, - 50, 51, 177, 66, 50, 51, 179, 66, 50, 52, 176, 66, 50, 52, 177, 66, 50, - 52, 178, 66, 50, 52, 179, 66, 50, 52, 183, 66, 50, 53, 180, 66, 65, 78, - 203, 66, 66, 65, 128, 66, 66, 69, 128, 66, 66, 73, 128, 66, 66, 79, 128, - 66, 66, 85, 128, 66, 66, 89, 128, 66, 67, 65, 196, 66, 69, 76, 204, 66, - 69, 76, 212, 66, 69, 84, 128, 66, 69, 84, 193, 66, 72, 79, 128, 66, 73, - 66, 128, 66, 73, 71, 128, 66, 75, 65, 173, 66, 79, 65, 128, 66, 87, 69, - 128, 66, 87, 73, 128, 66, 88, 71, 128, 67, 65, 68, 193, 67, 65, 78, 199, - 67, 65, 82, 197, 67, 65, 84, 128, 67, 65, 88, 128, 67, 67, 65, 128, 67, - 67, 69, 128, 67, 67, 73, 128, 67, 67, 79, 128, 67, 67, 85, 128, 67, 69, - 68, 201, 67, 69, 78, 128, 67, 69, 80, 128, 67, 69, 88, 128, 67, 72, 65, - 196, 67, 72, 69, 206, 67, 73, 69, 128, 67, 73, 73, 128, 67, 73, 84, 128, - 67, 73, 88, 128, 67, 79, 65, 128, 67, 79, 80, 128, 67, 79, 84, 128, 67, - 79, 88, 128, 67, 85, 66, 197, 67, 85, 79, 128, 67, 85, 82, 128, 67, 85, - 84, 128, 67, 85, 88, 128, 67, 89, 65, 128, 67, 89, 82, 128, 67, 89, 88, - 128, 68, 65, 68, 128, 68, 65, 69, 199, 68, 65, 77, 208, 68, 65, 82, 203, - 68, 65, 84, 197, 68, 69, 75, 128, 68, 69, 90, 200, 68, 76, 73, 128, 68, - 76, 79, 128, 68, 76, 85, 128, 68, 82, 73, 204, 68, 82, 89, 128, 68, 85, - 76, 128, 68, 87, 69, 128, 68, 87, 79, 128, 68, 89, 79, 128, 68, 90, 73, - 128, 68, 90, 79, 128, 68, 90, 85, 128, 69, 71, 71, 128, 69, 73, 83, 128, - 69, 75, 83, 128, 69, 78, 78, 128, 69, 78, 79, 211, 69, 79, 72, 128, 69, - 82, 71, 128, 69, 82, 82, 128, 69, 85, 82, 207, 69, 88, 79, 128, 70, 65, - 78, 128, 70, 65, 80, 128, 70, 65, 88, 128, 70, 69, 69, 196, 70, 69, 72, - 213, 70, 69, 78, 199, 70, 69, 79, 200, 70, 70, 73, 128, 70, 70, 76, 128, - 70, 73, 73, 128, 70, 73, 76, 197, 70, 73, 76, 204, 70, 73, 80, 128, 70, - 73, 84, 128, 70, 73, 88, 128, 70, 79, 79, 128, 70, 79, 80, 128, 70, 79, - 88, 128, 70, 85, 80, 128, 70, 85, 84, 128, 70, 85, 88, 128, 70, 87, 69, - 128, 70, 87, 73, 128, 70, 89, 65, 128, 70, 89, 80, 128, 70, 89, 84, 128, - 70, 89, 88, 128, 71, 65, 70, 128, 71, 65, 71, 128, 71, 65, 76, 128, 71, - 65, 82, 128, 71, 67, 65, 206, 71, 69, 66, 207, 71, 69, 84, 193, 71, 72, - 73, 128, 71, 72, 85, 128, 71, 72, 90, 128, 71, 73, 80, 128, 71, 79, 65, - 128, 71, 80, 65, 128, 71, 83, 85, 205, 71, 89, 65, 128, 71, 89, 69, 128, - 71, 89, 70, 213, 71, 89, 73, 128, 71, 89, 79, 128, 71, 89, 85, 128, 72, - 69, 76, 205, 72, 69, 78, 199, 72, 72, 69, 128, 72, 72, 73, 128, 72, 72, - 79, 128, 72, 72, 85, 128, 72, 76, 65, 128, 72, 76, 69, 128, 72, 76, 73, - 128, 72, 76, 79, 128, 72, 76, 85, 128, 72, 76, 89, 128, 72, 77, 73, 128, - 72, 77, 85, 128, 72, 77, 89, 128, 72, 78, 69, 128, 72, 78, 73, 128, 72, - 80, 65, 128, 72, 87, 85, 128, 72, 88, 65, 128, 72, 88, 69, 128, 72, 88, - 73, 128, 72, 88, 79, 128, 72, 90, 71, 128, 72, 90, 84, 128, 72, 90, 87, - 128, 72, 90, 90, 128, 73, 45, 65, 128, 73, 45, 79, 128, 73, 79, 82, 128, - 74, 65, 65, 128, 74, 65, 82, 128, 74, 69, 72, 128, 74, 69, 82, 128, 74, - 72, 79, 128, 74, 73, 65, 128, 74, 74, 65, 128, 74, 74, 69, 128, 74, 79, - 65, 128, 74, 79, 89, 128, 74, 87, 65, 128, 75, 65, 72, 128, 75, 65, 80, - 128, 75, 65, 85, 206, 75, 65, 88, 128, 75, 69, 80, 128, 75, 69, 88, 128, - 75, 69, 89, 128, 75, 72, 90, 128, 75, 73, 69, 128, 75, 73, 72, 128, 75, - 73, 73, 128, 75, 73, 80, 128, 75, 73, 88, 128, 75, 75, 69, 128, 75, 75, - 73, 128, 75, 75, 79, 128, 75, 75, 85, 128, 75, 79, 65, 128, 75, 79, 72, - 128, 75, 79, 80, 128, 75, 79, 84, 128, 75, 79, 88, 128, 75, 80, 65, 128, - 75, 82, 65, 128, 75, 85, 79, 128, 75, 85, 80, 128, 75, 85, 82, 128, 75, - 85, 84, 128, 75, 85, 88, 128, 75, 88, 65, 128, 75, 88, 69, 128, 75, 88, - 73, 128, 75, 88, 79, 128, 75, 88, 85, 128, 75, 89, 65, 128, 75, 89, 69, - 128, 75, 89, 73, 128, 75, 89, 79, 128, 75, 89, 85, 128, 76, 65, 69, 128, - 76, 65, 71, 213, 76, 65, 83, 212, 76, 65, 90, 217, 76, 69, 79, 128, 76, - 72, 65, 199, 76, 73, 68, 128, 76, 73, 73, 128, 76, 73, 78, 203, 76, 73, - 82, 193, 76, 79, 65, 128, 76, 79, 71, 128, 76, 79, 71, 210, 76, 79, 84, - 128, 76, 89, 89, 128, 77, 65, 83, 213, 77, 65, 89, 128, 77, 67, 72, 213, - 77, 68, 85, 206, 77, 69, 84, 193, 77, 69, 88, 128, 77, 71, 65, 128, 77, - 71, 69, 128, 77, 71, 85, 128, 77, 72, 90, 128, 77, 73, 73, 128, 77, 73, - 76, 128, 77, 73, 76, 204, 77, 73, 77, 128, 77, 79, 65, 128, 77, 79, 76, - 128, 77, 89, 65, 128, 77, 89, 84, 128, 78, 65, 71, 128, 78, 65, 79, 211, - 78, 66, 65, 128, 78, 66, 73, 128, 78, 66, 79, 128, 78, 66, 85, 128, 78, - 66, 89, 128, 78, 68, 69, 128, 78, 69, 78, 128, 78, 69, 84, 128, 78, 69, - 88, 212, 78, 71, 71, 128, 78, 74, 73, 128, 78, 74, 79, 128, 78, 74, 85, - 128, 78, 74, 89, 128, 78, 78, 71, 128, 78, 78, 79, 128, 78, 79, 65, 128, - 78, 82, 69, 128, 78, 82, 79, 128, 78, 82, 85, 128, 78, 82, 89, 128, 78, - 85, 76, 204, 78, 85, 80, 128, 78, 85, 82, 128, 78, 85, 88, 128, 78, 89, - 69, 128, 78, 90, 65, 128, 78, 90, 73, 128, 78, 90, 85, 128, 78, 90, 89, - 128, 79, 45, 69, 128, 79, 65, 75, 128, 79, 65, 89, 128, 79, 66, 79, 204, - 80, 65, 80, 128, 80, 65, 84, 128, 80, 65, 88, 128, 80, 72, 85, 128, 80, - 73, 69, 128, 80, 73, 71, 128, 80, 73, 80, 128, 80, 73, 84, 128, 80, 73, - 88, 128, 80, 76, 65, 128, 80, 79, 65, 128, 80, 79, 80, 128, 80, 79, 88, - 128, 80, 80, 77, 128, 80, 85, 50, 128, 80, 85, 79, 128, 80, 85, 80, 128, - 80, 85, 82, 128, 80, 85, 88, 128, 80, 89, 80, 128, 80, 89, 82, 128, 80, - 89, 88, 128, 81, 65, 76, 193, 81, 65, 81, 128, 81, 65, 85, 128, 81, 69, - 69, 128, 81, 72, 65, 128, 81, 72, 69, 128, 81, 72, 73, 128, 81, 72, 79, - 128, 81, 72, 85, 128, 81, 73, 69, 128, 81, 73, 80, 128, 81, 73, 84, 128, - 81, 73, 88, 128, 81, 79, 65, 128, 81, 79, 70, 128, 81, 79, 79, 128, 81, - 79, 80, 128, 81, 79, 88, 128, 81, 85, 65, 128, 81, 85, 69, 128, 81, 85, - 73, 128, 81, 85, 75, 128, 81, 85, 80, 128, 81, 85, 82, 128, 81, 85, 84, - 128, 81, 85, 86, 128, 81, 85, 88, 128, 81, 87, 65, 128, 81, 87, 69, 128, - 81, 87, 73, 128, 81, 89, 65, 128, 81, 89, 69, 128, 81, 89, 73, 128, 81, - 89, 79, 128, 81, 89, 80, 128, 81, 89, 82, 128, 81, 89, 84, 128, 81, 89, - 85, 128, 81, 89, 88, 128, 82, 65, 50, 128, 82, 65, 51, 128, 82, 65, 68, - 128, 82, 65, 68, 201, 82, 65, 73, 206, 82, 65, 77, 211, 82, 69, 73, 196, - 82, 73, 80, 128, 82, 74, 69, 128, 82, 74, 69, 211, 82, 79, 65, 128, 82, - 79, 79, 128, 82, 82, 69, 128, 82, 82, 85, 128, 82, 82, 89, 128, 82, 85, - 65, 128, 82, 85, 78, 128, 82, 87, 65, 128, 82, 89, 65, 128, 82, 89, 89, - 128, 83, 45, 87, 128, 83, 65, 68, 128, 83, 65, 89, 128, 83, 66, 85, 194, - 83, 71, 65, 194, 83, 71, 79, 210, 83, 71, 82, 193, 83, 73, 73, 128, 83, - 73, 78, 197, 83, 75, 87, 128, 83, 78, 65, 208, 83, 79, 65, 128, 83, 79, - 87, 128, 83, 83, 89, 128, 83, 85, 65, 128, 83, 85, 79, 128, 83, 85, 82, - 128, 83, 90, 65, 128, 83, 90, 69, 128, 83, 90, 73, 128, 83, 90, 79, 128, - 83, 90, 85, 128, 84, 65, 50, 128, 84, 65, 79, 128, 84, 65, 80, 128, 84, - 65, 80, 197, 84, 65, 87, 128, 84, 65, 88, 128, 84, 69, 83, 200, 84, 69, - 84, 200, 84, 69, 88, 128, 84, 72, 69, 211, 84, 72, 73, 206, 84, 72, 90, - 128, 84, 73, 73, 128, 84, 73, 80, 128, 84, 73, 84, 128, 84, 73, 88, 128, - 84, 76, 86, 128, 84, 79, 65, 128, 84, 79, 88, 128, 84, 82, 73, 128, 84, - 83, 86, 128, 84, 84, 72, 128, 84, 84, 85, 128, 84, 85, 79, 128, 84, 85, - 80, 128, 84, 85, 82, 128, 84, 85, 84, 128, 84, 85, 88, 128, 84, 89, 65, - 128, 84, 89, 69, 128, 84, 89, 73, 128, 84, 89, 79, 128, 84, 90, 65, 128, - 84, 90, 69, 128, 84, 90, 73, 128, 84, 90, 79, 128, 84, 90, 85, 128, 85, - 69, 69, 128, 85, 69, 89, 128, 85, 78, 68, 207, 85, 78, 73, 212, 85, 82, - 85, 218, 86, 65, 65, 128, 86, 65, 80, 128, 86, 65, 84, 128, 86, 65, 88, - 128, 86, 69, 72, 128, 86, 69, 88, 128, 86, 73, 69, 128, 86, 73, 80, 128, - 86, 73, 84, 128, 86, 73, 88, 128, 86, 79, 73, 196, 86, 79, 80, 128, 86, - 79, 84, 128, 86, 79, 87, 128, 86, 79, 88, 128, 86, 85, 80, 128, 86, 85, - 84, 128, 86, 85, 88, 128, 86, 87, 65, 128, 86, 89, 80, 128, 86, 89, 82, - 128, 86, 89, 84, 128, 86, 89, 88, 128, 87, 65, 80, 128, 87, 65, 84, 128, - 87, 65, 88, 128, 87, 69, 80, 128, 87, 69, 88, 128, 87, 79, 65, 128, 87, - 79, 69, 128, 87, 79, 80, 128, 87, 79, 82, 203, 87, 79, 88, 128, 87, 85, - 79, 128, 87, 89, 78, 206, 88, 79, 65, 128, 88, 79, 82, 128, 88, 89, 65, - 128, 88, 89, 69, 128, 88, 89, 73, 128, 88, 89, 79, 128, 88, 89, 80, 128, - 88, 89, 82, 128, 88, 89, 84, 128, 88, 89, 85, 128, 88, 89, 88, 128, 89, - 65, 66, 128, 89, 65, 68, 128, 89, 65, 70, 128, 89, 65, 71, 128, 89, 65, - 77, 128, 89, 65, 80, 128, 89, 65, 82, 128, 89, 65, 86, 128, 89, 65, 87, - 128, 89, 65, 89, 128, 89, 69, 65, 128, 89, 69, 87, 128, 89, 69, 89, 128, - 89, 73, 73, 128, 89, 85, 68, 200, 89, 85, 82, 128, 89, 89, 80, 128, 89, - 89, 82, 128, 89, 89, 84, 128, 89, 89, 88, 128, 90, 65, 72, 128, 90, 72, - 89, 128, 90, 76, 65, 128, 90, 79, 79, 128, 90, 82, 65, 128, 90, 85, 84, - 128, 90, 90, 89, 128, 75, 65, 198, 66, 69, 200, 68, 65, 217, 84, 72, 197, - 70, 69, 200, 68, 65, 196, 83, 65, 196, 69, 78, 196, 81, 65, 198, 84, 65, - 200, 65, 82, 195, 78, 79, 210, 76, 69, 203, 77, 65, 201, 79, 67, 210, 66, - 73, 199, 82, 72, 207, 84, 69, 206, 87, 65, 215, 89, 73, 199, 67, 72, 197, - 77, 71, 207, 65, 82, 205, 66, 85, 212, 67, 85, 205, 71, 72, 197, 78, 69, - 207, 80, 85, 128, 84, 73, 208, 71, 65, 198, 75, 72, 207, 90, 65, 200, 68, - 73, 197, 80, 72, 201, 90, 72, 197, 80, 72, 207, 81, 73, 128, 81, 85, 128, - 83, 73, 216, 67, 72, 207, 77, 69, 206, 77, 73, 196, 78, 69, 212, 80, 69, - 200, 81, 79, 128, 86, 69, 200, 89, 79, 196, 66, 65, 199, 66, 69, 212, 68, - 89, 207, 70, 79, 128, 72, 65, 193, 75, 65, 201, 78, 65, 199, 81, 69, 128, - 82, 65, 196, 83, 73, 206, 86, 65, 214, 45, 85, 205, 67, 72, 201, 68, 65, - 208, 68, 85, 204, 68, 90, 128, 69, 88, 207, 71, 82, 213, 71, 85, 199, 72, - 79, 212, 72, 80, 128, 72, 86, 128, 73, 74, 128, 73, 85, 128, 73, 89, 128, - 74, 69, 200, 74, 79, 212, 75, 69, 217, 75, 71, 128, 75, 75, 128, 76, 74, - 128, 77, 73, 199, 78, 74, 128, 78, 85, 206, 78, 86, 128, 78, 89, 201, 79, - 72, 205, 80, 65, 215, 81, 79, 207, 82, 68, 207, 83, 85, 206, 83, 87, 128, - 87, 79, 206, 89, 69, 206, 89, 85, 211, 65, 78, 207, 66, 69, 206, 66, 79, - 215, 66, 81, 128, 67, 77, 128, 67, 85, 212, 68, 76, 128, 68, 77, 128, 68, - 82, 217, 68, 86, 128, 69, 67, 200, 70, 77, 128, 70, 89, 128, 71, 66, 128, - 71, 86, 128, 71, 89, 128, 72, 71, 128, 72, 75, 128, 73, 83, 211, 75, 66, - 128, 75, 73, 208, 75, 76, 128, 75, 77, 128, 75, 84, 128, 75, 86, 128, 76, - 65, 215, 76, 67, 197, 76, 67, 201, 76, 72, 128, 76, 78, 128, 76, 88, 128, - 77, 66, 128, 77, 69, 205, 77, 71, 128, 77, 72, 128, 77, 76, 128, 77, 77, - 128, 77, 83, 128, 77, 86, 128, 77, 87, 128, 78, 65, 193, 78, 70, 128, 78, - 71, 207, 78, 72, 128, 78, 77, 128, 78, 87, 128, 78, 89, 196, 79, 86, 128, - 80, 67, 128, 80, 69, 211, 80, 70, 128, 80, 79, 208, 80, 82, 128, 80, 86, - 128, 80, 87, 128, 81, 79, 198, 81, 89, 128, 82, 73, 206, 82, 74, 197, 82, - 85, 194, 83, 78, 193, 83, 79, 198, 83, 82, 128, 84, 65, 213, 84, 65, 214, - 84, 69, 197, 84, 69, 212, 84, 73, 210, 84, 82, 128, 86, 69, 197, 86, 69, - 215, 87, 66, 128, 87, 86, 128, 88, 89, 128, 89, 65, 210, 89, 86, 128, 90, - 76, 193, 66, 217, 77, 213, 65, 197, 89, 213, 68, 218, 90, 197, 75, 205, - 67, 205, 68, 205, 75, 213, 77, 205, 68, 194, 76, 218, 77, 194, 77, 207, - 77, 214, 77, 215, 80, 207, 81, 208, 84, 195, 202, 209, + 45, 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, + 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, + 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 210, + 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, + 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, + 84, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, 83, 69, 69, 206, + 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, 78, 128, 83, 69, 67, + 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, 69, 67, 79, 78, 68, + 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, 65, 76, 128, 83, 69, + 65, 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 67, 87, 65, 128, 83, 67, + 82, 85, 80, 76, 69, 128, 83, 67, 82, 73, 80, 84, 128, 83, 67, 82, 69, 69, + 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, 79, 82, 80, 73, 85, 83, 128, + 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, + 87, 193, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, + 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, 78, 68, 73, 67, 85, 211, + 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, 83, 66, 85, 194, 83, 66, + 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65, 89, 65, 78, 78, 65, 128, + 83, 65, 89, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 85, 73, 76, + 128, 83, 65, 84, 85, 82, 78, 128, 83, 65, 82, 193, 83, 65, 78, 89, 79, + 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, 84, 73, 73, 77, 85, + 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, + 128, 83, 65, 77, 89, 79, 203, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, + 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, + 83, 65, 77, 69, 75, 200, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, + 128, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, + 83, 65, 76, 65, 205, 83, 65, 76, 65, 128, 83, 65, 74, 68, 65, 72, 128, + 83, 65, 73, 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 71, 73, 84, + 84, 65, 82, 73, 85, 83, 128, 83, 65, 70, 72, 65, 128, 83, 65, 68, 72, 69, + 128, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, 67, 82, + 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, + 128, 83, 65, 45, 73, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, + 196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, + 128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 89, 65, 128, 82, 87, 65, 72, + 65, 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, 85, + 85, 66, 85, 82, 85, 128, 82, 85, 84, 128, 82, 85, 83, 73, 128, 82, 85, + 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, 80, 69, + 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, 82, 85, + 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 128, 82, 85, 76, 69, + 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69, 128, 82, 85, 75, 75, + 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 194, 82, 85, 65, 128, + 82, 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, + 82, 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, + 89, 80, 128, 82, 82, 89, 128, 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, + 82, 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, + 82, 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, + 88, 128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, + 82, 69, 88, 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, + 72, 128, 82, 82, 69, 200, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, + 65, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, + 80, 69, 196, 82, 79, 84, 65, 84, 69, 196, 82, 79, 79, 84, 128, 82, 79, + 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, 77, 65, 206, + 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, 82, 79, 65, 82, 128, 82, 79, + 65, 128, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82, 78, 65, 205, + 82, 74, 69, 211, 82, 74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, + 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, + 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, + 65, 128, 82, 73, 80, 128, 82, 73, 78, 71, 128, 82, 73, 78, 70, 79, 82, + 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 75, 82, 73, 75, 128, 82, + 73, 73, 128, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, 72, + 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, 212, + 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, 72, + 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, 196, + 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 69, 85, + 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, + 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, + 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, + 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, + 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, + 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, + 76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, + 76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, + 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, + 82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, + 77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, + 73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, + 77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, + 128, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 82, 73, 69, + 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, + 73, 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 204, 82, 73, + 69, 76, 128, 82, 73, 67, 69, 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, + 195, 82, 72, 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, + 71, 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, + 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, + 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82, 69, 86, 69, 82, 83, 197, + 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, + 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 83, 85, 80, 73, + 78, 85, 83, 128, 82, 69, 83, 84, 128, 82, 69, 83, 80, 79, 78, 83, 69, + 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, + 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, 78, 67, 69, 128, 82, 69, 83, 73, + 68, 69, 78, 67, 69, 128, 82, 69, 83, 72, 128, 82, 69, 83, 200, 82, 69, + 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, 77, 69, 78, + 212, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, + 69, 80, 69, 65, 212, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 77, 85, + 128, 82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 69, 65, 83, 69, + 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, + 78, 128, 82, 69, 73, 196, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, + 69, 70, 69, 82, 69, 78, 67, 197, 82, 69, 67, 89, 67, 76, 73, 78, 199, 82, + 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, + 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 65, 78, 71, + 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 79, 82, 68, + 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, 82, + 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 65, 72, 77, 85, 75, + 128, 82, 69, 65, 67, 72, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, + 83, 193, 82, 65, 89, 83, 128, 82, 65, 89, 65, 78, 78, 65, 128, 82, 65, + 84, 73, 79, 128, 82, 65, 84, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, + 72, 65, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, + 65, 77, 211, 82, 65, 77, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, + 73, 83, 69, 196, 82, 65, 73, 78, 128, 82, 65, 73, 206, 82, 65, 73, 68, + 207, 82, 65, 73, 68, 65, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, + 200, 82, 65, 70, 69, 128, 82, 65, 69, 128, 82, 65, 68, 73, 79, 65, 67, + 84, 73, 86, 197, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, + 65, 73, 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, 45, + 67, 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89, 84, 128, 81, + 89, 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89, 79, 128, 81, + 89, 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89, 65, 65, 128, + 81, 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69, 69, 128, 81, + 87, 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85, 88, 128, 81, + 85, 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85, 84, 128, 81, + 85, 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128, 81, 85, 82, + 128, 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84, 197, 81, 85, + 79, 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85, 79, 80, 128, + 81, 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, + 77, 193, 81, 85, 73, 76, 76, 128, 81, 85, 73, 128, 81, 85, 69, 83, 84, + 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, + 84, 73, 79, 206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 128, 81, 85, 66, + 85, 84, 83, 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, + 84, 69, 82, 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, + 69, 82, 128, 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 68, 82, 85, 80, 76, + 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, + 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, + 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, 79, 80, 65, 128, 81, 79, + 80, 128, 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, + 79, 65, 128, 81, 79, 128, 81, 73, 88, 128, 81, 73, 84, 128, 81, 73, 80, + 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, + 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, + 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, + 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, + 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, 65, 128, 81, + 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, 65, 85, 128, + 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, + 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, + 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, + 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, + 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, + 65, 65, 128, 209, 80, 89, 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, + 80, 89, 82, 128, 80, 89, 80, 128, 80, 89, 128, 80, 87, 79, 79, 128, 80, + 87, 79, 128, 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, + 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, + 88, 128, 80, 85, 84, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, + 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 128, 80, 85, 80, 128, 80, + 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, 67, + 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, + 206, 80, 85, 50, 128, 80, 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, + 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, + 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, + 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, + 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, + 79, 211, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, + 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, + 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, + 76, 69, 210, 80, 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, + 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, + 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, + 71, 82, 69, 83, 83, 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, + 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, 86, 65, 84, + 69, 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 77, + 69, 128, 80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, + 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, + 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, + 80, 82, 69, 70, 65, 67, 197, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, + 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, + 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, 73, + 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, 79, + 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, 85, + 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, 66, + 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, 80, + 82, 65, 205, 80, 82, 128, 80, 80, 77, 128, 80, 79, 88, 128, 80, 79, 87, + 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, + 79, 206, 80, 79, 83, 84, 65, 204, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, + 128, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, + 85, 211, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 128, 80, 79, 78, 68, + 79, 128, 80, 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 75, 79, 74, 73, + 128, 80, 79, 73, 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, + 79, 73, 78, 84, 69, 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, + 80, 79, 69, 84, 82, 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, + 83, 128, 80, 79, 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, + 84, 65, 128, 80, 76, 85, 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, + 211, 80, 76, 85, 83, 128, 80, 76, 85, 211, 80, 76, 79, 87, 128, 80, 76, + 69, 84, 72, 82, 79, 78, 128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, + 65, 78, 67, 203, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 197, 80, + 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, 80, 73, 88, 128, + 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, + 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 67, 69, 83, 128, + 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, + 204, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73, + 75, 79, 128, 80, 73, 71, 128, 80, 73, 69, 88, 128, 80, 73, 69, 85, 80, + 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, + 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, + 83, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, + 84, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, + 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, + 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, + 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, + 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, + 78, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, + 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69, 85, 208, 80, 73, 69, + 80, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73, 67, 75, 128, + 80, 73, 65, 83, 85, 84, 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, + 65, 78, 79, 128, 80, 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, + 79, 128, 80, 72, 85, 210, 80, 72, 85, 78, 71, 128, 80, 72, 85, 128, 80, + 72, 82, 65, 83, 69, 128, 80, 72, 79, 65, 128, 80, 72, 79, 128, 80, 72, + 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, 80, 72, + 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, + 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, 128, 80, 72, + 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 82, 89, 78, 71, + 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, 65, + 128, 80, 72, 65, 128, 80, 70, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, + 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, + 128, 80, 69, 83, 207, 80, 69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, + 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, + 83, 79, 78, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 82, 128, + 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, 77, 65, + 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, 80, 69, + 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 69, 67, 84, 85, 205, + 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, 69, 82, 70, 69, 67, 84, 193, 80, + 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, + 69, 79, 82, 84, 200, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, + 83, 85, 128, 80, 69, 78, 78, 217, 80, 69, 78, 73, 72, 73, 128, 80, 69, + 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, 80, + 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, + 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, 69, + 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 80, 128, 80, + 69, 69, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, 69, 83, 84, + 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, + 197, 80, 67, 128, 80, 65, 90, 69, 82, 128, 80, 65, 89, 65, 78, 78, 65, + 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, 65, 215, 80, 65, 86, 73, + 89, 65, 78, 73, 128, 80, 65, 84, 84, 69, 82, 78, 128, 80, 65, 84, 72, 65, + 77, 65, 83, 65, 84, 128, 80, 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, + 65, 84, 65, 72, 128, 80, 65, 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, + 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, + 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, + 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, + 69, 81, 128, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 65, 82, 84, + 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 80, 65, 82, 84, + 73, 65, 204, 80, 65, 82, 212, 80, 65, 82, 73, 67, 72, 79, 78, 128, 80, + 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, 80, 65, 82, 69, 78, 84, + 72, 69, 83, 73, 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, + 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, 82, 65, 76, 76, 69, 76, 79, + 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 65, 82, 65, + 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, 128, 80, 65, + 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75, 65, 76, 69, 83, + 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, + 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, + 65, 128, 80, 65, 82, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, + 77, 85, 68, 80, 79, 68, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, + 67, 72, 75, 65, 128, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, 65, 84, + 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, 90, 65, 84, 73, + 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 73, 89, 65, 78, 78, 79, + 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 73, 82, 69, 196, + 80, 65, 68, 77, 193, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 65, 84, 85, + 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 73, 128, 80, 65, + 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 193, 79, 89, 82, + 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, 193, + 79, 88, 69, 73, 65, 201, 79, 88, 69, 73, 193, 79, 86, 69, 82, 82, 73, 68, + 69, 128, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, 89, + 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, + 73, 68, 128, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 69, 210, 79, 86, + 128, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, 128, + 79, 85, 84, 69, 210, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 197, 79, + 84, 85, 128, 79, 84, 84, 65, 86, 193, 79, 84, 72, 65, 76, 65, 206, 79, + 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 82, 84, 72, 79, 71, + 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, + 197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, + 212, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, 73, 71, 73, 78, 128, 79, + 82, 68, 73, 78, 65, 204, 79, 80, 84, 73, 79, 206, 79, 80, 80, 82, 69, 83, + 83, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, + 80, 79, 83, 69, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, + 65, 84, 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, + 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, + 45, 72, 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, + 84, 45, 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, 79, 90, 69, 128, + 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, + 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, 128, 79, 78, 83, 85, + 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, 78, 69, 83, 69, 76, + 70, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 77, 73, 83, 83, 73, 79, + 206, 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, + 77, 69, 71, 65, 128, 79, 77, 65, 76, 79, 78, 128, 79, 77, 128, 79, 76, + 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, 75, 84, + 207, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, 77, 128, 79, 72, + 205, 79, 72, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, 79, 78, 69, 203, + 79, 71, 72, 65, 205, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 210, 79, + 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 79, 76, 211, 79, 66, + 79, 204, 79, 66, 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, + 79, 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, + 83, 128, 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, + 76, 73, 128, 79, 45, 89, 69, 128, 79, 45, 69, 79, 128, 79, 45, 69, 128, + 78, 90, 89, 88, 128, 78, 90, 89, 84, 128, 78, 90, 89, 82, 88, 128, 78, + 90, 89, 82, 128, 78, 90, 89, 80, 128, 78, 90, 89, 128, 78, 90, 85, 88, + 128, 78, 90, 85, 82, 88, 128, 78, 90, 85, 82, 128, 78, 90, 85, 80, 128, + 78, 90, 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 128, 78, 90, + 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, + 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, + 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, 90, + 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, 90, 65, 80, 128, + 78, 90, 65, 128, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, 85, + 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, 85, 79, + 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, + 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, 89, 79, 65, 128, 78, 89, 79, + 128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 211, 78, 89, + 73, 80, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, 78, 89, + 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, 201, 78, + 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, 128, + 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, 65, 128, 78, 87, 69, 128, + 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, 128, 78, 86, 128, 78, 85, + 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, 128, 78, 85, 82, 88, 128, 78, + 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, + 78, 85, 79, 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, + 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, + 69, 82, 65, 84, 79, 210, 78, 85, 77, 66, 69, 82, 128, 78, 85, 76, 76, + 128, 78, 85, 76, 204, 78, 85, 75, 84, 65, 128, 78, 85, 66, 73, 65, 206, + 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, 78, + 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, 88, + 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, 128, + 78, 82, 85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, 82, 79, + 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, 128, 78, + 82, 69, 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, + 128, 78, 82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 88, 128, 78, 79, 87, + 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, 128, 78, + 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, 79, 84, 69, + 72, 69, 65, 196, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, 84, 67, + 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, 83, 69, + 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 200, 78, 79, + 82, 77, 65, 204, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, + 78, 79, 79, 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, + 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, + 78, 199, 78, 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, + 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, + 207, 78, 78, 79, 128, 78, 78, 78, 65, 128, 78, 78, 71, 79, 79, 128, 78, + 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, 73, 128, 78, 78, + 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, 128, 78, 77, 128, 78, + 74, 89, 88, 128, 78, 74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, + 89, 82, 128, 78, 74, 89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, + 78, 74, 85, 82, 88, 128, 78, 74, 85, 82, 128, 78, 74, 85, 80, 128, 78, + 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 128, 78, 74, 79, + 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 128, 78, + 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, + 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, + 73, 69, 128, 78, 74, 73, 128, 78, 74, 69, 128, 78, 74, 128, 78, 73, 88, + 128, 78, 73, 82, 85, 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 69, 84, + 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, + 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 197, 78, 73, 75, 72, 65, 72, + 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, 73, 73, 128, 78, 73, + 71, 72, 84, 128, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, + 128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, + 78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, + 79, 83, 128, 78, 73, 69, 85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, + 85, 78, 45, 80, 65, 78, 83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, + 73, 89, 69, 79, 75, 128, 78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, + 78, 73, 69, 85, 78, 45, 67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 206, 78, + 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66, 128, 78, 73, 65, 128, 78, + 72, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, + 79, 128, 78, 71, 79, 88, 128, 78, 71, 79, 84, 128, 78, 71, 79, 80, 128, + 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, 75, + 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, + 69, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, 78, 71, 69, 80, 128, 78, + 71, 69, 65, 68, 65, 76, 128, 78, 71, 69, 128, 78, 71, 65, 88, 128, 78, + 71, 65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 80, 128, 78, 71, 65, 73, + 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, + 78, 69, 88, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, 69, 84, 128, 78, + 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 80, 84, 85, 78, 69, 128, 78, + 69, 80, 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 65, 78, 79, 128, + 78, 69, 78, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 86, + 197, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, 65, 84, 69, 196, 78, + 69, 69, 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 68, 85, + 88, 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, + 128, 78, 68, 85, 80, 128, 78, 68, 85, 128, 78, 68, 79, 88, 128, 78, 68, + 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 73, 88, 128, 78, 68, 73, 84, + 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, + 78, 68, 73, 128, 78, 68, 69, 88, 128, 78, 68, 69, 80, 128, 78, 68, 69, + 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, + 68, 65, 128, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, + 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, + 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, + 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, + 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, + 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, + 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, + 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, + 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 88, 73, 65, 206, 78, 65, + 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, 68, 73, 218, 78, 65, + 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, + 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 82, 82, 79, 215, 78, 65, 82, + 128, 78, 65, 80, 128, 78, 65, 79, 211, 78, 65, 78, 71, 77, 79, 78, 84, + 72, 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, + 128, 78, 65, 77, 197, 78, 65, 73, 82, 193, 78, 65, 71, 82, 201, 78, 65, + 71, 128, 78, 65, 199, 78, 65, 66, 76, 65, 128, 78, 65, 65, 83, 73, 75, + 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, + 65, 65, 73, 128, 78, 65, 65, 128, 78, 65, 193, 78, 45, 67, 82, 69, 197, + 78, 45, 65, 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, + 73, 84, 69, 128, 77, 89, 80, 128, 77, 89, 65, 128, 77, 89, 128, 77, 87, + 79, 79, 128, 77, 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, + 87, 69, 69, 128, 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, + 77, 87, 128, 77, 215, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, + 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, + 77, 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, + 82, 88, 128, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, + 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, + 85, 79, 128, 77, 85, 78, 65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, + 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, + 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, + 79, 206, 77, 85, 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 77, 65, 80, + 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, + 85, 73, 78, 128, 77, 85, 67, 200, 77, 85, 65, 78, 128, 77, 213, 77, 83, + 128, 77, 80, 65, 128, 77, 79, 88, 128, 77, 79, 86, 69, 196, 77, 79, 85, + 84, 72, 128, 77, 79, 85, 84, 200, 77, 79, 85, 78, 84, 65, 73, 78, 128, + 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 72, 69, 82, + 128, 77, 79, 84, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, + 79, 76, 79, 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, + 80, 128, 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, + 77, 79, 79, 206, 77, 79, 79, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, + 84, 200, 77, 79, 78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 71, 82, + 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, + 79, 78, 73, 65, 83, 128, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, + 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, + 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 65, 128, 77, 207, + 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, + 128, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 83, 82, 65, 128, 77, 73, + 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, + 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, + 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, + 69, 82, 128, 77, 73, 78, 73, 77, 65, 128, 77, 73, 77, 69, 128, 77, 73, + 77, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, 69, 84, 128, + 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 128, 77, 73, 75, 85, + 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, 77, + 73, 73, 78, 128, 77, 73, 73, 128, 77, 73, 199, 77, 73, 69, 88, 128, 77, + 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, + 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, + 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, + 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 77, 73, 69, 85, 77, 45, 67, + 72, 73, 69, 85, 67, 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, + 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 197, + 77, 73, 196, 77, 73, 67, 82, 207, 77, 73, 128, 77, 201, 77, 72, 90, 128, + 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, + 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, + 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, + 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, + 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, + 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 65, 88, 128, + 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, + 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 84, 82, 73, 67, 65, + 204, 77, 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, + 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 71, 128, 77, 69, 84, + 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, 77, + 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, + 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, 73, 128, 77, 69, + 82, 67, 85, 82, 89, 128, 77, 69, 78, 128, 77, 69, 206, 77, 69, 77, 66, + 69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, + 69, 210, 77, 69, 77, 128, 77, 69, 205, 77, 69, 76, 79, 78, 128, 77, 69, + 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 76, 73, + 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, 69, 69, 84, 128, 77, 69, 69, + 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, 128, 77, 69, 68, 73, 85, + 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, 128, + 77, 69, 196, 77, 69, 65, 84, 128, 77, 69, 65, 83, 85, 82, 69, 196, 77, + 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, 68, 85, + 206, 77, 67, 72, 213, 77, 66, 128, 77, 194, 77, 65, 89, 65, 78, 78, 65, + 128, 77, 65, 89, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77, + 65, 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, + 84, 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, + 79, 82, 193, 77, 65, 83, 67, 85, 76, 73, 78, 197, 77, 65, 82, 85, 75, 85, + 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, 199, + 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, + 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, + 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, + 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, + 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 66, 85, 84, 65, 128, + 77, 65, 82, 66, 85, 84, 193, 77, 65, 81, 65, 70, 128, 77, 65, 80, 73, 81, + 128, 77, 65, 78, 83, 89, 79, 78, 128, 77, 65, 78, 78, 65, 218, 77, 65, + 78, 78, 65, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 67, 72, + 213, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 128, 77, 65, 76, 197, + 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 73, + 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, + 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, 73, 77, 65, 76, + 65, 73, 128, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, + 128, 77, 65, 201, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 65, 75, + 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 68, 68, 65, + 200, 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, + 206, 77, 65, 65, 73, 128, 77, 65, 65, 128, 76, 218, 76, 89, 89, 128, 76, + 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, + 89, 80, 128, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, + 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, + 87, 65, 128, 76, 85, 88, 128, 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, + 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, + 128, 76, 85, 79, 128, 76, 85, 78, 65, 84, 197, 76, 85, 73, 83, 128, 76, + 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, + 128, 76, 79, 87, 45, 185, 76, 79, 85, 82, 69, 128, 76, 79, 84, 85, 83, + 128, 76, 79, 84, 128, 76, 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 80, + 128, 76, 79, 79, 84, 128, 76, 79, 79, 80, 128, 76, 79, 79, 128, 76, 79, + 78, 71, 65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, + 67, 72, 45, 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, + 83, 79, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, + 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, + 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, + 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 78, 71, 128, 76, + 79, 76, 76, 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, + 79, 71, 128, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, + 79, 206, 76, 79, 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, 128, + 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, + 88, 128, 76, 73, 87, 78, 128, 76, 73, 84, 84, 76, 197, 76, 73, 84, 82, + 193, 76, 73, 84, 128, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, + 80, 128, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, 73, 78, 71, + 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 45, 57, 128, 76, 73, 78, + 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49, + 128, 76, 73, 77, 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, + 128, 76, 73, 77, 73, 84, 128, 76, 73, 73, 128, 76, 73, 71, 72, 84, 78, + 73, 78, 71, 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, 69, 128, 76, 73, + 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, 73, 69, 128, + 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 65, 66, 73, 76, 73, 84, + 217, 76, 72, 79, 79, 128, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, 89, + 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, 76, + 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69, 204, 76, 69, 84, 84, + 69, 82, 128, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, + 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 83, 211, 76, 69, 80, + 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, + 78, 71, 84, 200, 76, 69, 77, 79, 73, 128, 76, 69, 203, 76, 69, 73, 77, + 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, + 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, + 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, + 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, + 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, + 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 75, + 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, + 68, 69, 82, 128, 76, 68, 65, 78, 128, 76, 67, 201, 76, 67, 197, 76, 65, + 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 215, + 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 84, 73, 78, 65, + 84, 197, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 128, 76, 65, 83, 212, + 76, 65, 83, 128, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, 71, 69, + 210, 76, 65, 82, 71, 197, 76, 65, 80, 128, 76, 65, 78, 71, 85, 65, 71, + 197, 76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, + 76, 65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, 66, 68, 193, 76, + 65, 77, 65, 68, 72, 128, 76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, + 76, 65, 71, 85, 83, 128, 76, 65, 71, 213, 76, 65, 69, 86, 128, 76, 65, + 69, 128, 76, 65, 67, 75, 128, 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, + 76, 65, 66, 79, 82, 128, 76, 65, 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, + 206, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, 76, 65, 65, 73, 128, + 76, 65, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, + 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, + 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 69, 128, 75, + 89, 69, 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, + 65, 128, 75, 88, 87, 73, 128, 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, + 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, + 88, 79, 128, 75, 88, 73, 128, 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, + 88, 65, 65, 128, 75, 88, 65, 128, 75, 87, 79, 79, 128, 75, 87, 79, 128, + 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75, 87, 69, + 128, 75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, + 75, 85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, + 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, 84, + 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, 128, 75, 85, 80, 128, + 75, 85, 79, 88, 128, 75, 85, 79, 80, 128, 75, 85, 79, 128, 75, 85, 78, + 68, 68, 65, 76, 73, 89, 65, 128, 75, 213, 75, 84, 128, 75, 83, 83, 65, + 128, 75, 83, 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, + 84, 73, 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, + 77, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, + 84, 65, 128, 75, 82, 65, 84, 73, 77, 193, 75, 82, 65, 128, 75, 80, 65, + 128, 75, 79, 88, 128, 75, 79, 84, 79, 128, 75, 79, 84, 128, 75, 79, 82, + 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, 75, 79, 82, 69, 65, + 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 80, 80, 65, 128, 75, 79, 80, + 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, + 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, 77, + 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, 66, + 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 72, 128, 75, 79, 69, 84, 128, + 75, 79, 65, 128, 75, 207, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 70, + 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, + 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, + 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, 75, 69, 69, + 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, 69, 128, 75, + 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, + 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, + 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 82, 79, 87, 65, 84, 84, + 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, + 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, + 218, 75, 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, + 73, 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, + 75, 73, 69, 128, 75, 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, + 73, 128, 75, 72, 85, 65, 84, 128, 75, 72, 79, 78, 128, 75, 72, 79, 77, + 85, 84, 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, 73, 69, 85, 75, 200, + 75, 72, 73, 128, 75, 72, 72, 65, 128, 75, 72, 69, 73, 128, 75, 72, 69, + 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, + 75, 72, 65, 78, 199, 75, 72, 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, + 72, 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, + 128, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, 65, 80, 128, 75, + 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, 128, 75, 69, 217, 75, 69, + 88, 128, 75, 69, 84, 84, 201, 75, 69, 80, 128, 75, 69, 78, 84, 73, 77, + 65, 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, + 77, 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, 75, 69, 77, 80, 72, + 82, 69, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, + 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, + 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, 67, 65, 76, 128, + 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, + 75, 65, 88, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 84, + 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 65, 86, 65, 83, + 77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, + 72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 84, 128, 75, 65, 83, 82, 65, 84, + 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, 65, 128, + 75, 65, 83, 82, 193, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 65, 84, + 84, 79, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, + 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, + 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, + 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, + 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, + 80, 65, 128, 75, 65, 80, 128, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, + 65, 75, 79, 128, 75, 65, 75, 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, + 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 72, 128, + 75, 65, 70, 128, 75, 65, 198, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, + 128, 75, 65, 65, 70, 128, 75, 65, 65, 128, 74, 87, 65, 128, 74, 85, 84, + 128, 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, + 80, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, 85, 69, 85, 73, + 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, + 83, 200, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 212, 74, 79, + 73, 78, 69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, + 88, 128, 74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, + 74, 85, 88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, + 85, 82, 128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, + 79, 80, 128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, + 74, 74, 79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, + 88, 128, 74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, + 128, 74, 74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, + 128, 74, 74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, + 128, 74, 73, 76, 128, 74, 73, 65, 128, 74, 72, 79, 128, 74, 72, 69, 72, + 128, 74, 72, 65, 78, 128, 74, 72, 65, 128, 74, 69, 82, 85, 83, 65, 76, + 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 128, 74, 69, 72, 128, 74, + 69, 200, 74, 69, 69, 77, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, + 86, 73, 89, 65, 78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, + 197, 74, 65, 78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, + 76, 79, 85, 72, 79, 85, 128, 74, 65, 68, 69, 128, 74, 65, 65, 128, 74, + 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 202, 73, 90, 72, 73, 84, 83, + 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, 73, 89, 65, + 78, 78, 65, 128, 73, 89, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, + 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, + 128, 73, 83, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 65, 75, + 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, + 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, 65, 128, 73, 79, 84, 73, 70, 73, + 69, 196, 73, 79, 84, 65, 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, + 193, 73, 79, 82, 128, 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, + 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, + 83, 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, + 73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, + 69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, + 73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, + 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, + 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, + 82, 73, 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, + 65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, + 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, + 76, 128, 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, + 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, + 128, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, 128, + 73, 78, 78, 79, 67, 69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, + 69, 82, 128, 73, 78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, + 85, 128, 73, 78, 73, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, + 82, 69, 78, 212, 73, 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, + 84, 73, 79, 206, 73, 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, + 78, 73, 84, 89, 128, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, + 84, 82, 73, 65, 204, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, + 65, 84, 79, 82, 128, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, + 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, + 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, + 77, 80, 76, 69, 84, 197, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, 78, 67, + 72, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, + 70, 69, 67, 84, 65, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, + 73, 83, 69, 79, 211, 73, 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, + 73, 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, + 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, + 89, 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, + 78, 65, 128, 73, 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, 71, 71, + 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, + 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, + 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, + 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, + 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, + 128, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, + 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, + 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 73, 69, 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, + 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, + 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, + 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, + 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, + 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, + 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, + 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, + 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, + 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, + 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 72, + 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, + 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, + 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, + 128, 73, 65, 78, 128, 73, 45, 89, 65, 128, 73, 45, 79, 128, 73, 45, 69, + 85, 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, + 73, 45, 65, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, 72, 90, 90, + 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, 72, 90, 71, + 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, 68, 73, 65, + 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, 79, 206, 72, + 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, 72, 69, 78, + 128, 72, 89, 80, 72, 69, 206, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, + 84, 128, 72, 88, 85, 79, 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, + 128, 72, 88, 79, 84, 128, 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, + 73, 88, 128, 72, 88, 73, 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, + 88, 128, 72, 88, 73, 69, 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, + 69, 128, 72, 88, 73, 128, 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, + 88, 69, 128, 72, 88, 65, 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, + 128, 72, 88, 65, 128, 72, 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 86, + 128, 72, 85, 82, 65, 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, + 69, 68, 128, 72, 85, 78, 68, 82, 69, 196, 72, 85, 77, 65, 78, 128, 72, + 85, 77, 65, 206, 72, 85, 73, 73, 84, 79, 128, 72, 85, 65, 82, 65, 68, 68, + 79, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, + 128, 72, 80, 128, 72, 79, 85, 83, 69, 128, 72, 79, 85, 82, 71, 76, 65, + 83, 83, 128, 72, 79, 85, 210, 72, 79, 84, 65, 128, 72, 79, 212, 72, 79, + 82, 83, 69, 128, 72, 79, 82, 206, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 128, 72, 79, 82, 73, + 128, 72, 79, 79, 82, 85, 128, 72, 79, 79, 78, 128, 72, 79, 79, 203, 72, + 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, 84, 72, 69, 84, + 73, 195, 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, 79, + 69, 128, 72, 78, 85, 84, 128, 72, 78, 85, 79, 88, 128, 72, 78, 85, 79, + 128, 72, 78, 79, 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, + 78, 73, 88, 128, 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, + 69, 88, 128, 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, + 73, 69, 128, 72, 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, + 72, 78, 69, 128, 72, 78, 65, 88, 128, 72, 78, 65, 84, 128, 72, 78, 65, + 80, 128, 72, 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, 128, + 72, 77, 89, 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, 85, + 88, 128, 72, 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, 82, + 128, 72, 77, 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, 80, + 128, 72, 77, 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, 77, + 79, 84, 128, 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, 128, + 72, 77, 73, 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, 72, + 77, 73, 69, 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, 65, + 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, + 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, + 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, + 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, + 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, + 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, + 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, + 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, + 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, + 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, + 80, 128, 72, 76, 65, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 82, + 73, 81, 128, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, + 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, + 73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, + 73, 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, + 73, 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, + 69, 84, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, 79, 128, 72, + 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, 128, + 72, 71, 128, 72, 69, 84, 72, 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, + 82, 85, 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, + 78, 73, 65, 206, 72, 69, 82, 77, 69, 83, 128, 72, 69, 82, 65, 69, 85, + 205, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, + 72, 69, 76, 205, 72, 69, 75, 85, 84, 65, 65, 82, 85, 128, 72, 69, 73, 83, + 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, 76, 217, + 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, 65, 82, 84, + 128, 72, 69, 65, 82, 212, 72, 69, 65, 68, 73, 78, 71, 128, 72, 66, 65, + 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, 72, 65, 89, 65, 78, + 78, 65, 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, + 69, 128, 72, 65, 84, 69, 128, 72, 65, 84, 65, 198, 72, 65, 83, 65, 78, + 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 77, 79, 78, 73, + 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, 83, + 128, 72, 65, 82, 196, 72, 65, 78, 85, 78, 79, 207, 72, 65, 78, 71, 90, + 72, 79, 213, 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 128, 72, 65, 78, + 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 77, 69, + 210, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, + 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 128, 72, + 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, + 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 69, 128, + 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 45, 84, 89, 80, 197, 71, 89, + 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, 89, 73, 128, 71, 89, + 70, 213, 71, 89, 69, 69, 128, 71, 89, 69, 128, 71, 89, 65, 83, 128, 71, + 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 73, 128, 71, 87, + 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, 71, 87, 65, 128, 71, + 86, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 199, 71, 85, + 69, 72, 128, 71, 85, 69, 200, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, + 128, 71, 85, 65, 82, 65, 78, 201, 71, 84, 69, 210, 71, 83, 85, 77, 128, + 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, + 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 69, 71, 79, 82, 73, 65, + 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, + 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, + 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 197, + 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, + 197, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 67, + 69, 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 84, 72, 73, 195, + 71, 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, + 71, 79, 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, + 84, 79, 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, + 79, 76, 68, 128, 71, 79, 73, 78, 199, 71, 79, 65, 76, 128, 71, 79, 65, + 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, 73, 89, + 65, 78, 73, 128, 71, 76, 79, 84, 84, 65, 204, 71, 76, 73, 83, 83, 65, 78, + 68, 207, 71, 76, 69, 73, 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, + 74, 69, 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 82, 85, 68, 65, + 65, 128, 71, 73, 80, 128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, + 128, 71, 73, 77, 69, 204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, + 69, 84, 128, 71, 73, 66, 65, 128, 71, 72, 90, 128, 71, 72, 85, 78, 78, + 65, 128, 71, 72, 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 83, 84, + 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72, 69, + 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 78, 128, 71, 72, 65, + 77, 65, 76, 128, 71, 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128, + 71, 72, 65, 73, 206, 71, 72, 65, 68, 128, 71, 72, 65, 128, 71, 71, 87, + 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, 128, 71, 71, 87, 65, + 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, 71, 71, 85, 84, 128, + 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, 71, 85, 80, 128, 71, + 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, + 71, 71, 85, 79, 128, 71, 71, 85, 128, 71, 71, 79, 88, 128, 71, 71, 79, + 84, 128, 71, 71, 79, 80, 128, 71, 71, 79, 128, 71, 71, 73, 88, 128, 71, + 71, 73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, 73, 69, 80, 128, 71, + 71, 73, 69, 128, 71, 71, 73, 128, 71, 71, 69, 88, 128, 71, 71, 69, 84, + 128, 71, 71, 69, 80, 128, 71, 71, 69, 69, 128, 71, 71, 69, 128, 71, 71, + 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 80, 128, 71, 71, 65, 65, + 128, 71, 71, 65, 128, 71, 69, 84, 193, 71, 69, 82, 83, 72, 65, 89, 73, + 77, 128, 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, + 82, 69, 83, 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, + 69, 79, 77, 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, + 84, 73, 86, 69, 128, 71, 69, 78, 73, 75, 201, 71, 69, 78, 69, 82, 73, + 195, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, 65, 84, 73, 79, + 206, 71, 69, 68, 79, 76, 65, 128, 71, 69, 66, 207, 71, 69, 65, 82, 128, + 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, 67, 65, 206, 71, 66, 128, + 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65, 128, 71, 65, 89, 65, 78, 78, + 65, 128, 71, 65, 89, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, + 65, 84, 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 82, 83, 72, + 85, 78, 73, 128, 71, 65, 82, 79, 78, 128, 71, 65, 82, 77, 69, 78, 84, + 128, 71, 65, 82, 128, 71, 65, 80, 80, 69, 196, 71, 65, 78, 77, 65, 128, + 71, 65, 78, 71, 73, 65, 128, 71, 65, 78, 128, 71, 65, 77, 77, 65, 128, + 71, 65, 77, 76, 65, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, + 71, 65, 76, 128, 71, 65, 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, + 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, + 65, 65, 70, 85, 128, 70, 89, 88, 128, 70, 89, 84, 128, 70, 89, 80, 128, + 70, 89, 65, 128, 70, 89, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, 70, + 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 85, 88, 128, 70, + 85, 84, 128, 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, + 70, 85, 82, 128, 70, 85, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, + 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, + 76, 204, 70, 84, 72, 79, 82, 193, 70, 82, 79, 87, 78, 73, 78, 199, 70, + 82, 79, 87, 78, 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, 69, 196, 70, + 82, 79, 205, 70, 82, 79, 71, 128, 70, 82, 73, 84, 85, 128, 70, 82, 73, + 67, 65, 84, 73, 86, 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, + 82, 69, 78, 67, 200, 70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, 65, + 77, 69, 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, + 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, 79, + 85, 82, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, + 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, + 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 83, + 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128, 70, 79, 82, 84, + 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, 79, 82, 77, 65, + 84, 84, 73, 78, 71, 128, 70, 79, 82, 205, 70, 79, 82, 75, 69, 196, 70, + 79, 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, + 79, 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, + 79, 79, 84, 128, 70, 79, 79, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, + 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, + 128, 70, 77, 128, 70, 76, 89, 128, 70, 76, 85, 84, 69, 128, 70, 76, 79, + 87, 69, 82, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 82, 69, 84, 84, 69, + 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 79, 82, 128, 70, 76, 73, 80, + 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 69, 88, 85, 83, 128, 70, 76, + 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, + 69, 196, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, 71, 45, 53, + 128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, + 65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, + 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, + 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, 73, 86, 197, 70, 73, 84, 65, + 128, 70, 73, 84, 128, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, + 72, 72, 79, 79, 203, 70, 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, + 128, 70, 73, 83, 200, 70, 73, 82, 83, 212, 70, 73, 82, 69, 128, 70, 73, + 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, + 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 65, 78, 67, 73, 65, + 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69, 196, 70, 73, + 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73, 128, 70, 73, + 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, + 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, + 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, + 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, + 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, 128, 70, 72, 84, 79, 82, + 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, 69, 83, 84, 73, 86, 65, 76, + 128, 70, 69, 82, 77, 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, + 69, 79, 200, 70, 69, 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, + 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, + 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, + 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 68, 128, 70, 69, 69, 196, + 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, 84, 72, + 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, 128, 70, + 65, 89, 65, 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 84, 72, 69, 82, + 128, 70, 65, 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, + 206, 70, 65, 84, 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, + 65, 82, 83, 201, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, 69, + 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, 70, + 65, 76, 76, 73, 78, 199, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, + 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, + 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, 128, + 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, + 45, 51, 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, + 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 65, 65, 128, 69, 90, + 200, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, + 128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, + 71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, + 69, 196, 69, 88, 79, 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, 69, + 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, 88, + 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 69, 83, 83, 128, 69, 88, + 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 78, 73, 78, + 71, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, + 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, 85, 45, 69, 85, 128, + 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, + 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 83, 85, 75, 85, 85, 68, 79, + 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, + 69, 196, 69, 83, 67, 65, 80, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, + 82, 69, 196, 69, 82, 82, 128, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, + 81, 85, 73, 86, 65, 76, 69, 78, 212, 69, 81, 85, 73, 68, 128, 69, 81, 85, + 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, + 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, + 69, 80, 83, 73, 76, 79, 206, 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, + 80, 69, 71, 69, 82, 77, 65, 128, 69, 79, 76, 72, 88, 128, 69, 79, 72, + 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 84, 72, 85, 83, 73, 65, + 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, 69, + 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, 78, + 81, 85, 73, 82, 89, 128, 69, 78, 79, 211, 69, 78, 78, 128, 69, 78, 76, + 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, + 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, + 69, 78, 196, 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, + 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 65, + 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77, 80, 84, + 217, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, + 89, 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, + 66, 69, 68, 68, 73, 78, 71, 128, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, + 76, 73, 70, 73, 128, 69, 76, 69, 86, 69, 78, 128, 69, 76, 69, 86, 69, + 206, 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 195, 69, + 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, 78, 128, + 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, 128, 69, 74, + 69, 67, 212, 69, 73, 83, 128, 69, 73, 71, 72, 84, 89, 128, 69, 73, 71, + 72, 84, 217, 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, + 211, 69, 73, 71, 72, 84, 72, 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, + 69, 73, 71, 72, 84, 69, 69, 206, 69, 73, 69, 128, 69, 72, 87, 65, 218, + 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, 65, 128, 69, 69, 75, 65, 65, + 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128, 69, 68, 73, 84, 79, 82, 73, + 65, 204, 69, 67, 200, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 212, + 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, 69, 65, 82, 84, + 200, 69, 65, 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 68, 72, 65, + 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 68, 90, 85, 128, 68, 90, + 79, 128, 68, 90, 74, 69, 128, 68, 90, 73, 128, 68, 90, 72, 69, 128, 68, + 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, 69, 128, 68, 90, + 69, 128, 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, + 207, 68, 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, 87, 69, + 128, 68, 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, 86, 128, + 68, 85, 84, 73, 69, 83, 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, + 79, 88, 128, 68, 85, 79, 128, 68, 85, 76, 128, 68, 85, 204, 68, 82, 89, + 128, 68, 82, 217, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, + 83, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 73, + 86, 69, 128, 68, 82, 73, 204, 68, 82, 65, 71, 79, 78, 128, 68, 82, 65, + 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67, + 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82, + 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 68, 79, 87, 78, 45, 80, + 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, 78, 128, 68, 79, 85, 66, 84, + 128, 68, 79, 85, 66, 76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, + 197, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, + 69, 128, 68, 79, 84, 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, + 78, 128, 68, 79, 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, + 128, 68, 79, 84, 84, 69, 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, + 83, 45, 55, 56, 128, 68, 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, + 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, + 128, 68, 79, 84, 83, 45, 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, + 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, + 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, + 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, + 52, 55, 56, 128, 68, 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, + 54, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, + 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, + 53, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, + 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, + 51, 55, 56, 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, 84, 83, 45, 51, + 54, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, + 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, + 53, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 128, 68, 79, + 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, + 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, + 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, + 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, + 52, 53, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, + 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, + 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, + 45, 51, 128, 68, 79, 84, 83, 45, 50, 56, 128, 68, 79, 84, 83, 45, 50, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, + 128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54, + 55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 53, 56, + 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, + 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, + 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, + 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, + 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, 84, + 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, + 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, + 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79, + 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, + 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, + 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, + 51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, + 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, + 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128, + 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, + 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, + 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, + 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, + 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, + 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, + 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, + 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, + 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45, 50, 128, 68, 79, 84, 83, 45, + 49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49, + 54, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 53, 128, 68, 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84, + 83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, + 84, 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, + 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, + 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, + 83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, + 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45, + 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, + 45, 49, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 128, + 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, + 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, + 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, + 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, + 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, 68, 79, 84, + 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, + 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, + 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, + 79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 128, 68, 79, + 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68, + 79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, + 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 128, 68, 79, 84, + 83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, + 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, + 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, + 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 76, + 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79, 82, 128, 68, 79, 78, 128, + 68, 79, 77, 65, 73, 206, 68, 79, 76, 76, 65, 210, 68, 79, 73, 84, 128, + 68, 79, 71, 128, 68, 79, 69, 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, + 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, + 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, 77, + 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, + 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 210, 68, 74, 69, + 82, 86, 73, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 73, 86, 79, 82, + 67, 197, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, + 79, 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, + 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, 73, + 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, + 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, + 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, + 68, 73, 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, + 78, 84, 73, 78, 85, 79, 85, 211, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, + 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, + 80, 69, 82, 128, 68, 73, 80, 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, + 128, 68, 73, 80, 76, 201, 68, 73, 78, 71, 66, 65, 212, 68, 73, 77, 77, + 73, 78, 71, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, + 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, + 84, 73, 79, 78, 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, + 84, 128, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, 77, 69, 78, + 83, 73, 79, 206, 68, 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, + 200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, + 193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, + 73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, + 193, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, + 128, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, + 76, 84, 73, 69, 83, 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, + 128, 68, 73, 70, 70, 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, + 68, 73, 69, 83, 73, 83, 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, + 128, 68, 73, 197, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, + 78, 73, 75, 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, + 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, 73, 65, 77, 69, 84, 69, 210, + 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, 73, 65, 76, 89, 84, 73, 75, + 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 73, 65, 71, 79, 78, 65, 76, + 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, 65, 69, 82, 69, 83, 73, 90, + 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 211, 68, 72, 79, 128, 68, 72, + 65, 82, 77, 65, 128, 68, 72, 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, + 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200, 68, + 69, 89, 84, 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, 88, + 73, 65, 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, 69, + 78, 84, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, 79, + 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, 68, + 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, 82, + 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, 82, + 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, 217, 68, 69, 78, 84, 65, + 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, 68, 69, 78, 79, 77, + 73, 78, 65, 84, 79, 210, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, + 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, + 128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, + 69, 210, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, 197, 68, 69, + 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, 73, 128, 68, + 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, + 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, + 69, 76, 128, 68, 69, 69, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, + 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 67, 73, 83, 73, 86, 69, + 78, 69, 83, 83, 128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, 69, 77, 66, + 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, 68, + 69, 65, 84, 72, 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, 68, + 85, 88, 128, 68, 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, 85, + 82, 128, 68, 68, 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, 79, + 80, 128, 68, 68, 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, 68, + 68, 79, 84, 128, 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, 73, + 88, 128, 68, 68, 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, 88, + 128, 68, 68, 73, 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, 68, + 68, 72, 79, 128, 68, 68, 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, + 80, 128, 68, 68, 69, 69, 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, + 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, 65, 84, + 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, 68, 68, + 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, 128, 68, + 194, 68, 65, 217, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 65, 86, 73, + 68, 128, 68, 65, 84, 197, 68, 65, 83, 73, 65, 128, 68, 65, 83, 72, 69, + 196, 68, 65, 83, 72, 128, 68, 65, 83, 200, 68, 65, 83, 69, 73, 65, 128, + 68, 65, 82, 84, 128, 68, 65, 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82, + 75, 69, 78, 73, 78, 199, 68, 65, 82, 203, 68, 65, 82, 71, 65, 128, 68, + 65, 80, 45, 80, 82, 65, 205, 68, 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, + 77, 85, 79, 217, 68, 65, 80, 45, 66, 85, 79, 206, 68, 65, 80, 45, 66, 69, + 201, 68, 65, 208, 68, 65, 78, 84, 65, 74, 193, 68, 65, 78, 68, 65, 128, + 68, 65, 77, 80, 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, + 128, 68, 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, + 77, 77, 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 128, 68, + 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, 76, 65, 84, 72, 128, + 68, 65, 76, 65, 84, 200, 68, 65, 73, 82, 128, 68, 65, 72, 89, 65, 65, 85, + 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, + 83, 128, 68, 65, 71, 71, 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, + 65, 71, 69, 83, 200, 68, 65, 71, 65, 218, 68, 65, 71, 65, 76, 71, 65, + 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, + 128, 68, 65, 65, 68, 72, 85, 128, 67, 89, 88, 128, 67, 89, 84, 128, 67, + 89, 82, 88, 128, 67, 89, 82, 69, 78, 65, 73, 195, 67, 89, 82, 128, 67, + 89, 80, 69, 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, + 73, 67, 73, 84, 89, 128, 67, 89, 65, 128, 67, 89, 128, 67, 87, 79, 79, + 128, 67, 87, 79, 128, 67, 87, 73, 73, 128, 67, 87, 73, 128, 67, 87, 69, + 79, 82, 84, 72, 128, 67, 87, 69, 128, 67, 87, 65, 65, 128, 67, 85, 88, + 128, 67, 85, 84, 128, 67, 85, 212, 67, 85, 83, 84, 79, 77, 69, 210, 67, + 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82, 86, 69, 196, + 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 82, 69, 78, + 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, + 80, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, + 85, 205, 67, 85, 66, 69, 68, 128, 67, 85, 66, 197, 67, 85, 128, 67, 82, + 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67, 82, 85, 90, 69, 73, 82, + 207, 67, 82, 79, 83, 83, 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, + 200, 67, 82, 79, 83, 83, 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, + 83, 69, 196, 67, 82, 79, 83, 83, 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, + 83, 128, 67, 82, 79, 83, 211, 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, + 128, 67, 82, 69, 83, 67, 69, 78, 84, 128, 67, 82, 69, 83, 67, 69, 78, + 212, 67, 82, 69, 68, 73, 212, 67, 82, 69, 65, 84, 73, 86, 197, 67, 79, + 88, 128, 67, 79, 87, 128, 67, 79, 86, 69, 82, 128, 67, 79, 85, 78, 84, + 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, 66, 79, 82, 69, + 128, 67, 79, 84, 128, 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, + 79, 82, 82, 69, 67, 84, 128, 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, + 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, + 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, + 210, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, + 72, 212, 67, 79, 80, 89, 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, + 67, 79, 80, 128, 67, 79, 79, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, + 78, 84, 82, 65, 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, + 73, 79, 78, 128, 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, + 85, 210, 67, 79, 78, 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, + 77, 80, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, + 79, 78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, + 78, 84, 65, 67, 84, 128, 67, 79, 78, 83, 84, 65, 78, 84, 128, 67, 79, 78, + 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 78, + 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79, + 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 73, 67, 65, + 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 71, 82, 65, 84, 85, + 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, + 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, + 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, + 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, 76, + 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, + 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, + 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, 67, + 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 128, 67, 79, 77, + 77, 193, 67, 79, 77, 73, 78, 199, 67, 79, 77, 69, 84, 128, 67, 79, 76, + 79, 82, 128, 67, 79, 76, 76, 128, 67, 79, 70, 70, 73, 78, 128, 67, 79, + 69, 78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 65, 128, 67, 79, 128, 67, + 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 45, 83, + 80, 79, 75, 69, 196, 67, 76, 85, 194, 67, 76, 79, 85, 68, 128, 67, 76, + 79, 84, 72, 69, 83, 128, 67, 76, 79, 84, 72, 128, 67, 76, 79, 83, 69, 78, + 69, 83, 83, 128, 67, 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 69, 196, + 67, 76, 79, 83, 197, 67, 76, 79, 67, 75, 87, 73, 83, 197, 67, 76, 73, 86, + 73, 83, 128, 67, 76, 73, 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, + 83, 128, 67, 76, 73, 70, 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, + 70, 45, 50, 128, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, + 76, 69, 198, 67, 76, 69, 65, 210, 67, 76, 65, 87, 128, 67, 76, 65, 78, + 128, 67, 73, 88, 128, 67, 73, 86, 73, 76, 73, 65, 78, 128, 67, 73, 84, + 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, 128, 67, 73, 82, 67, 85, 76, + 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 128, 67, 73, 80, 128, 67, + 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, + 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, + 67, 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, + 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, + 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128, + 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67, + 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67, + 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 79, 78, 79, 85, 128, + 67, 72, 82, 79, 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, + 193, 67, 72, 82, 73, 86, 73, 128, 67, 72, 79, 88, 128, 67, 72, 79, 84, + 128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, + 75, 69, 128, 67, 72, 79, 69, 128, 67, 72, 79, 65, 128, 67, 72, 79, 128, + 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, + 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, + 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, + 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, + 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 69, 84, 128, + 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, 83, 197, 67, 72, 73, 78, + 128, 67, 72, 73, 76, 68, 128, 67, 72, 73, 69, 85, 67, 72, 45, 75, 72, 73, + 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, 72, 73, 69, 85, 72, + 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 128, 67, 72, 201, 67, 72, + 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, 72, 69, 84, 128, 67, 72, + 69, 83, 211, 67, 72, 69, 80, 128, 67, 72, 69, 206, 67, 72, 69, 69, 128, + 67, 72, 69, 67, 75, 128, 67, 72, 69, 67, 203, 67, 72, 69, 128, 67, 72, + 197, 67, 72, 65, 88, 128, 67, 72, 65, 86, 73, 89, 65, 78, 73, 128, 67, + 72, 65, 84, 84, 65, 87, 65, 128, 67, 72, 65, 84, 128, 67, 72, 65, 82, 73, + 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, 71, + 69, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, 77, + 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, 76, + 73, 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, + 196, 67, 72, 65, 65, 128, 67, 69, 88, 128, 67, 69, 80, 128, 67, 69, 79, + 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, + 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, + 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 73, 79, + 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 73, 69, 85, 67, + 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 67, 72, 73, 69, 85, 67, + 72, 128, 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, + 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, + 128, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 73, 82, 84, 128, 67, 69, + 73, 76, 73, 78, 71, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, + 128, 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 65, 76, 67, + 128, 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, + 128, 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 69, 69, 128, + 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128, 67, + 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, + 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, + 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, + 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65, 128, 67, + 65, 84, 128, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 128, + 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, + 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, + 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79, 128, 67, 65, 80, 73, + 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, + 78, 199, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, + 82, 193, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, 67, 69, 76, 76, 65, 84, + 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, 78, 67, 69, 204, 67, + 65, 78, 128, 67, 65, 77, 78, 85, 195, 67, 65, 76, 76, 128, 67, 65, 76, + 67, 128, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, + 128, 67, 65, 68, 193, 67, 65, 65, 73, 128, 67, 45, 83, 73, 77, 80, 76, + 73, 70, 73, 69, 196, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, 69, + 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, 65, + 206, 66, 217, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, 66, + 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, 85, + 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 79, 88, 128, 66, 85, + 79, 80, 128, 66, 85, 79, 128, 66, 85, 77, 80, 217, 66, 85, 76, 76, 83, + 69, 89, 69, 128, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, + 66, 85, 76, 76, 128, 66, 85, 75, 89, 128, 66, 85, 72, 73, 196, 66, 85, + 71, 73, 78, 69, 83, 197, 66, 85, 67, 75, 76, 69, 128, 66, 83, 84, 65, 82, + 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, 66, 83, 68, 85, 211, 66, + 82, 85, 83, 72, 128, 66, 82, 85, 83, 200, 66, 82, 79, 78, 90, 69, 128, + 66, 82, 79, 75, 69, 206, 66, 82, 73, 83, 84, 76, 69, 128, 66, 82, 73, 68, + 71, 197, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 128, 66, 82, + 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, 82, 69, 65, 75, 84, 72, 82, 79, + 85, 71, 72, 128, 66, 82, 65, 78, 67, 72, 73, 78, 199, 66, 82, 65, 78, 67, + 72, 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, + 82, 65, 67, 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 79, + 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 128, 66, 79, + 215, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 76, 73, + 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, 66, 79, 84, 84, 79, + 205, 66, 79, 82, 85, 84, 79, 128, 66, 79, 78, 69, 128, 66, 79, 76, 212, + 66, 79, 68, 89, 128, 66, 79, 65, 84, 128, 66, 79, 65, 82, 128, 66, 79, + 65, 128, 66, 76, 85, 69, 128, 66, 76, 79, 79, 68, 128, 66, 76, 79, 67, + 75, 128, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, + 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, + 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, + 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, + 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, + 73, 83, 72, 79, 80, 128, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 82, + 85, 128, 66, 73, 82, 71, 65, 128, 66, 73, 82, 68, 128, 66, 73, 79, 72, + 65, 90, 65, 82, 196, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, + 128, 66, 73, 78, 65, 82, 217, 66, 73, 76, 65, 66, 73, 65, 204, 66, 73, + 71, 128, 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, + 204, 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 72, + 79, 128, 66, 72, 69, 84, 72, 128, 66, 72, 65, 128, 66, 69, 89, 89, 65, + 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, 66, 69, + 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, 72, + 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 84, 128, 66, 69, 212, + 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, + 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, + 197, 66, 69, 78, 68, 128, 66, 69, 78, 128, 66, 69, 206, 66, 69, 76, 84, + 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, 76, 76, 128, 66, 69, + 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, 69, 73, 84, 72, 128, 66, + 69, 72, 69, 72, 128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, + 66, 69, 71, 73, 78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 206, 66, 69, 70, + 79, 82, 197, 66, 69, 69, 84, 65, 128, 66, 69, 69, 72, 128, 66, 69, 69, + 200, 66, 69, 69, 128, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 65, 84, + 128, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, 65, 68, 128, + 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, 66, 66, 89, + 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, 84, 128, 66, + 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, 128, 66, 66, + 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 128, 66, 66, + 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, 79, 80, 128, + 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 84, 128, 66, 66, 73, + 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, + 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, + 66, 66, 69, 80, 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, 66, 66, 65, + 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 128, 66, 65, 89, 65, 78, 78, + 65, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, 65, 83, + 65, 84, 128, 66, 65, 83, 83, 65, 128, 66, 65, 83, 72, 75, 73, 210, 66, + 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 82, + 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, + 128, 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, + 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79, 79, 83, 65, 78, 128, 66, 65, + 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 203, 66, 65, 77, 66, 79, + 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 79, 212, 66, 65, + 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 73, 82, 75, 65, + 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 71, + 65, 128, 66, 65, 199, 66, 65, 68, 71, 69, 82, 128, 66, 65, 67, 75, 83, + 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, + 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, + 65, 67, 75, 128, 66, 65, 65, 82, 69, 82, 85, 128, 66, 65, 65, 128, 66, + 51, 48, 53, 128, 66, 50, 53, 57, 128, 66, 50, 53, 56, 128, 66, 50, 53, + 55, 128, 66, 50, 53, 54, 128, 66, 50, 53, 53, 128, 66, 50, 53, 180, 66, + 50, 53, 51, 128, 66, 50, 53, 50, 128, 66, 50, 53, 49, 128, 66, 50, 53, + 48, 128, 66, 50, 52, 57, 128, 66, 50, 52, 56, 128, 66, 50, 52, 183, 66, + 50, 52, 54, 128, 66, 50, 52, 53, 128, 66, 50, 52, 179, 66, 50, 52, 178, + 66, 50, 52, 177, 66, 50, 52, 176, 66, 50, 51, 54, 128, 66, 50, 51, 52, + 128, 66, 50, 51, 179, 66, 50, 51, 50, 128, 66, 50, 51, 177, 66, 50, 51, + 176, 66, 50, 50, 57, 128, 66, 50, 50, 56, 128, 66, 50, 50, 55, 128, 66, + 50, 50, 54, 128, 66, 50, 50, 181, 66, 50, 50, 50, 128, 66, 50, 50, 49, + 128, 66, 50, 50, 176, 66, 50, 49, 57, 128, 66, 50, 49, 56, 128, 66, 50, + 49, 55, 128, 66, 50, 49, 54, 128, 66, 50, 49, 53, 128, 66, 50, 49, 52, + 128, 66, 50, 49, 51, 128, 66, 50, 49, 50, 128, 66, 50, 49, 49, 128, 66, + 50, 49, 48, 128, 66, 50, 48, 57, 128, 66, 50, 48, 56, 128, 66, 50, 48, + 55, 128, 66, 50, 48, 54, 128, 66, 50, 48, 53, 128, 66, 50, 48, 52, 128, + 66, 50, 48, 51, 128, 66, 50, 48, 50, 128, 66, 50, 48, 49, 128, 66, 50, + 48, 48, 128, 66, 49, 57, 177, 66, 49, 57, 48, 128, 66, 49, 56, 57, 128, + 66, 49, 56, 53, 128, 66, 49, 56, 52, 128, 66, 49, 56, 51, 128, 66, 49, + 56, 50, 128, 66, 49, 56, 49, 128, 66, 49, 56, 48, 128, 66, 49, 55, 57, + 128, 66, 49, 55, 56, 128, 66, 49, 55, 55, 128, 66, 49, 55, 182, 66, 49, + 55, 52, 128, 66, 49, 55, 179, 66, 49, 55, 50, 128, 66, 49, 55, 49, 128, + 66, 49, 55, 48, 128, 66, 49, 54, 57, 128, 66, 49, 54, 56, 128, 66, 49, + 54, 55, 128, 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, 49, 54, 52, + 128, 66, 49, 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, 66, 49, 54, + 48, 128, 66, 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, 55, 128, 66, + 49, 53, 182, 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, 49, 53, 51, + 128, 66, 49, 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, 128, 66, 49, + 52, 54, 128, 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, 52, 177, 66, + 49, 52, 176, 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, 50, 128, 66, + 49, 51, 177, 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, 183, 66, 49, + 50, 181, 66, 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, 66, 49, 50, + 176, 66, 49, 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, 56, 205, 66, + 49, 48, 56, 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, 66, 49, 48, + 54, 205, 66, 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, 48, 53, 198, + 66, 49, 48, 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, 48, 176, 66, + 48, 57, 177, 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, 56, 183, 66, + 48, 56, 54, 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, 48, 56, 50, + 128, 66, 48, 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, 66, 48, 55, + 184, 66, 48, 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, 48, 55, 180, + 66, 48, 55, 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, 55, 176, 66, + 48, 54, 185, 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, 182, 66, 48, + 54, 181, 66, 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, 54, 178, 66, + 48, 54, 177, 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, 184, 66, 48, + 53, 183, 66, 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, 180, 66, 48, + 53, 179, 66, 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, 66, 48, 52, + 57, 128, 66, 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, 182, 66, 48, + 52, 181, 66, 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, 66, 48, 52, + 177, 66, 48, 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, 48, 51, 183, + 66, 48, 51, 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, 48, 51, 178, + 66, 48, 51, 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, 50, 184, 66, + 48, 50, 183, 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, 180, 66, 48, + 50, 179, 66, 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, 176, 66, 48, + 49, 57, 128, 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, 49, 182, 66, + 48, 49, 181, 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, 178, 66, 48, + 49, 177, 66, 48, 49, 176, 66, 48, 48, 185, 66, 48, 48, 184, 66, 48, 48, + 183, 66, 48, 48, 182, 66, 48, 48, 181, 66, 48, 48, 180, 66, 48, 48, 179, + 66, 48, 48, 178, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, 69, 210, 65, + 89, 66, 128, 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, + 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, + 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, + 128, 65, 85, 83, 84, 82, 65, 204, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, + 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 45, 50, 128, 65, 85, + 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, 128, 65, 85, 71, 85, + 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, 79, 206, 65, 85, 69, + 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, + 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 79, 205, + 65, 84, 78, 65, 200, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 89, + 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, 84, 82, 79, 76, 79, + 71, 73, 67, 65, 204, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, 69, + 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, 69, + 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, 83, + 69, 82, 84, 73, 79, 78, 128, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, + 78, 68, 73, 78, 199, 65, 82, 85, 72, 85, 65, 128, 65, 82, 84, 65, 66, + 197, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79, 211, 65, 82, 82, + 79, 87, 83, 128, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 82, 82, 79, + 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 65, 82, + 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, + 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, 193, + 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, 79, + 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, 82, + 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, 73, + 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, + 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, + 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, + 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, + 206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, + 82, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, + 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, + 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 45, 82, 65, 72, 77, + 65, 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, + 85, 83, 128, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, + 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, + 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, + 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 79, 84, 72, 69, 83, + 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80, + 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83, + 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80, + 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76, + 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 69, 83, 207, 65, 80, 65, 82, + 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, + 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82, + 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, 84, 73, 82, 69, 83, 84, + 82, 73, 67, 84, 73, 79, 78, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, + 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, + 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, + 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, + 79, 67, 75, 87, 73, 83, 197, 65, 78, 83, 85, 218, 65, 78, 80, 69, 65, + 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, + 84, 73, 79, 206, 65, 78, 75, 72, 128, 65, 78, 72, 85, 128, 65, 78, 71, + 85, 76, 65, 82, 128, 65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 75, 72, + 65, 78, 75, 72, 85, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, + 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 77, 80, + 83, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 79, 85, 78, + 212, 65, 77, 66, 193, 65, 77, 65, 76, 71, 65, 77, 65, 84, 73, 79, 206, + 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 84, 69, 82, 78, 65, 84, 73, 86, + 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 76, 84, 69, 82, 78, + 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, 128, 65, 76, 80, + 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, 83, + 212, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, 76, + 76, 201, 65, 76, 76, 65, 200, 65, 76, 73, 71, 78, 69, 196, 65, 76, 73, + 70, 85, 128, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, 77, + 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65, + 76, 65, 89, 72, 197, 65, 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, + 78, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, + 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 82, 80, + 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, 73, 76, 77, 128, 65, 73, + 72, 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, + 72, 65, 71, 71, 65, 210, 65, 71, 79, 71, 201, 65, 71, 71, 82, 65, 86, 65, + 84, 73, 79, 78, 128, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, + 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, + 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, 69, 89, 65, 78, 78, 65, + 128, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, + 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 69, 89, 65, 78, + 78, 65, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, 128, 65, 197, 65, + 68, 86, 65, 78, 67, 69, 128, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, + 68, 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 197, 65, 67, 84, 85, + 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 75, 78, 79, 87, + 76, 69, 68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, + 128, 65, 67, 67, 79, 85, 78, 212, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, + 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, + 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, + 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, + 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, + 128, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 66, 65, + 65, 70, 73, 76, 73, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, + 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, + 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, }; static unsigned short lexicon_offset[] = { @@ -3060,5717 +3164,5725 @@ 1069, 1074, 1081, 1085, 1089, 1094, 1104, 1110, 1023, 1112, 1117, 1123, 325, 1130, 1134, 1140, 1144, 1147, 1152, 1158, 1163, 1083, 1169, 1176, 1181, 1183, 1185, 1190, 1195, 624, 1204, 1210, 1213, 1215, 1221, 31, - 1224, 1226, 1179, 1229, 1237, 1243, 1250, 1274, 1296, 1318, 1340, 1361, - 1382, 1402, 1422, 1441, 1460, 1479, 1498, 1517, 1536, 1555, 1574, 1592, - 1610, 1628, 1646, 1664, 1682, 1700, 1718, 1736, 1754, 1772, 1789, 1806, - 1823, 1840, 1857, 1874, 1891, 1908, 1925, 1942, 1959, 1975, 1991, 2007, - 2023, 2039, 2055, 2071, 2087, 2103, 2119, 2135, 2151, 2167, 2183, 2199, - 2215, 2231, 2247, 2263, 2279, 2295, 2311, 2327, 2343, 2359, 2375, 2391, - 2407, 2423, 2439, 2455, 2471, 2487, 2503, 2519, 2535, 2551, 2567, 2583, - 2599, 2615, 2631, 2647, 2663, 2679, 2695, 2711, 2727, 2743, 2759, 2775, - 2791, 2807, 2823, 2839, 2855, 2871, 2887, 2903, 2919, 2935, 2951, 2967, - 2983, 2999, 3015, 3031, 3047, 3063, 3079, 3095, 3111, 3127, 3143, 3159, - 3175, 3191, 3207, 3223, 3239, 3255, 3271, 3287, 3303, 3319, 3335, 3351, - 3367, 3383, 3399, 3415, 3431, 3447, 3463, 3479, 3495, 3511, 3527, 3543, - 3559, 3575, 3591, 3607, 3623, 3639, 3655, 3671, 3687, 3703, 3719, 3735, - 3751, 3767, 3783, 3799, 3815, 3831, 3847, 3863, 3879, 3895, 3911, 3927, - 3943, 3959, 3975, 3991, 4007, 4023, 4039, 4055, 4071, 4087, 4103, 4119, - 4135, 4151, 4167, 4183, 4199, 4215, 4231, 4247, 4263, 4279, 4295, 4311, - 4327, 4343, 4359, 4375, 4391, 4407, 4423, 4439, 4455, 4471, 4487, 4503, - 4519, 4535, 4551, 4567, 4583, 4599, 4615, 4631, 4647, 4663, 4679, 4695, - 4711, 4727, 4743, 4759, 4775, 4791, 4807, 4823, 4839, 4855, 4871, 4887, - 4903, 4919, 4935, 4951, 4967, 4983, 4999, 5015, 5031, 5047, 5063, 5079, - 5095, 5111, 5127, 5143, 5159, 5175, 5191, 5207, 5223, 5239, 5255, 5271, - 5287, 5303, 5319, 5335, 5351, 5367, 5383, 5399, 5415, 5431, 5447, 5463, - 5479, 5495, 5511, 5527, 5543, 5559, 5575, 5591, 5607, 5623, 5639, 5655, - 5671, 5687, 5703, 5719, 5735, 5751, 5767, 5783, 5799, 5815, 5831, 5847, - 5863, 5879, 5895, 5911, 5927, 5943, 5959, 5975, 5991, 6007, 6023, 6039, - 6055, 6071, 6087, 6103, 6119, 6135, 6151, 6167, 6183, 6199, 6215, 6231, - 6247, 6263, 6279, 6295, 6311, 6327, 6343, 6359, 6375, 6391, 6407, 6423, - 6439, 6455, 6471, 6487, 6503, 6519, 6535, 6551, 6567, 6583, 6599, 6615, - 6631, 6647, 6663, 6679, 6695, 6711, 6727, 6743, 6759, 6775, 6791, 6807, - 6823, 6839, 6855, 6871, 6887, 6903, 6919, 6935, 6951, 6967, 6983, 6999, - 7015, 7031, 7047, 7063, 7079, 7095, 7111, 7127, 7143, 7159, 7175, 7191, - 7207, 7223, 7239, 7255, 7271, 7287, 7303, 7319, 7335, 7351, 7367, 7383, - 7399, 7415, 7431, 7447, 7463, 7479, 7495, 7511, 7527, 7543, 7559, 7575, - 7591, 7607, 7623, 7639, 7655, 7671, 7687, 7703, 7719, 7735, 7751, 7767, - 7783, 7799, 7815, 7831, 7847, 7863, 7879, 7895, 7911, 7927, 7943, 7959, - 7975, 7991, 8007, 8023, 8039, 8055, 8071, 8087, 8103, 8119, 8135, 8151, - 8167, 8183, 8199, 8215, 8231, 8247, 8263, 8279, 8295, 8311, 8327, 8343, - 8359, 8375, 8391, 8407, 8423, 8439, 8455, 8471, 8487, 8503, 8519, 8535, - 8551, 8567, 8583, 8599, 8615, 8631, 8647, 8663, 8679, 8695, 8711, 8727, - 8743, 8759, 8775, 8791, 8807, 8823, 8839, 8855, 8871, 8887, 8903, 8919, - 8935, 8951, 8967, 8983, 8999, 9015, 9031, 9047, 9063, 9079, 9095, 9111, - 9127, 9143, 9159, 9175, 9191, 9207, 9223, 9239, 9255, 9271, 9287, 9303, - 9319, 9335, 9351, 9367, 9383, 9399, 9415, 9431, 9447, 9463, 9479, 9495, - 9511, 9527, 9543, 9559, 9575, 9591, 9607, 9623, 9639, 9655, 9671, 9687, - 9703, 9719, 9735, 9751, 9767, 9783, 9799, 9815, 9831, 9847, 9863, 9879, - 9895, 9911, 9927, 9943, 9959, 9975, 9991, 10007, 10023, 10039, 10055, - 10071, 10087, 10103, 10119, 10135, 10151, 10167, 10183, 10199, 10215, - 10231, 10247, 10263, 10279, 10295, 10311, 10327, 10343, 10359, 10375, - 10391, 10407, 10423, 10439, 10455, 10471, 10487, 10503, 10519, 10535, - 10551, 10567, 10583, 10599, 10615, 10631, 10647, 10663, 10679, 10695, - 10711, 10727, 10743, 10759, 10775, 10791, 10807, 10823, 10839, 10855, - 10871, 10887, 10903, 10919, 10934, 10949, 10964, 10979, 10994, 11009, - 11024, 11039, 11054, 11069, 11084, 11099, 11114, 11129, 11144, 11159, - 11174, 11189, 11204, 11219, 11234, 11249, 11264, 11279, 11294, 11309, - 11324, 11339, 11354, 11369, 11384, 11399, 11414, 11429, 11444, 11459, - 11474, 11489, 11504, 11519, 11534, 11549, 11564, 11579, 11594, 11609, - 11624, 11639, 11654, 11669, 11684, 11699, 11714, 11729, 11744, 11759, - 11774, 11789, 11804, 11819, 11834, 11849, 11864, 11879, 11894, 11909, - 11924, 11939, 11954, 11969, 11984, 11999, 12014, 12029, 12044, 12059, - 12074, 12089, 12104, 12119, 12134, 12149, 12164, 12179, 12194, 12209, - 12224, 12239, 12254, 12269, 12284, 12299, 12314, 12329, 12344, 12359, - 12374, 12389, 12404, 12419, 12434, 12449, 12464, 12479, 12494, 12509, - 12524, 12539, 12554, 12569, 12584, 12599, 12614, 12629, 12644, 12659, - 12674, 12689, 12704, 12719, 12734, 12749, 12764, 12779, 12794, 12809, - 12824, 12839, 12854, 12869, 12884, 12899, 12914, 12929, 12944, 12959, - 12974, 12989, 13004, 13019, 13034, 13049, 13064, 13079, 13094, 13109, - 13124, 13139, 13154, 13169, 13184, 13199, 13214, 13229, 13244, 13259, - 13274, 13289, 13304, 13319, 13334, 13349, 13364, 13379, 13394, 13409, - 13424, 13439, 13454, 13469, 13484, 13499, 13514, 13529, 13544, 13559, - 13574, 13589, 13604, 13619, 13634, 13649, 13664, 13679, 13694, 13709, - 13724, 13739, 13754, 13769, 13784, 13799, 13814, 13829, 13844, 13859, - 13874, 13889, 13904, 13919, 13934, 13949, 13964, 13979, 13994, 14009, - 14024, 14039, 14054, 14069, 14084, 14099, 14114, 14129, 14144, 14159, - 14174, 14189, 14204, 14219, 14234, 14249, 14264, 14279, 14294, 14309, - 14324, 14339, 14354, 14369, 14384, 14399, 14414, 14429, 14444, 14459, - 14474, 14489, 14504, 14519, 14534, 14549, 14564, 14579, 14594, 14609, - 14624, 14639, 14654, 14669, 14684, 14699, 14714, 14729, 14744, 14759, - 14774, 14789, 14804, 14819, 14834, 14849, 14864, 14879, 14894, 14909, - 14924, 14939, 14954, 14969, 14984, 14999, 15014, 15029, 15044, 15059, - 15074, 15089, 15104, 15119, 15134, 15149, 15164, 15179, 15194, 15209, - 15224, 15239, 15254, 15269, 15284, 15299, 15314, 15329, 15344, 15359, - 15374, 15389, 15404, 15419, 15434, 15449, 15464, 15479, 15494, 15509, - 15524, 15539, 15554, 15569, 15584, 15599, 15614, 15629, 15644, 15659, - 15674, 15689, 15704, 15719, 15734, 15749, 15764, 15779, 15794, 15809, - 15824, 15839, 15854, 15869, 15884, 15899, 15914, 15929, 15944, 15959, - 15974, 15989, 16004, 16019, 16034, 16049, 16064, 16079, 16094, 16109, - 16124, 16139, 16154, 16169, 16184, 16199, 16214, 16229, 16244, 16259, - 16274, 16289, 16304, 16319, 16334, 16349, 16364, 16379, 16394, 16409, - 16424, 16439, 16454, 16469, 16484, 16499, 16514, 16529, 16544, 16559, - 16574, 16589, 16604, 16619, 16634, 16649, 16664, 16679, 16694, 16709, - 16724, 16739, 16754, 16769, 16784, 16799, 16814, 16829, 16844, 16859, - 16874, 16889, 16904, 16919, 16934, 16949, 16964, 16979, 16994, 17009, - 17024, 17039, 17054, 17069, 17084, 17099, 17114, 17129, 17144, 17159, - 17174, 17189, 17204, 17219, 17234, 17249, 17264, 17279, 17294, 17309, - 17324, 17339, 17354, 17369, 17384, 17399, 17414, 17429, 17444, 17459, - 17474, 17489, 17504, 17519, 17534, 17549, 17564, 17579, 17594, 17609, - 17624, 17639, 17654, 17669, 17684, 17699, 17714, 17729, 17744, 17759, - 17774, 17789, 17804, 17819, 17834, 17849, 17864, 17879, 17894, 17909, - 17924, 17939, 17954, 17969, 17984, 17999, 18014, 18029, 18044, 18059, - 18074, 18089, 18104, 18119, 18134, 18149, 18164, 18179, 18194, 18209, - 18224, 18239, 18254, 18269, 18283, 18297, 18311, 18325, 18339, 1408, - 18353, 18367, 18381, 18395, 18409, 18423, 18437, 18451, 18465, 18479, - 18493, 18507, 18521, 18535, 18549, 18563, 18577, 18591, 18605, 18619, - 18633, 18647, 18661, 18675, 18689, 18703, 1809, 18717, 18731, 18745, - 18759, 18773, 18787, 18801, 18815, 18829, 18843, 18857, 18871, 18885, - 18899, 18913, 18927, 18941, 18954, 18967, 18980, 18993, 19006, 19019, - 19032, 19045, 19058, 19071, 19084, 19097, 19110, 19123, 19136, 19149, - 19162, 19175, 19188, 19201, 19214, 19227, 19240, 1759, 19253, 19266, - 19279, 19292, 19305, 19318, 19331, 19344, 19357, 19370, 19383, 19396, - 19409, 19422, 19435, 19448, 19461, 19474, 19487, 19500, 19513, 19526, - 19539, 19552, 19565, 19578, 19591, 19604, 19617, 19630, 19643, 19656, - 19669, 19682, 19695, 19708, 19721, 1523, 19734, 19747, 19760, 19773, - 19786, 19799, 19812, 19825, 19838, 19851, 19864, 19877, 19890, 19903, - 19916, 19929, 19942, 19955, 19968, 19981, 19994, 20007, 20020, 20033, - 20046, 20059, 20072, 20085, 20098, 20111, 20124, 20137, 20150, 20163, - 20176, 20189, 20202, 20215, 20228, 20241, 20254, 20267, 20280, 20293, - 20306, 20319, 20332, 20345, 20358, 20371, 20384, 20397, 20410, 20423, - 20436, 20449, 20462, 20475, 20488, 20501, 20514, 20527, 20540, 20553, - 20566, 20579, 20592, 20605, 20618, 20631, 20644, 20657, 20670, 20683, - 20696, 20709, 20722, 20735, 20748, 20761, 20774, 20787, 20800, 20813, - 20826, 20839, 20852, 20865, 20878, 20891, 20904, 20917, 20930, 20943, - 20956, 20969, 20982, 20995, 21008, 21021, 21034, 21047, 21060, 21073, - 21086, 21099, 21112, 21125, 21138, 21151, 21164, 21177, 21190, 21203, - 21216, 21229, 21242, 21255, 21268, 21281, 21294, 21307, 21320, 21333, - 21346, 21359, 21372, 21385, 21398, 21411, 21424, 21437, 21450, 21463, - 21476, 21489, 21502, 21515, 21528, 21541, 21554, 21567, 21580, 21593, - 21606, 21619, 21632, 21645, 21658, 21671, 21684, 21697, 21710, 21723, - 21736, 21749, 21762, 21775, 21788, 21801, 21814, 21827, 21840, 21853, - 21866, 21879, 21892, 21905, 21918, 21931, 21944, 21957, 21970, 21983, - 21996, 22009, 22022, 22034, 22046, 22058, 22070, 22082, 22094, 22106, - 22118, 22130, 22142, 22154, 22166, 22178, 22190, 22202, 22214, 22226, - 22238, 1670, 22250, 22262, 22274, 1616, 22286, 22298, 22310, 22322, - 22334, 22346, 22358, 1505, 1598, 22370, 1634, 22382, 22394, 22406, 22418, - 22430, 22442, 22454, 22466, 22478, 22490, 22502, 22514, 22526, 22538, - 22550, 22562, 22574, 22586, 22598, 22610, 22622, 22634, 22646, 22658, - 22670, 22682, 22694, 22706, 22718, 22730, 22742, 22754, 22766, 22778, - 22790, 22802, 22814, 22826, 22838, 22850, 22862, 22874, 22886, 22898, - 22910, 22922, 22934, 22946, 22958, 22970, 22982, 22994, 23006, 23018, - 23030, 23042, 23054, 23066, 23078, 23090, 23102, 23114, 23126, 23138, - 23150, 23162, 23174, 23186, 23198, 23210, 23222, 23234, 23246, 23258, - 23270, 23282, 23294, 23306, 23318, 23330, 23342, 23354, 23366, 23378, - 23390, 23402, 23414, 1390, 23426, 23438, 23450, 1724, 23462, 23474, - 23486, 23498, 23510, 23522, 23534, 23546, 23558, 23570, 23582, 23594, - 23606, 23618, 23630, 23642, 23654, 23666, 23678, 23690, 23702, 23714, - 23726, 23738, 23750, 23762, 23774, 23786, 23798, 23810, 23822, 23834, - 23846, 23858, 23870, 23882, 23894, 23906, 23918, 23930, 23942, 23954, - 23966, 23978, 23990, 24002, 24014, 24026, 24038, 24050, 24062, 24074, - 24086, 24098, 24110, 24122, 24134, 24146, 24158, 24170, 24182, 24194, - 24206, 24218, 24230, 24242, 24254, 24266, 24278, 24290, 24302, 24314, - 24326, 24338, 24350, 24362, 24374, 24386, 24398, 24410, 24422, 24434, - 24446, 24458, 24470, 24482, 24494, 24506, 24518, 24530, 24542, 24554, - 24566, 24578, 24590, 24602, 24614, 24626, 24638, 24650, 24662, 24674, - 24686, 24698, 24710, 24722, 24734, 24746, 24758, 24770, 24781, 24792, - 24803, 24814, 24825, 24836, 24847, 24858, 24869, 24880, 24891, 24902, - 24913, 24924, 24935, 24946, 24957, 1795, 24968, 24979, 24990, 25001, - 25012, 25023, 25034, 25045, 25056, 1880, 1307, 25067, 1430, 25078, 25089, - 25100, 25111, 25122, 25133, 1897, 25144, 25155, 25166, 25177, 25188, - 25199, 25210, 25221, 25232, 25243, 25254, 25265, 25276, 25287, 1863, - 25298, 25309, 25320, 25331, 25342, 25353, 25364, 25375, 25386, 25397, - 25408, 25419, 25430, 25441, 25452, 25463, 25474, 25485, 25496, 25507, - 25518, 25529, 25540, 25551, 25562, 25573, 25584, 25595, 25606, 25617, - 25628, 25639, 25650, 25661, 25672, 25683, 25694, 25705, 25716, 25727, - 25738, 25749, 25760, 25771, 25782, 25793, 25804, 25815, 25826, 25837, - 25848, 25859, 25870, 25881, 25892, 25903, 25914, 25925, 25936, 25947, - 25958, 25969, 25980, 25991, 26002, 26013, 26024, 26035, 26046, 26057, - 26068, 26079, 26090, 26101, 26112, 26123, 26134, 26145, 26156, 26167, - 26178, 26189, 26200, 26211, 26222, 26233, 26244, 26255, 26266, 26277, - 26288, 26299, 26310, 26321, 26332, 26343, 26354, 26365, 26376, 26387, - 26398, 26409, 26420, 26431, 26442, 26453, 18580, 26464, 26475, 26486, - 26497, 26508, 26519, 26530, 26541, 26552, 26563, 26574, 26585, 26596, - 26607, 26618, 26629, 26640, 26651, 26662, 26673, 26684, 26695, 26706, - 26717, 26728, 26739, 26750, 26761, 26772, 26783, 26794, 26805, 26816, - 26827, 26838, 26849, 26860, 26871, 26882, 26893, 26904, 26915, 26926, - 26937, 26948, 26959, 26970, 26981, 26992, 27003, 27013, 27023, 27033, - 27043, 27053, 27063, 27073, 27083, 27093, 27103, 27113, 27123, 27133, - 27143, 27153, 27163, 27173, 27183, 27193, 27203, 22072, 27213, 27223, - 27233, 27243, 27253, 27263, 27273, 27283, 1372, 27293, 27303, 27313, - 27323, 27333, 27343, 27353, 27363, 27373, 27383, 27393, 27403, 27413, - 27423, 27433, 27443, 27453, 27463, 27473, 27483, 27493, 27503, 27513, - 27523, 27533, 27543, 27553, 27563, 27573, 27583, 27593, 27603, 27613, - 27623, 27633, 27643, 27653, 27663, 27673, 27683, 27693, 27703, 27713, - 27723, 27733, 27743, 27753, 27763, 27773, 27783, 27793, 27803, 27813, - 27823, 27833, 27843, 27853, 27863, 27873, 27883, 27893, 27903, 27913, - 27923, 27933, 27943, 27953, 27963, 27973, 27983, 27993, 19490, 28003, - 22672, 28013, 28023, 28033, 28043, 28053, 28063, 28073, 28083, 28093, - 28103, 28113, 28123, 28133, 28143, 28153, 28163, 28173, 28183, 28193, - 28203, 28213, 28223, 28233, 28243, 28253, 28263, 28273, 28283, 28293, - 28303, 28313, 28323, 28333, 28343, 28353, 28363, 28373, 28383, 28393, - 28403, 28413, 28423, 28433, 28443, 28453, 28463, 28473, 28483, 28493, - 28503, 28513, 28523, 28533, 28543, 28553, 28563, 28573, 28583, 28593, - 28603, 28613, 28623, 28633, 28643, 28653, 28663, 28673, 28683, 28693, - 28703, 28713, 28723, 28733, 28743, 28753, 28763, 28773, 28783, 28793, - 28803, 28813, 28823, 28833, 28843, 28853, 28863, 28873, 28883, 28893, - 28903, 28913, 28923, 28933, 28943, 28953, 28963, 28973, 28983, 28993, - 29003, 29013, 29023, 29033, 29043, 29053, 29063, 29073, 29083, 29093, - 29103, 29113, 29123, 29133, 29143, 29153, 29163, 29173, 29183, 29193, - 29203, 29213, 29223, 29233, 29243, 29253, 29263, 29273, 29283, 29293, - 29303, 29313, 29323, 29333, 29343, 1949, 29353, 29363, 29373, 29383, - 29393, 29403, 29413, 29423, 29433, 29443, 29453, 29463, 29473, 29483, - 29493, 29503, 29513, 29523, 29533, 29543, 29553, 29563, 29573, 29583, - 29593, 29603, 29613, 29623, 29633, 29643, 29653, 29663, 29673, 29683, - 29693, 29703, 29713, 29723, 29733, 29743, 29753, 29763, 29773, 29783, - 29793, 29803, 29813, 29823, 29833, 29843, 29853, 29863, 29873, 29883, - 29893, 29903, 29913, 29923, 29933, 29942, 29951, 29960, 29969, 29978, - 29987, 29996, 30005, 30014, 30023, 30032, 30041, 30050, 30059, 30068, - 30077, 30086, 18958, 30095, 30104, 30113, 30122, 30131, 30140, 30149, - 30158, 30167, 30176, 30185, 30194, 30203, 30212, 30221, 30230, 30239, - 30248, 30257, 30266, 30275, 30284, 30293, 30302, 30311, 30320, 30329, - 30338, 30347, 30356, 30365, 30374, 30383, 30392, 30401, 30410, 30419, - 30428, 30437, 30446, 30455, 30464, 30473, 24926, 30482, 30491, 30500, - 30509, 30518, 30527, 30536, 30545, 30554, 30563, 30572, 30581, 30590, - 30599, 30608, 30617, 30626, 30635, 30644, 30653, 30662, 30671, 30680, - 30689, 30698, 30707, 30716, 25135, 30725, 30734, 30743, 30752, 30761, - 30770, 30779, 30788, 30797, 30806, 30815, 30824, 30833, 30842, 30851, - 30860, 30869, 30878, 30887, 30896, 30905, 1287, 30914, 30923, 30932, - 30941, 30950, 30959, 30968, 30977, 30986, 30995, 31004, 31013, 31022, - 31031, 31040, 31049, 29894, 31058, 31067, 31076, 31085, 31094, 31103, - 31112, 31121, 31130, 31139, 31148, 31157, 31166, 31175, 31184, 31193, - 31202, 31211, 31220, 31229, 31238, 31247, 31256, 31265, 31274, 31283, - 31292, 31301, 31310, 31319, 31328, 31337, 31346, 31355, 31364, 31373, - 31382, 31391, 31400, 31409, 31418, 31427, 31436, 31445, 31454, 31463, - 31472, 31481, 31490, 31499, 31508, 31517, 31526, 31535, 31544, 31553, - 31562, 31571, 31580, 31589, 31598, 31607, 31616, 31625, 31634, 31643, - 31652, 31661, 31670, 31679, 31688, 31697, 31706, 31715, 31724, 31733, - 31742, 31751, 31760, 31769, 31778, 31787, 31796, 31805, 31814, 31823, - 31832, 31841, 31850, 31859, 31868, 31877, 31886, 31895, 31904, 31913, - 31922, 31931, 31940, 31949, 31958, 31967, 31976, 31985, 31994, 32003, - 32012, 32021, 32030, 32039, 32048, 32057, 32066, 32075, 32084, 32093, - 32102, 32111, 32120, 32129, 32138, 32147, 32156, 32165, 32174, 32183, - 32192, 32201, 32210, 10766, 32219, 32228, 32237, 32246, 32255, 32264, - 32273, 32282, 32291, 32300, 32309, 32318, 32327, 32336, 32345, 32354, - 32363, 32372, 32381, 32390, 32399, 32408, 32417, 32426, 32435, 32444, - 32453, 32462, 32471, 32480, 32489, 32498, 32507, 32516, 32525, 32534, - 32543, 32552, 32561, 32570, 32579, 32588, 32597, 32606, 32615, 32624, - 32633, 32642, 32651, 32660, 32669, 32678, 32687, 32696, 32705, 32714, - 32723, 1848, 32732, 32741, 32750, 32759, 32768, 32777, 32786, 32795, - 32804, 32813, 32822, 32831, 32840, 32849, 32858, 32867, 32876, 32885, - 32894, 32903, 32912, 32921, 32930, 32939, 32948, 32957, 32966, 32975, - 32984, 32993, 33002, 33011, 33020, 33029, 33038, 33047, 33056, 33065, - 33074, 33083, 33091, 33099, 33107, 33115, 18289, 33123, 33131, 33139, - 33147, 33155, 33163, 33171, 33179, 33187, 33195, 33203, 33211, 33219, - 33227, 33235, 33243, 33251, 33259, 33267, 27465, 33275, 33283, 33291, - 33299, 33307, 33315, 33323, 33331, 33339, 33347, 19609, 33355, 33363, - 33371, 33379, 33387, 33395, 33403, 18317, 33411, 33419, 33427, 33435, - 33443, 1471, 33451, 33459, 2047, 19765, 33467, 1967, 33475, 33483, 33491, - 18373, 33499, 33507, 33515, 33523, 18985, 22362, 33531, 33539, 33547, - 33555, 33563, 33571, 33579, 33587, 33595, 33603, 30402, 33611, 33619, - 33627, 33635, 33643, 33651, 33659, 33667, 33675, 33683, 33691, 1815, - 33699, 33707, 33715, 33723, 33731, 33739, 33747, 33755, 33763, 33771, - 33779, 33787, 33795, 33803, 33811, 33819, 33827, 33835, 33843, 33851, - 33859, 33867, 33875, 33883, 33891, 33899, 33907, 33915, 33923, 33931, - 33939, 33947, 33955, 33963, 33971, 33979, 33987, 33995, 34003, 34011, - 34019, 34027, 34035, 34043, 34051, 34059, 34067, 34075, 34083, 34091, - 27265, 34099, 34107, 34115, 34123, 34131, 34139, 34147, 34155, 34163, - 34171, 34179, 34187, 34195, 34203, 34211, 34219, 30906, 34227, 34235, - 34243, 34251, 34259, 34267, 34275, 34283, 34291, 34299, 34307, 34315, - 34323, 34331, 34339, 34347, 34355, 34363, 34371, 34379, 34387, 34395, - 34403, 34411, 34419, 34427, 34435, 34443, 34451, 34459, 34467, 34475, - 34483, 34491, 34499, 34507, 34515, 34523, 34531, 34539, 34547, 27325, - 34555, 34563, 34571, 34579, 34587, 34595, 34603, 34611, 34619, 34627, - 34635, 34643, 34651, 34659, 34667, 34675, 34683, 26467, 34691, 34699, - 34707, 34715, 34723, 34731, 34739, 34747, 34755, 34763, 34771, 34779, - 34787, 34795, 34803, 34811, 34819, 34827, 34835, 34843, 34851, 34859, - 34867, 34875, 34883, 34891, 34899, 34907, 34915, 34923, 34931, 34939, - 34947, 34955, 34963, 34971, 34979, 34987, 34995, 30951, 35003, 35011, - 35019, 35027, 35035, 35043, 35051, 35059, 35067, 35075, 35083, 35091, - 35099, 26588, 35107, 35115, 1934, 35123, 35131, 35139, 35147, 35155, - 35163, 35171, 35179, 32706, 35187, 35195, 35203, 35211, 35219, 35227, - 35235, 35243, 35251, 35259, 35267, 35275, 35283, 35291, 35299, 35307, - 35315, 35323, 35331, 35339, 2015, 35347, 35355, 10863, 35363, 35371, - 35379, 35387, 35395, 35403, 35411, 35419, 35427, 23310, 35435, 35443, - 35451, 35459, 35467, 35475, 35483, 35491, 35499, 35507, 35515, 35523, - 35531, 35539, 35547, 35555, 35563, 35571, 35579, 35587, 35595, 35603, - 35611, 35619, 35627, 35635, 35643, 35651, 35659, 35667, 35675, 35683, - 19141, 35691, 35699, 35707, 35715, 35723, 35731, 35739, 35747, 35755, - 1710, 35763, 35771, 35779, 35787, 35795, 35803, 35811, 35819, 35827, - 35835, 35843, 35851, 35859, 35867, 35875, 35883, 35891, 35899, 35907, - 35915, 35923, 35931, 35939, 35947, 35955, 35963, 35971, 35979, 35987, - 35995, 36003, 36011, 36019, 18905, 36027, 36035, 36043, 36051, 36059, - 36067, 36075, 36083, 36091, 36099, 36107, 28965, 36115, 36123, 36131, - 36139, 36147, 36155, 36163, 36171, 36179, 36187, 36195, 36202, 36209, - 36216, 36223, 36230, 19753, 36237, 36244, 36251, 36258, 36265, 36272, - 36279, 36286, 36293, 36300, 36307, 36314, 36321, 36328, 36335, 36342, - 36349, 11047, 36356, 36363, 36370, 36377, 36384, 36391, 36398, 36405, - 36412, 36419, 36426, 36433, 36440, 36447, 36454, 36461, 36468, 36475, - 36482, 36489, 36496, 36503, 36510, 36517, 1510, 36524, 36531, 1603, - 36538, 36545, 36552, 36559, 36566, 36573, 36580, 36587, 36594, 36601, - 36608, 36615, 36622, 36629, 36636, 36643, 36650, 1354, 36657, 36664, - 36671, 36678, 36685, 36692, 36699, 36706, 36713, 36720, 36727, 36734, - 36741, 36748, 36755, 36762, 36769, 36776, 36783, 26578, 36790, 36797, - 36804, 36811, 36818, 36825, 36832, 36839, 36846, 36853, 36860, 36867, - 36874, 36881, 36888, 36895, 36902, 36909, 36916, 36923, 36930, 36937, - 36944, 36951, 36958, 36965, 36972, 36979, 36986, 36993, 30187, 37000, - 37007, 37014, 37021, 37028, 37035, 37042, 37049, 37056, 37063, 37070, - 37077, 37084, 37091, 37098, 37105, 37112, 37119, 37126, 37133, 37140, - 37147, 37154, 37161, 37168, 37175, 37182, 37189, 37196, 37203, 37210, - 37217, 37224, 37231, 37238, 37245, 37252, 37259, 37266, 37273, 37280, - 22123, 37287, 37294, 37301, 37308, 37315, 37322, 37329, 37336, 37343, - 37350, 37357, 37364, 37371, 37378, 37385, 37392, 37399, 37406, 37413, - 37420, 37427, 37434, 37441, 37448, 37455, 37462, 37469, 37476, 37483, - 37490, 25291, 37497, 37504, 37511, 37518, 37525, 37532, 37539, 37546, - 37553, 37560, 37567, 30403, 37574, 37581, 37588, 37595, 37602, 37609, - 37616, 37623, 37630, 1747, 37637, 37644, 37651, 37658, 37665, 37672, - 37679, 37686, 37693, 37700, 37707, 37714, 37721, 37728, 37735, 37742, - 37749, 37756, 37763, 37770, 37777, 37784, 37791, 37798, 37805, 37812, - 37819, 37826, 37833, 37840, 37847, 37854, 37861, 37868, 37875, 37882, - 37889, 37896, 37903, 37910, 37917, 37924, 37931, 37938, 37945, 37952, - 37959, 37966, 30952, 37973, 37980, 37987, 37994, 38001, 38008, 38015, - 38022, 38029, 38036, 38043, 38050, 38057, 38064, 38071, 38078, 38085, - 38092, 38099, 38106, 38113, 38120, 38127, 38134, 38141, 38148, 38155, - 26512, 38162, 38169, 38176, 38183, 38190, 38197, 38204, 38211, 38218, - 38225, 38232, 38239, 38246, 38253, 34308, 38260, 38267, 38274, 38281, - 38288, 38295, 38302, 38309, 38316, 38323, 38330, 38337, 38344, 38351, - 38358, 38365, 38372, 38379, 38386, 38393, 38400, 38407, 38414, 38421, - 38428, 38435, 38442, 38449, 38456, 38463, 38470, 38477, 38484, 38491, - 38498, 38505, 38512, 38519, 38526, 38533, 38540, 38547, 38554, 38561, - 38568, 38575, 38582, 29166, 38589, 38596, 38603, 38610, 38617, 35596, - 38624, 38631, 38638, 38645, 38652, 38659, 38666, 38673, 38680, 38687, - 38694, 33196, 38701, 38708, 38715, 38722, 38729, 38736, 38743, 38750, - 38757, 38764, 38771, 38778, 38785, 38792, 38799, 38806, 38813, 38820, - 38827, 38834, 38841, 38848, 38855, 38862, 38869, 38876, 38883, 38890, - 38897, 38904, 30772, 38911, 38918, 38925, 38932, 23167, 38939, 38946, - 38953, 38960, 38967, 38974, 38981, 38988, 38995, 39002, 39009, 39016, - 39023, 39030, 39037, 39044, 39051, 39058, 39065, 39072, 39079, 39086, - 39093, 39100, 39107, 39114, 39121, 39128, 30970, 39135, 39142, 39149, - 28966, 39156, 39163, 39170, 39177, 39184, 39191, 39198, 39205, 39212, - 39219, 39226, 39233, 39240, 39247, 39254, 39261, 39267, 39273, 39279, - 39285, 39291, 39297, 39303, 39309, 39315, 39321, 39327, 38086, 33917, - 39333, 39339, 39345, 39351, 27927, 39357, 39363, 39369, 39375, 39381, - 39387, 39393, 39399, 27127, 39405, 39411, 39417, 39423, 39255, 39429, - 39435, 39441, 39447, 39453, 39459, 39465, 27227, 39471, 39477, 39483, - 39489, 39495, 39501, 39507, 39513, 39519, 39525, 39531, 39537, 39543, - 39549, 39555, 39561, 27287, 39567, 39573, 39579, 39585, 25061, 22148, - 39591, 19299, 28047, 39597, 39603, 39609, 39615, 19065, 39621, 39627, - 1312, 39633, 39639, 1549, 22580, 39645, 39651, 18347, 39657, 22448, - 39663, 39669, 1416, 39675, 18753, 39681, 19286, 39687, 39693, 39699, - 39705, 39711, 39717, 39723, 39729, 39735, 39741, 33613, 39747, 39753, - 39759, 39765, 27137, 39771, 39777, 39783, 39789, 39795, 39801, 39807, - 39813, 39819, 39825, 39831, 10973, 1198, 39837, 39843, 39849, 39855, - 39861, 39867, 39873, 39879, 39885, 39891, 39897, 39903, 39909, 39915, - 39921, 39927, 39933, 39939, 39945, 39951, 22460, 39957, 39963, 39969, - 39975, 39981, 39987, 39993, 39999, 40005, 40011, 40017, 40023, 40029, - 40035, 40041, 40047, 40053, 40059, 26876, 40065, 40071, 40077, 40083, - 40089, 40095, 40101, 40107, 40113, 40119, 40125, 30980, 27197, 40131, - 40137, 40143, 40149, 40155, 40161, 40167, 40173, 40179, 40185, 40191, - 40197, 40203, 40209, 40215, 40221, 40227, 40233, 40239, 40245, 40251, - 40257, 40263, 40269, 40275, 40281, 40287, 40293, 40299, 40305, 27377, - 40311, 40317, 40323, 40329, 40335, 40341, 40347, 40353, 40359, 40365, - 40371, 40377, 40383, 40389, 40395, 40401, 40407, 40413, 40419, 40425, - 40431, 40437, 40443, 40449, 40455, 40461, 40467, 40473, 40479, 40485, - 40491, 40497, 40503, 40509, 40515, 40521, 40527, 40533, 40539, 40545, - 32861, 40551, 40557, 40563, 40569, 40575, 40581, 40587, 40593, 40599, - 40605, 40611, 40617, 40623, 40629, 40635, 40641, 40647, 40653, 40659, - 40665, 40671, 40677, 40683, 40689, 40695, 40701, 40707, 40713, 26469, - 40719, 40725, 40731, 40737, 40743, 40749, 40755, 40761, 40767, 40773, - 40779, 40785, 40791, 40797, 40803, 40809, 40815, 40821, 40827, 40833, - 40839, 40845, 40851, 27367, 40857, 40863, 40869, 40875, 40881, 40887, - 40893, 40899, 40905, 40911, 40917, 40923, 40929, 40935, 40941, 40947, - 40953, 40959, 40965, 40971, 40977, 40983, 40989, 40995, 41001, 41007, - 41013, 41019, 41025, 41031, 41037, 41043, 37827, 41049, 41055, 41061, - 41067, 41073, 41079, 41085, 41091, 41097, 41103, 34469, 41109, 41115, - 41121, 41127, 41133, 41139, 41145, 41151, 41157, 41163, 41169, 41175, - 41181, 36093, 41187, 41193, 41199, 41205, 41211, 41217, 41223, 41229, - 41235, 41241, 41247, 41253, 41259, 41265, 41271, 41277, 41283, 41289, - 41295, 41301, 41307, 41313, 41319, 41325, 41331, 41337, 41343, 41349, - 41355, 41361, 41367, 41373, 41379, 41385, 41391, 41397, 41403, 41409, - 41415, 41421, 41427, 41433, 41439, 41445, 34701, 41451, 41457, 41463, - 41469, 41475, 41481, 41487, 22712, 41493, 41499, 41505, 41511, 41517, - 41523, 41529, 41535, 41541, 41547, 41553, 41559, 41565, 41571, 41577, - 41583, 41589, 41595, 41601, 41607, 41613, 41619, 41625, 41631, 41637, - 41643, 41649, 41655, 41661, 41667, 41673, 41679, 41685, 41691, 41697, - 41703, 41709, 41715, 41721, 41727, 41733, 41739, 41745, 41751, 41757, - 41763, 41769, 41775, 41781, 41787, 41793, 41799, 41805, 41811, 41817, - 41823, 41829, 41835, 41841, 41847, 41853, 41859, 41865, 41871, 41877, - 41883, 41889, 41895, 41901, 41907, 41913, 41919, 41925, 41931, 41937, - 41943, 41949, 41955, 41961, 41967, 41973, 41979, 41985, 41991, 41997, - 42003, 42009, 42015, 42021, 42027, 42033, 42039, 42045, 42051, 42057, - 42063, 42069, 42075, 42081, 42087, 42093, 42099, 42105, 42111, 42117, - 42123, 42129, 42135, 42141, 42147, 42153, 42159, 42165, 42171, 42177, - 42183, 42189, 37169, 42195, 42201, 42207, 42213, 42219, 42225, 42231, - 42237, 42243, 42249, 42255, 42261, 42267, 42273, 42279, 42285, 42291, - 42297, 42303, 42309, 42315, 42321, 42327, 42333, 42339, 42345, 42351, - 42357, 42363, 42369, 42375, 42381, 42387, 42393, 42399, 42405, 42411, - 42417, 42423, 42429, 42435, 42441, 42447, 42453, 42459, 42465, 42471, - 42477, 42483, 42489, 42495, 42501, 42507, 42513, 42519, 42525, 42531, - 42537, 42543, 42549, 42555, 42561, 42567, 42573, 42579, 42585, 42591, - 42597, 42603, 42609, 42615, 42621, 42627, 42633, 42639, 42645, 42651, - 42657, 42663, 42669, 42675, 42681, 42687, 42693, 42699, 42705, 42711, - 42717, 42723, 42729, 32393, 42735, 42741, 42747, 42753, 42759, 42765, - 42771, 42777, 42783, 42789, 42795, 42801, 42807, 42813, 42819, 42825, - 42831, 42837, 42843, 42849, 42855, 10943, 42861, 42867, 42873, 42879, - 42885, 42891, 42897, 42903, 42909, 42915, 42921, 42927, 42933, 42939, - 22496, 42945, 42951, 42957, 39122, 42963, 42969, 30989, 42975, 42981, - 42987, 42993, 42999, 43005, 43011, 43017, 43023, 43029, 43035, 43041, - 43047, 43053, 43059, 43065, 43071, 43077, 43083, 43089, 43095, 43101, - 43107, 43113, 43119, 43125, 43131, 43137, 43143, 43149, 43155, 43161, - 43167, 43173, 43179, 43185, 29087, 43191, 43197, 43203, 43209, 43215, - 43221, 43227, 43233, 43239, 43245, 43251, 43257, 43263, 43269, 43275, - 43281, 43287, 43293, 43299, 43305, 43311, 43317, 43323, 43329, 43335, - 43341, 43347, 43353, 43359, 43365, 43371, 43376, 43381, 43386, 43391, - 43396, 43401, 43406, 43411, 43416, 30198, 43421, 19157, 43426, 43431, - 40864, 43436, 43441, 43446, 28858, 43451, 43456, 43461, 43466, 43471, - 43476, 43481, 43486, 43491, 43496, 43501, 43506, 43511, 43060, 43516, - 41068, 29308, 43521, 43526, 43531, 39784, 43536, 43541, 43546, 43551, - 43556, 43561, 43566, 43571, 43576, 40024, 43581, 43586, 43591, 43596, - 43601, 32682, 43606, 43611, 43616, 43621, 43626, 43631, 43636, 43641, - 43646, 43651, 43656, 43661, 43666, 43671, 43676, 43681, 43686, 43691, - 43696, 1377, 43701, 43706, 43711, 43716, 17919, 43721, 43726, 43731, - 43736, 43741, 43746, 43751, 43756, 43761, 43766, 43771, 43776, 43781, - 43786, 40900, 43791, 43796, 43801, 43806, 43811, 43816, 43821, 43826, - 43831, 43836, 43841, 43846, 43851, 43856, 43861, 43866, 43871, 43876, - 43881, 43886, 39880, 43891, 43896, 42916, 43901, 43906, 434, 43911, - 31152, 43916, 43921, 43926, 43931, 43936, 43941, 43946, 43951, 43956, - 1153, 43961, 43966, 43971, 43976, 43981, 27058, 43986, 43991, 43996, - 44001, 44006, 44011, 39382, 44016, 44021, 44026, 44031, 44036, 44041, - 44046, 44051, 44056, 44061, 44066, 44071, 44076, 44081, 44086, 44091, - 44096, 44101, 44106, 44111, 18949, 44116, 44121, 44126, 44131, 44136, - 44141, 44146, 44151, 44156, 44161, 44166, 44171, 44176, 44181, 44186, - 44191, 43294, 44196, 38220, 44201, 44206, 44211, 44216, 44221, 44226, - 44231, 44236, 42958, 19404, 44241, 44246, 44251, 44256, 40120, 44261, - 44266, 44271, 44276, 44281, 44286, 44291, 44296, 26437, 44301, 44306, - 44311, 44316, 29288, 44321, 44326, 44331, 44336, 44341, 44346, 44351, - 44356, 44361, 44366, 44371, 44376, 44381, 44386, 44391, 44396, 44401, - 44406, 44411, 44416, 44421, 44426, 44431, 44436, 44441, 44446, 44451, - 44456, 44461, 44466, 44471, 44476, 26591, 44481, 44486, 44491, 44496, - 27388, 44501, 33830, 44506, 44511, 44516, 44521, 44526, 44531, 44536, - 44541, 44546, 44551, 44556, 44561, 44566, 44571, 44576, 44581, 44586, - 44591, 44596, 44601, 42634, 44606, 44611, 44616, 32745, 44621, 44626, - 30819, 44631, 44636, 44641, 44646, 44651, 44656, 41446, 44661, 44666, - 37100, 44671, 44676, 44681, 18572, 44686, 44691, 44696, 44701, 35590, - 44706, 44711, 44716, 44721, 44726, 44731, 36974, 38633, 44736, 44741, - 44746, 44751, 44756, 44761, 44766, 44771, 44776, 44781, 44786, 44791, - 44796, 44801, 44806, 44811, 44816, 44821, 44826, 44831, 44836, 44841, - 44846, 44851, 43054, 44856, 37275, 44861, 44866, 44871, 44876, 36358, - 44881, 44886, 44891, 44896, 44901, 44906, 44911, 44916, 44921, 44926, - 44931, 44936, 44941, 44946, 44951, 44956, 44961, 44966, 44971, 44976, - 44981, 28938, 44986, 44991, 44996, 45001, 45006, 38136, 45011, 45016, - 45021, 45026, 45031, 45036, 45041, 45046, 32934, 45051, 45056, 45061, - 45066, 45071, 45076, 45081, 45086, 45091, 45096, 45101, 45106, 45111, - 45116, 45121, 45126, 45131, 45136, 45141, 45146, 45151, 45156, 45161, - 45166, 45171, 45176, 45181, 45186, 45191, 45196, 45201, 45206, 45211, - 45216, 45221, 45226, 45231, 45236, 45241, 45246, 45251, 45256, 45261, - 45266, 45271, 45276, 45281, 45286, 45291, 45296, 45301, 45306, 45311, - 45316, 45321, 45326, 45331, 45336, 45341, 45346, 45351, 45356, 45361, - 45366, 45371, 45376, 45381, 45386, 45391, 45396, 45401, 45406, 45411, - 45416, 45421, 45426, 45431, 45436, 45441, 45446, 45451, 45456, 45461, - 45466, 45471, 45476, 45481, 45486, 45491, 45496, 45501, 45506, 45511, - 45516, 45521, 45526, 45531, 45536, 45541, 45546, 45551, 45556, 45561, - 45566, 45571, 45576, 45581, 45586, 45591, 45596, 45601, 45606, 45611, - 45616, 45621, 45626, 45631, 45636, 45641, 45646, 45651, 45656, 45661, - 45666, 45671, 45676, 45681, 45686, 45691, 45696, 45701, 45706, 45711, - 45716, 45721, 45726, 40750, 40756, 40762, 45731, 45736, 45741, 45746, - 45751, 45756, 45761, 45766, 45771, 45776, 29328, 40768, 40774, 40780, - 45781, 42142, 45786, 45791, 45796, 45801, 45806, 45811, 45816, 45821, - 45826, 45831, 45836, 45841, 45846, 40894, 45851, 45856, 45861, 45866, - 45871, 45876, 45881, 45886, 45891, 45896, 45901, 45906, 45911, 45916, - 45921, 45926, 39682, 45931, 45936, 45941, 45946, 45951, 45956, 45961, - 45966, 45971, 45976, 45981, 45986, 45991, 45996, 46001, 46006, 46011, - 46016, 46021, 46026, 46031, 46036, 46041, 46046, 46051, 46056, 46061, - 46066, 46071, 46076, 46081, 46086, 46091, 46096, 46101, 46106, 46111, - 46116, 46121, 46126, 46131, 46136, 46141, 46146, 46151, 46156, 46161, - 46166, 46171, 46176, 46181, 41074, 41080, 46186, 46191, 46196, 46201, - 46206, 46211, 46216, 46221, 41092, 41098, 46226, 46231, 30666, 46236, - 46241, 46246, 43258, 43264, 46251, 46256, 46261, 46266, 46271, 46276, - 46281, 46286, 46291, 46296, 46301, 46306, 46311, 46316, 46321, 46326, - 46331, 46336, 46341, 46346, 46351, 46356, 46361, 46366, 46371, 46376, - 46381, 46386, 46391, 46396, 46401, 46406, 46411, 46416, 46421, 46426, - 41374, 46431, 41380, 46436, 46441, 46446, 18446, 33486, 46451, 41386, - 41392, 41398, 41404, 41410, 41416, 46456, 46461, 46466, 46471, 40924, - 46476, 40810, 46481, 46486, 46491, 42976, 46496, 46501, 46506, 46511, - 46516, 46521, 46526, 46531, 46536, 46541, 46546, 46551, 46556, 46561, - 46566, 46571, 46576, 46581, 46586, 46591, 46596, 46601, 46606, 46611, - 46616, 46621, 46626, 46631, 46636, 46641, 46646, 46651, 46656, 46661, - 46666, 46671, 46676, 46681, 46686, 46691, 46696, 46701, 46706, 46711, - 46716, 46721, 46726, 46731, 46736, 46741, 46746, 46751, 46756, 46761, - 46766, 46771, 46776, 42484, 40960, 40966, 40972, 42562, 46781, 46786, - 46791, 46796, 46801, 46806, 46811, 46816, 46821, 46826, 46831, 46836, - 46841, 46846, 46851, 46856, 46861, 46866, 46871, 46876, 46881, 46886, - 46891, 46896, 46901, 46906, 41686, 41692, 41698, 46911, 46916, 46921, - 46926, 46931, 46936, 46941, 46946, 46951, 46956, 46961, 46966, 46971, - 46976, 46981, 46986, 41704, 46991, 41710, 41716, 42232, 46996, 47001, - 47006, 47011, 47016, 47021, 47026, 47031, 47036, 47041, 47046, 47051, - 47056, 47061, 47066, 47071, 47076, 47081, 47086, 47091, 47096, 47101, - 47106, 47111, 47116, 47121, 47126, 47131, 47136, 47141, 47146, 47151, - 39280, 47156, 47161, 47166, 47171, 47176, 47181, 47186, 47191, 47196, - 43024, 47201, 47206, 41500, 47211, 41506, 47216, 47221, 47226, 47231, - 47236, 41512, 47241, 41518, 41524, 41530, 47246, 38031, 47251, 47256, - 47261, 47266, 47271, 47276, 47281, 47286, 47291, 47296, 47301, 47306, - 47311, 47316, 47321, 47326, 47331, 47336, 47341, 41536, 41542, 47346, - 47351, 47356, 47361, 47366, 47371, 47376, 47381, 47386, 35374, 47391, - 47396, 41548, 47401, 41554, 29338, 41560, 47406, 47411, 47416, 47421, - 38542, 47426, 47431, 47436, 47441, 47446, 47451, 47456, 47461, 47466, - 47471, 47476, 47481, 47486, 47491, 47496, 47501, 47506, 47511, 47516, - 47521, 47526, 39646, 47531, 47536, 47541, 47546, 47551, 47556, 47561, - 47566, 47571, 47576, 47581, 42238, 47586, 47591, 47596, 47601, 47606, - 47611, 47616, 42244, 47621, 42250, 47626, 47631, 47636, 47641, 41572, - 41584, 39586, 47646, 47651, 47656, 47661, 47666, 47671, 47676, 47681, - 47686, 47691, 47696, 47701, 47706, 47711, 47716, 47721, 47726, 47731, - 38773, 47736, 47741, 47746, 47751, 47756, 47761, 47766, 47771, 47776, - 47781, 47786, 47791, 47796, 47801, 47806, 47811, 47816, 47821, 47826, - 41590, 47831, 47836, 47841, 47846, 47851, 47856, 47861, 47866, 47871, - 47876, 47881, 47886, 47891, 47896, 47901, 47906, 47911, 47916, 47921, - 47926, 47931, 47936, 47941, 47946, 47951, 47956, 47961, 47966, 47971, - 47976, 47981, 47986, 47991, 47996, 48001, 48006, 48011, 48016, 48021, - 48026, 48031, 48036, 48041, 48046, 48051, 48056, 48061, 48066, 48071, - 48076, 48081, 48086, 48091, 48096, 48101, 48106, 48111, 48116, 48121, - 48126, 48131, 48136, 48141, 48146, 48151, 48156, 48161, 48166, 48171, - 48176, 48181, 48186, 48191, 48196, 48201, 48206, 48211, 48216, 48221, - 48226, 48231, 48236, 48241, 48246, 48251, 48256, 48261, 48266, 48271, - 48276, 48281, 48286, 48291, 48296, 42520, 48301, 48306, 48311, 48316, - 48321, 48326, 48331, 48336, 48341, 48346, 48351, 48356, 48361, 48366, - 48371, 48376, 48381, 48386, 48391, 48396, 42646, 42274, 48401, 42280, - 48406, 48411, 48416, 48421, 48426, 48431, 48436, 48441, 48446, 48451, - 48456, 48461, 48466, 48471, 48476, 48481, 48486, 48491, 48496, 48501, - 48506, 48511, 48516, 48521, 48526, 48531, 48536, 48541, 42880, 42886, - 48546, 48551, 48556, 48561, 48566, 31089, 48571, 942, 48576, 48581, - 48586, 48591, 48596, 48601, 48606, 48611, 48616, 48621, 48626, 48631, - 48636, 48641, 48646, 48651, 48656, 48661, 48666, 48671, 48676, 48681, - 48686, 48691, 48696, 48701, 48706, 48711, 48716, 48721, 27328, 48726, - 48731, 42892, 48736, 48741, 48746, 48751, 48756, 48761, 48766, 48771, - 48776, 48781, 42382, 48786, 48791, 48796, 48801, 48806, 48811, 48816, - 48821, 48826, 27138, 48831, 48836, 48841, 48846, 48851, 48856, 38486, - 48861, 48866, 48871, 48876, 48881, 48886, 48891, 48896, 48901, 48906, - 48911, 48916, 48921, 48926, 48931, 48936, 48941, 48946, 48951, 48956, - 48961, 48966, 40636, 48971, 33406, 39011, 29348, 48976, 48981, 48986, - 48991, 48996, 49001, 49006, 49011, 49016, 33702, 49021, 49026, 49031, - 49036, 49041, 41620, 41626, 41632, 49046, 41650, 41836, 41842, 49051, - 49056, 49061, 49066, 49071, 49076, 49081, 49086, 49091, 49096, 49101, - 49106, 49111, 49116, 49121, 49126, 49131, 49136, 49141, 42292, 42298, - 42304, 49146, 49151, 49156, 49161, 49166, 49171, 49176, 49181, 49186, - 42310, 49191, 42316, 49196, 49201, 49206, 49211, 49216, 49221, 49226, - 49231, 49236, 49241, 49246, 49251, 49256, 49261, 49266, 49271, 49276, - 49281, 49286, 49291, 49296, 49301, 49306, 42322, 42328, 49311, 42334, - 42340, 42346, 49316, 49321, 49326, 49331, 49336, 49341, 49346, 49351, - 49356, 49361, 49366, 49371, 49376, 49381, 49386, 49391, 49396, 49401, - 49406, 49411, 49416, 602, 49420, 27259, 49424, 33007, 24876, 49428, - 49432, 49436, 33959, 42581, 49440, 49444, 19743, 41909, 26427, 49448, - 49452, 49456, 41225, 32368, 40451, 49460, 49464, 49468, 32638, 49472, - 49476, 49480, 39395, 39797, 45837, 49484, 49488, 49492, 22282, 49496, - 49500, 49504, 38858, 41069, 49508, 18601, 49512, 49516, 49520, 28969, - 49524, 49528, 49532, 49536, 39473, 45832, 49540, 33559, 27159, 45652, - 36268, 19197, 39737, 49544, 26570, 49548, 44277, 31081, 49552, 49556, - 49560, 49564, 30451, 38543, 49568, 29069, 40811, 49572, 37374, 48912, - 49576, 40895, 46937, 49580, 49584, 44857, 49588, 49592, 38914, 49596, - 43817, 23302, 45842, 49600, 49604, 49608, 49612, 260, 35095, 49616, - 49620, 25503, 49624, 49628, 39845, 49632, 30928, 40409, 49636, 49640, - 49644, 46227, 49648, 49652, 49656, 49660, 46067, 49664, 49668, 49672, - 49676, 49680, 47192, 49684, 49688, 49692, 49696, 49700, 46912, 33052, - 49704, 49708, 49712, 49716, 49720, 49724, 49728, 49732, 49736, 47732, - 33943, 49740, 49744, 49748, 49752, 49756, 49760, 49764, 48582, 49768, - 27439, 43055, 40319, 34151, 49772, 49776, 49780, 40481, 46457, 46462, - 49784, 46232, 39131, 49788, 49792, 49796, 49800, 45847, 36842, 49804, - 48442, 32125, 49808, 40523, 35775, 37332, 49812, 49816, 42239, 49820, - 37136, 24694, 45892, 38123, 49824, 49828, 49832, 49836, 48567, 49840, - 49844, 49848, 44827, 49852, 49856, 49860, 49864, 49868, 49872, 47727, - 46742, 49876, 38746, 49880, 49884, 49888, 49892, 49896, 49900, 49904, - 49908, 47742, 48307, 49912, 49916, 49920, 49924, 49928, 49932, 48877, - 31270, 37213, 48887, 49936, 22030, 49940, 1177, 48922, 48927, 29089, - 48712, 49944, 34047, 49948, 49952, 49956, 49960, 49964, 40493, 49968, - 49972, 37423, 45067, 49976, 49980, 37430, 43295, 49984, 49988, 40013, - 49992, 49996, 50000, 50004, 50008, 50012, 50016, 30739, 45667, 50020, - 45817, 38291, 34607, 50024, 50028, 50032, 50036, 50040, 50044, 50048, - 50052, 50056, 50060, 50064, 50068, 50072, 50076, 50080, 50084, 50088, - 50092, 50096, 31144, 50100, 50104, 50108, 50112, 50116, 50120, 50124, - 50128, 46342, 46347, 50132, 50136, 50140, 50144, 50148, 50152, 50156, - 50160, 46377, 50164, 40901, 43692, 50168, 50172, 42809, 50176, 50180, - 50184, 50188, 50192, 41159, 50196, 33079, 50200, 50204, 50208, 50212, - 50216, 50220, 50224, 50228, 50232, 46202, 44837, 44842, 46527, 50236, - 50240, 50244, 46587, 50248, 22750, 50252, 50256, 46637, 50260, 30748, - 50264, 50268, 50272, 50276, 50280, 35103, 50284, 50288, 50292, 50296, - 50300, 50304, 43972, 50308, 42257, 50312, 50316, 50320, 50324, 24898, - 50328, 32503, 50332, 50336, 33903, 50340, 50344, 50348, 41963, 50352, - 50356, 50360, 50364, 50368, 18447, 47747, 973, 50372, 50376, 50380, - 50384, 48587, 50388, 30289, 50392, 50396, 50400, 50404, 50408, 50412, - 50416, 50420, 50424, 50428, 50432, 48882, 50436, 50440, 50444, 50448, - 35671, 50452, 50456, 34495, 50460, 40031, 50464, 50468, 50472, 30325, - 50476, 42605, 50480, 38445, 50484, 50488, 50492, 50496, 50500, 50504, - 50508, 50512, 41417, 40487, 50516, 50520, 40403, 50524, 50528, 50532, - 50536, 50540, 47867, 50544, 47882, 47912, 50548, 50552, 50556, 48737, - 50560, 50564, 50568, 44287, 50572, 44617, 47972, 50576, 50580, 50584, - 42017, 50588, 49067, 34375, 42161, 50592, 50596, 43229, 31099, 40253, - 50600, 32989, 50604, 34559, 27229, 50608, 50612, 50616, 50620, 50624, - 50628, 50632, 50636, 50640, 50644, 50648, 50652, 50656, 50660, 50664, - 50668, 50672, 50676, 50680, 50684, 50688, 50692, 50696, 50700, 50704, - 50708, 50712, 50716, 50720, 50724, 50728, 50732, 50736, 50740, 50744, - 50748, 50752, 50756, 50760, 50764, 50768, 50772, 50776, 50780, 50784, - 50788, 50792, 50796, 50800, 50804, 50808, 50812, 50816, 50820, 50824, - 50828, 50832, 50836, 50840, 50844, 50848, 50852, 50856, 50860, 50864, - 50868, 50872, 50876, 50880, 50884, 50888, 50892, 50896, 50900, 50904, - 50908, 50912, 50916, 50920, 50924, 50928, 50932, 50936, 50940, 50944, - 50948, 50952, 50956, 50960, 50964, 50968, 50972, 50976, 50980, 50984, - 50988, 50992, 50996, 51000, 51004, 51008, 51012, 51016, 51020, 51024, - 51028, 51032, 51036, 51040, 51044, 51048, 51052, 51056, 51060, 51064, - 51068, 51072, 45597, 35295, 45607, 51076, 51080, 51084, 51088, 51092, - 51096, 51100, 32494, 51104, 51108, 45612, 51112, 51116, 45617, 51120, - 51124, 44587, 51128, 45627, 45632, 45637, 51132, 51136, 45642, 45647, - 45657, 45662, 44197, 45672, 51140, 51144, 51148, 45677, 47497, 45682, - 45687, 51152, 30100, 51156, 51160, 51164, 51168, 51172, 51176, 51180, - 51184, 51188, 51192, 45822, 51196, 51200, 51204, 51208, 51212, 36541, - 51216, 51220, 51224, 51228, 51232, 51236, 51240, 51244, 51248, 51252, - 51256, 51260, 51264, 51268, 51272, 51276, 25481, 51280, 51284, 35543, - 51288, 46052, 51292, 46057, 36135, 51296, 46062, 51300, 42071, 46072, - 39647, 51304, 46082, 46087, 46092, 46097, 46102, 46857, 51308, 51312, - 51316, 46107, 48447, 46112, 46122, 51320, 51324, 51328, 46127, 46132, - 44267, 46137, 46142, 46147, 51332, 51336, 51340, 51344, 51348, 51352, - 51356, 51360, 51364, 51368, 51372, 51376, 51380, 51384, 26339, 44552, - 51388, 51392, 51396, 51400, 41117, 51404, 51408, 51412, 51416, 51420, - 51424, 51428, 51432, 51436, 51440, 51444, 51448, 51452, 51456, 51460, - 51464, 51468, 51472, 51476, 51480, 51484, 51488, 51492, 51496, 51500, - 51504, 51508, 51512, 46327, 51516, 46332, 46337, 51520, 51524, 37010, - 46352, 51528, 46357, 51532, 51536, 51540, 46362, 51544, 46367, 46372, - 51548, 44342, 46382, 51552, 461, 51556, 44347, 46387, 46392, 46397, - 46402, 46407, 46412, 46417, 51560, 51564, 51568, 51572, 51576, 51580, - 44467, 29909, 45857, 45867, 30217, 35999, 51584, 51588, 45872, 45877, - 45882, 41939, 51592, 51596, 51600, 51604, 44117, 26394, 32359, 51608, - 51612, 51616, 51620, 51624, 51628, 34967, 51632, 51636, 51640, 51644, - 51648, 45887, 32431, 44812, 36975, 45902, 45907, 51652, 45912, 39683, - 44742, 44747, 44752, 51656, 51660, 51664, 51668, 51672, 51676, 51680, - 51684, 51688, 51692, 51696, 49142, 31198, 40751, 40643, 40763, 26405, - 45007, 51700, 41747, 36031, 48837, 51704, 51708, 51712, 51716, 51720, - 51724, 44452, 46917, 46922, 46927, 51728, 51732, 51736, 46932, 46942, - 51740, 46947, 46952, 46957, 44457, 46962, 51744, 46967, 47707, 46972, - 46977, 51748, 51752, 32089, 51756, 51760, 47067, 51764, 622, 51768, - 51772, 25426, 51776, 51780, 51784, 51788, 51792, 51796, 51800, 51804, - 51808, 51812, 51816, 51820, 22210, 51824, 51828, 51832, 51836, 51840, - 51844, 51848, 51852, 51856, 51860, 51864, 51868, 51872, 51876, 51880, - 51884, 51888, 51892, 51896, 51900, 51904, 51908, 29899, 46502, 51912, - 44317, 46512, 51916, 51920, 46517, 36331, 24777, 51924, 44832, 48847, - 51928, 51932, 51936, 46277, 51940, 46537, 46542, 51944, 51948, 51952, - 46547, 51956, 284, 46552, 46557, 46562, 44757, 46572, 46577, 46582, - 46592, 46597, 51960, 30460, 51964, 46607, 46612, 51968, 51972, 51976, - 51980, 51984, 51988, 51992, 51996, 52000, 46617, 52004, 52008, 52012, - 52016, 46622, 41891, 46632, 52020, 52024, 46642, 46647, 46652, 46657, - 46662, 38298, 46672, 52028, 46677, 52032, 46687, 52036, 42095, 52040, - 46692, 18190, 46702, 52044, 52048, 52052, 52056, 52060, 39815, 52064, - 40085, 22678, 22138, 52068, 46707, 52072, 46712, 52076, 33679, 52080, - 35871, 27879, 46717, 41429, 46722, 33407, 46732, 52084, 52088, 52092, - 52096, 52100, 52104, 52108, 46737, 43337, 46747, 52112, 52116, 52120, - 52124, 52128, 46752, 52132, 52136, 46757, 52140, 52144, 52148, 37661, - 52152, 52156, 52160, 52164, 43259, 43265, 52168, 52172, 52176, 19652, - 43001, 52180, 52184, 52188, 44187, 52192, 52196, 52200, 52204, 52208, - 52212, 52216, 52220, 52224, 48577, 52228, 52232, 41123, 52236, 52240, - 52244, 52248, 52252, 52256, 52260, 52264, 52268, 52272, 52276, 52280, - 52284, 52288, 52292, 52296, 52300, 52304, 52308, 52312, 52316, 52320, - 52324, 52328, 52332, 52336, 52340, 52344, 52348, 52352, 52356, 52360, - 52364, 52368, 52372, 52376, 52380, 52384, 52388, 52392, 52396, 52400, - 52404, 52408, 52412, 52416, 52420, 52424, 52428, 52432, 52436, 52440, - 52444, 47752, 33119, 52448, 47757, 41363, 47767, 29009, 35311, 52452, - 52456, 52460, 43073, 52464, 52468, 43792, 48332, 47777, 52472, 52476, - 52480, 52484, 52488, 48342, 47782, 47787, 47792, 47797, 52492, 52496, - 47802, 47807, 47812, 47817, 52500, 52504, 52508, 36063, 25514, 48602, - 52512, 52516, 48612, 48617, 52520, 52524, 52528, 48622, 52532, 52536, - 48627, 48632, 52540, 52544, 52548, 38648, 48642, 48647, 52552, 48652, - 52556, 30109, 52560, 44377, 52564, 48657, 52568, 48662, 48667, 48672, - 48677, 48682, 48687, 52572, 52576, 52580, 52584, 52588, 52592, 52596, - 52600, 52604, 52608, 52612, 48892, 48697, 52616, 52620, 52624, 52628, - 52632, 52636, 52640, 52644, 52648, 52652, 52656, 52660, 1955, 52664, - 52668, 52672, 52676, 52680, 52684, 52688, 52692, 52696, 52700, 52704, - 52708, 52712, 52716, 52720, 52724, 52728, 52732, 52736, 49167, 46257, - 52740, 52744, 27869, 52748, 52752, 45062, 29329, 40769, 40775, 33687, - 37276, 52756, 34447, 52760, 52764, 52768, 52772, 52776, 52780, 52784, - 52788, 52792, 52796, 52800, 52804, 52808, 52812, 52816, 52820, 52824, - 52828, 52832, 52836, 52840, 52844, 52848, 52852, 52856, 52860, 52864, - 52868, 52872, 52876, 52880, 52884, 52888, 52892, 52896, 47112, 47117, - 46807, 46812, 44422, 46817, 52900, 44427, 52904, 46822, 46827, 44432, - 47122, 47127, 47132, 52908, 52912, 52916, 52920, 52924, 52928, 52932, - 52936, 52940, 52944, 52948, 52952, 52956, 37626, 52960, 52964, 52968, - 44382, 52972, 52976, 52980, 52984, 52988, 52992, 47862, 52996, 44607, - 47872, 47877, 44612, 47887, 53000, 47892, 47897, 53004, 47902, 47907, - 53008, 53012, 53016, 53020, 53024, 47917, 47922, 47927, 49342, 47932, - 53028, 47937, 47942, 47947, 47952, 53032, 48962, 53036, 47957, 47962, - 53040, 47967, 53044, 47977, 48747, 47982, 47987, 47992, 47997, 53048, - 42474, 36675, 1086, 19640, 49781, 603, 39492, 28980, 27870, 33560, 5572, - 19198, 53052, 53055, 53058, 31190, 33296, 4804, 5060, 32504, 50381, - 45013, 53061, 37438, 39864, 50369, 32288, 38138, 49533, 5316, 53064, - 26516, 53067, 36955, 53070, 36731, 49589, 29110, 50293, 43224, 40230, - 974, 53073, 10931, 53076, 24899, 53079, 44743, 34008, 651, 38544, 42522, - 31910, 1419, 672, 4868, 6084, 51633, 18896, 49108, 53082, 26571, 23315, - 44553, 44748, 51669, 49757, 37704, 23111, 53085, 45893, 22643, 800, - 18938, 764, 40410, 44053, 991, 40086, 1155, 38446, 53088, 53091, 23171, - 53094, 41826, 28910, 25130, 41046, 32198, 53097, 38642, 23435, 40032, - 43290, 53100, 53103, 53106, 53109, 42018, 53112, 51185, 22679, 53115, - 22703, 37662, 53118, 53121, 53124, 22139, 53127, 43170, 35872, 25427, - 30929, 53130, 53133, 42468, 53136, 5124, 51093, 51305, 38992, 53139, - 30452, 50185, 53142, 11036, 27850, 36899, 51661, 31145, 53145, 38761, - 51089, 53148, 30479, 26582, 22391, 40218, 37270, 37851, 1127, 10756, - 53151, 298, 40518, 51657, 49208, 53154, 41988, 50001, 18951, 24695, 5908, - 27900, 19445, 34040, 50189, 22583, 53157, 53160, 53163, 33152, 53166, - 18448, 33080, 51085, 53169, 36000, 33800, 39936, 53172, 53175, 53178, - 29260, 36710, 53181, 53184, 18378, 53187, 36997, 43134, 53190, 12, 53193, - 53196, 5380, 51181, 49553, 53199, 39600, 31028, 623, 36096, 6148, 53202, - 53205, 53208, 53211, 33008, 1091, 34120, 53214, 53217, 22739, 53220, - 37543, 22451, 53223, 51961, 49168, 53226, 24659, 34112, 51097, 53229, - 51189, 28000, 53232, 53235, 53238, 32495, 36339, 50501, 53241, 40686, - 53244, 53247, 53250, 53253, 53256, 53259, 42594, 53262, 53265, 53268, - 53271, 53274, 53277, 53280, 52541, 53283, 26989, 31019, 53286, 53289, - 53292, 53295, 53298, 45888, 51377, 53301, 1178, 285, 53304, 53307, 53310, - 26329, 53313, 52673, 53316, 37144, 35760, 53319, 50621, 51393, 53322, - 18131, 53325, 4676, 4692, 48873, 53328, 30461, 50525, 24683, 45608, - 53331, 53334, 53337, 27440, 5348, 5364, 1476, 53340, 53343, 5588, 53346, - 53349, 53352, 53355, 53358, 47158, 24778, 6164, 51429, 53361, 53364, - 53367, 51357, 324, 53370, 53373, 53376, 53379, 51541, 38943, 27530, - 26395, 40254, 53382, 26384, 1082, 50193, 53385, 42006, 794, 53388, 53391, - 53394, 53397, 53400, 53403, 53406, 53409, 53412, 45003, 53415, 52657, - 53418, 786, 53421, 40068, 53424, 53427, 53430, 53433, 53436, 53439, - 53442, 53445, 45053, 53448, 53451, 44513, 53454, 53457, 53460, 40500, - 53463, 53466, 53469, 40776, 29340, 53472, 53475, 53478, 1972, 52233, - 53481, 53484, 41154, 53487, 53490, 45998, 53493, 53496, 53499, 53502, - 53505, 30011, 53508, 53511, 53514, 37557, 52557, 53517, 53520, 53523, - 53526, 40092, 53529, 53532, 18868, 44348, 1032, 46868, 53535, 53538, - 39336, 53541, 46773, 53544, 51149, 51881, 53547, 53550, 45813, 53553, - 44153, 53556, 52161, 19407, 416, 286, 38237, 1316, 2325, 39973, 21, 38, - 32694, 50274, 53559, 30075, 53561, 320, 36305, 53563, 36235, 42469, - 49918, 213, 44189, 53565, 479, 34049, 53518, 53567, 919, 40093, 42079, - 316, 395, 53569, 885, 30651, 204, 53571, 53329, 53573, 53575, 4, 27891, - 1102, 43604, 1115, 36466, 53577, 53579, 24834, 892, 50538, 373, 53200, - 771, 88, 51526, 703, 53581, 351, 106, 44484, 53116, 39793, 24867, 39325, - 53583, 53585, 35145, 49498, 53587, 53589, 53591, 25164, 43679, 53593, - 53595, 34617, 51966, 53597, 8, 1056, 554, 998, 36034, 39, 98, 14, 5, 161, - 102, 317, 70, 9, 52, 321, 34, 53225, 401, 171, 404, 523, 53599, 53600, + 1224, 1226, 1179, 1229, 1237, 1243, 1250, 1255, 1260, 1266, 1271, 1276, + 1280, 1285, 1291, 1296, 1301, 1305, 1310, 1315, 1319, 1324, 1329, 1334, + 1340, 1346, 1352, 1357, 1361, 1366, 1371, 1376, 1380, 1385, 1390, 1395, + 1400, 1251, 1256, 1261, 1267, 1272, 1404, 1277, 1410, 1419, 1281, 1423, + 1286, 1292, 1297, 1427, 1432, 1437, 1302, 1441, 1445, 1306, 1451, 1311, + 1455, 1459, 1316, 1463, 1468, 1472, 1475, 1320, 1325, 1330, 1479, 1485, + 1491, 1335, 1347, 1353, 1358, 1497, 1502, 1507, 1513, 1518, 1523, 1527, + 1532, 1537, 1542, 1548, 1553, 1558, 1564, 1570, 1575, 1579, 1584, 1589, + 1594, 1598, 1606, 1610, 1615, 1620, 1625, 1630, 1634, 1637, 1642, 1647, + 1652, 1657, 1663, 1668, 1672, 1362, 1675, 1680, 1685, 1367, 1689, 1693, + 1372, 1377, 1700, 1702, 1708, 1381, 1713, 1722, 1386, 1727, 1733, 1391, + 1738, 1743, 1747, 1751, 1396, 1401, 1754, 1756, 1757, 1761, 1765, 1770, + 1774, 1778, 1782, 1785, 1790, 1794, 1799, 1803, 1807, 1812, 1816, 1819, + 1823, 1837, 1841, 1845, 1848, 1853, 1857, 1861, 1866, 1871, 1876, 1880, + 1885, 1889, 1894, 1901, 1907, 1912, 1917, 1923, 1928, 1933, 1936, 1268, + 1938, 1945, 1953, 1963, 1972, 1986, 1990, 2003, 2011, 2015, 2020, 2024, + 2028, 2033, 2038, 2042, 2045, 2049, 2056, 2063, 2069, 2074, 2079, 2082, + 2084, 2087, 2093, 2097, 2102, 2106, 2110, 1704, 1710, 2115, 2119, 2122, + 2127, 2132, 2137, 2141, 2148, 2153, 2156, 2163, 2169, 2173, 2177, 2181, + 2187, 2193, 2207, 2224, 2233, 2238, 2242, 2247, 2252, 2264, 2270, 1897, + 2276, 2279, 2286, 2290, 2294, 2298, 1904, 2302, 2307, 2312, 2316, 2324, + 2328, 2332, 2336, 2341, 2346, 2351, 2355, 2360, 2365, 2369, 2374, 2378, + 2381, 2385, 2389, 2394, 2398, 2402, 2411, 2415, 2419, 2425, 2430, 2434, + 2438, 2443, 2447, 2452, 2458, 2463, 2467, 2059, 2471, 2476, 2482, 2487, + 2491, 2496, 2501, 2505, 2511, 2516, 2522, 2526, 2532, 2537, 1278, 52, + 2543, 2547, 2551, 2555, 2560, 2564, 2568, 2572, 2576, 2581, 2585, 2590, + 2594, 2597, 2601, 2606, 2610, 2615, 2619, 2623, 2628, 2632, 2635, 2648, + 2652, 2656, 2660, 2664, 2668, 2671, 2675, 2679, 2684, 2688, 2693, 2698, + 2703, 2707, 2710, 2713, 2719, 2723, 2727, 2730, 2734, 2738, 404, 2741, + 2746, 2750, 2753, 2758, 2763, 2767, 2772, 2775, 2781, 2788, 2794, 2799, + 2803, 2808, 2812, 2822, 2826, 2830, 2835, 2845, 1786, 2850, 2853, 2859, + 2863, 672, 998, 2867, 2873, 2878, 1795, 2883, 434, 2889, 2900, 1800, + 2904, 2909, 2924, 2930, 2937, 2947, 2953, 2958, 2964, 2967, 2971, 2976, + 2980, 2984, 2988, 2993, 2602, 2999, 3011, 1804, 3018, 3021, 3025, 3029, + 3032, 3036, 3041, 3045, 3049, 3055, 3061, 3066, 3072, 3076, 3084, 3094, + 3100, 3105, 3114, 3122, 3129, 3133, 3142, 3147, 3152, 3156, 3164, 3169, + 3173, 1808, 1420, 286, 401, 3179, 3183, 3187, 3192, 3196, 3200, 3203, + 3207, 3211, 3215, 3220, 3224, 3228, 3176, 3234, 3241, 3245, 3258, 3262, + 3266, 3270, 3274, 3280, 3287, 3291, 3299, 3305, 3310, 3313, 3317, 3321, + 3331, 3339, 3346, 3353, 3359, 3365, 3372, 3376, 3380, 3388, 3393, 3401, + 3406, 3411, 3415, 3420, 3427, 3430, 3434, 3438, 3441, 3447, 3451, 3462, + 3472, 3481, 3490, 3495, 3501, 3505, 3509, 3512, 3516, 3519, 3524, 298, + 373, 3530, 3538, 3542, 3546, 3549, 3555, 3559, 3567, 3573, 3578, 3585, + 3592, 3597, 3604, 3610, 3614, 3619, 3626, 3632, 2620, 3548, 3636, 3643, + 3646, 3654, 3657, 3661, 3665, 3669, 3674, 3678, 3685, 1032, 554, 3689, + 3697, 3704, 3710, 3717, 3725, 3732, 3739, 1298, 1428, 1433, 3750, 1438, + 3754, 3758, 3767, 3776, 3782, 3787, 3791, 3797, 3802, 3806, 3815, 3824, + 3833, 3842, 3847, 3859, 3863, 3866, 3875, 3883, 3887, 3896, 3899, 3908, + 3914, 3922, 3926, 3930, 3933, 3940, 3948, 3956, 3961, 1902, 1908, 3964, + 3972, 1929, 3977, 3981, 3986, 3990, 3994, 3999, 4003, 4008, 4012, 4015, + 4021, 4027, 4033, 4039, 4045, 4051, 4057, 4061, 4065, 4069, 4073, 4077, + 4082, 4090, 4100, 4105, 4109, 4120, 4133, 4144, 4157, 4168, 4180, 4192, + 4204, 4217, 4230, 4237, 4243, 4250, 4256, 4260, 4265, 4269, 4276, 4284, + 4288, 4298, 4302, 4307, 4314, 4320, 3712, 4330, 4334, 4341, 4345, 4349, + 4354, 4359, 4364, 4368, 4374, 1834, 4380, 4384, 4390, 4395, 4400, 4405, + 4411, 4416, 3051, 4421, 4425, 4430, 4435, 4385, 4440, 4444, 4451, 4457, + 4462, 4466, 4471, 4475, 4484, 3936, 4489, 4494, 4391, 4396, 4401, 4498, + 4505, 4511, 4517, 4522, 4527, 4532, 4406, 4412, 4538, 4544, 4549, 4417, + 4554, 1056, 4557, 4565, 4571, 4577, 4586, 4591, 4606, 4623, 4642, 4651, + 4659, 4674, 4684, 4694, 4700, 4712, 4721, 4729, 4736, 4743, 4749, 4754, + 4762, 4772, 4779, 4789, 4799, 4809, 4818, 4828, 4842, 4857, 4866, 4874, + 4879, 4883, 4893, 4903, 4913, 4918, 4922, 4931, 4942, 4955, 4968, 4980, + 4985, 4991, 4994, 4998, 5003, 5007, 5015, 5024, 5032, 5039, 1177, 5050, + 5053, 5059, 5063, 5069, 5076, 5083, 5090, 5097, 5104, 5111, 5116, 4619, + 5121, 5130, 5134, 5146, 5150, 5154, 5158, 5162, 5166, 5171, 5176, 5181, + 5187, 5192, 5197, 4310, 5202, 5206, 5210, 5214, 5219, 5224, 5230, 5234, + 5242, 5245, 5251, 5258, 5262, 5265, 5270, 5276, 5284, 5290, 5295, 4325, + 5300, 5305, 5318, 5332, 5339, 5345, 5349, 5354, 5360, 5365, 3811, 5370, + 5373, 5378, 2343, 5382, 5386, 5392, 5397, 5402, 5410, 5416, 5429, 5437, + 5441, 5449, 5456, 5468, 5478, 5485, 5492, 5501, 5510, 5518, 5524, 5529, + 5535, 4426, 5540, 5543, 5550, 5556, 5569, 5580, 5587, 5593, 5602, 5610, + 5617, 5623, 5629, 5634, 5638, 5643, 5649, 5657, 4431, 5664, 5669, 5676, + 5682, 5687, 5695, 5703, 5710, 5714, 5728, 5738, 5743, 5747, 5758, 5764, + 5769, 5774, 5778, 4436, 5783, 5786, 5798, 5805, 5810, 5814, 5819, 5823, + 5830, 5837, 4386, 5842, 2348, 8, 5849, 5854, 5858, 5864, 5875, 5885, + 5894, 5906, 5911, 5915, 5923, 5937, 5941, 5944, 5952, 5959, 5967, 5971, + 5982, 5986, 5993, 5998, 6002, 6005, 6011, 6017, 6024, 6034, 6043, 6050, + 4445, 4452, 4458, 4463, 4467, 6056, 6059, 6074, 6090, 6105, 800, 395, + 6110, 6118, 6125, 6131, 6136, 4476, 6138, 6142, 6152, 6156, 6165, 6169, + 6172, 6179, 6183, 6186, 6194, 6201, 6205, 6209, 6215, 6219, 6223, 6227, + 6233, 6237, 6244, 6248, 6253, 6261, 6267, 6277, 6282, 3005, 6290, 6295, + 6299, 6303, 6306, 6314, 6321, 6325, 6330, 6334, 6345, 6351, 6358, 4485, + 6363, 1677, 161, 6367, 6372, 6377, 6381, 6385, 6389, 6394, 6398, 6403, + 6407, 6411, 6415, 6420, 6430, 6436, 6440, 6444, 6451, 6459, 6468, 6479, + 6486, 6493, 6502, 6511, 6520, 6529, 6538, 6547, 6557, 6567, 6577, 6587, + 6597, 6606, 6616, 6626, 6636, 6646, 6656, 6666, 6676, 6685, 6695, 6705, + 6715, 6725, 6735, 6745, 6754, 6764, 6774, 6784, 6794, 6804, 6814, 6824, + 6834, 6844, 6853, 6863, 6873, 6883, 6893, 6903, 6913, 6923, 6933, 6943, + 6953, 6962, 6968, 6971, 6976, 6983, 6989, 6994, 6998, 7003, 7007, 7013, + 7017, 7022, 7031, 4490, 7036, 4495, 7039, 7043, 7047, 7057, 7062, 7071, + 7079, 7086, 7091, 7095, 7106, 7116, 7125, 7133, 7144, 7156, 7160, 7165, + 7170, 7174, 7179, 7183, 7186, 7196, 7205, 7209, 7215, 7220, 7229, 7234, + 7243, 7251, 7259, 7266, 7274, 7286, 7297, 7307, 7314, 7320, 7329, 7340, + 7349, 7357, 7364, 7373, 7381, 4392, 7385, 7387, 7392, 7398, 7406, 7413, + 7422, 7431, 7440, 7449, 7458, 7467, 7476, 7485, 7495, 7505, 7514, 7520, + 7534, 7541, 7549, 7558, 7564, 7573, 7581, 7589, 7596, 7609, 7615, 7624, + 7633, 7637, 7643, 7649, 7656, 4324, 7661, 7666, 7673, 7678, 7683, 7687, + 7693, 7701, 7709, 7716, 7724, 7732, 7737, 7743, 7748, 7752, 7763, 7771, + 7777, 7782, 7791, 7797, 7802, 7811, 2973, 7825, 7830, 7835, 7841, 7846, + 7851, 7855, 7860, 7865, 7870, 7874, 7879, 7884, 7889, 7893, 7898, 7903, + 7908, 7914, 7920, 7925, 7929, 7934, 7939, 7944, 7948, 7953, 7958, 7963, + 7975, 7985, 7996, 8007, 8018, 8030, 8041, 8052, 8063, 8074, 8079, 8083, + 8086, 8092, 8100, 8105, 8113, 8121, 8128, 8135, 8140, 8146, 8153, 8161, + 8173, 8178, 6068, 8184, 8193, 8200, 8206, 8214, 8221, 8227, 8236, 8243, + 8251, 8257, 8264, 8272, 2816, 942, 7875, 8277, 8283, 8287, 8299, 8304, + 8311, 8317, 8322, 7880, 7885, 8326, 8330, 8334, 8342, 8349, 8356, 8373, + 8377, 8380, 8388, 4397, 8392, 8394, 8402, 8412, 8418, 8423, 8427, 8433, + 8438, 8441, 8448, 8454, 8460, 8465, 8472, 8478, 8483, 8490, 8496, 8503, + 8509, 8515, 8521, 8527, 8532, 8539, 8544, 8548, 8553, 8560, 8565, 8571, + 8574, 8578, 8590, 8596, 8601, 8608, 8614, 8623, 8631, 8638, 8648, 8658, + 8666, 7899, 8669, 7904, 8677, 8689, 8702, 8717, 8728, 8746, 8757, 8770, + 8781, 8792, 8804, 8817, 8828, 8839, 8850, 2202, 8863, 8867, 8875, 8886, + 8893, 8899, 8903, 8909, 8912, 8922, 8930, 8937, 8945, 8950, 8955, 8959, + 8965, 8971, 8976, 7909, 7915, 7921, 8981, 8989, 8998, 9005, 4402, 9009, + 9014, 9019, 9025, 9030, 9035, 9039, 9045, 9050, 9056, 9061, 9066, 9072, + 9077, 9082, 9087, 9093, 9098, 9103, 9109, 9115, 9120, 9127, 9131, 9139, + 9144, 9149, 9159, 9164, 9171, 9177, 9187, 9201, 9215, 9229, 9243, 9258, + 9273, 9290, 9308, 9321, 9327, 9332, 9337, 9343, 9348, 9353, 9357, 9361, + 9366, 9370, 9375, 9379, 9385, 9390, 9396, 9401, 9406, 9410, 9415, 9420, + 9426, 9431, 9437, 9442, 9448, 9453, 9459, 9464, 9470, 9477, 9483, 9488, + 9493, 4523, 9502, 9508, 9513, 9523, 9528, 9534, 9539, 9547, 9554, 9559, + 9565, 9574, 9585, 9592, 9600, 9606, 9613, 9619, 9624, 9628, 4528, 2362, + 9633, 9637, 9641, 7930, 9645, 9655, 9663, 9670, 9680, 9689, 7121, 7130, + 9694, 9700, 9707, 9714, 9720, 9730, 9740, 7935, 9749, 9755, 9761, 9769, + 9778, 9786, 9796, 9806, 9816, 9825, 9837, 9847, 9857, 9868, 9873, 9885, + 9897, 9909, 9921, 9933, 9945, 9957, 9969, 9981, 9993, 10004, 10016, + 10028, 10040, 10052, 10064, 10076, 10088, 10100, 10112, 10124, 10135, + 10147, 10159, 10171, 10183, 10195, 10207, 10219, 10231, 10243, 10255, + 10266, 10278, 10290, 10302, 10314, 10326, 10338, 10350, 10362, 10374, + 10386, 10397, 10409, 10421, 10433, 10445, 10457, 10469, 10481, 10493, + 10505, 10517, 10528, 10540, 10552, 10564, 10576, 10588, 10600, 10612, + 10624, 10636, 10648, 10659, 10671, 10683, 10695, 10707, 10719, 10731, + 10743, 10755, 10767, 10779, 10790, 10802, 10814, 10826, 10838, 10851, + 10864, 10877, 10890, 10903, 10916, 10929, 10941, 10954, 10967, 10980, + 10993, 11006, 11019, 11032, 11045, 11058, 11071, 11083, 11096, 11109, + 11122, 11135, 11148, 11161, 11174, 11187, 11200, 11213, 11225, 11238, + 11251, 11264, 11277, 11290, 11303, 11316, 11329, 11342, 11355, 11367, + 11380, 11393, 11406, 11419, 11432, 11445, 11458, 11471, 11484, 11497, + 11509, 11522, 11535, 11548, 11561, 11574, 11587, 11600, 11613, 11626, + 11639, 11651, 11662, 11675, 11688, 11701, 11714, 11727, 11740, 11753, + 11766, 11779, 11792, 11804, 11817, 11830, 11843, 11856, 11869, 11882, + 11895, 11908, 11921, 11934, 11946, 11959, 11972, 11985, 11998, 12011, + 12024, 12037, 12050, 12063, 12076, 12088, 12101, 12114, 12127, 12140, + 12153, 12166, 12179, 12192, 12205, 12218, 12230, 12243, 12256, 12269, + 12282, 12295, 12308, 12321, 12334, 12347, 12360, 12372, 12385, 12398, + 12411, 12424, 12437, 12450, 12463, 12476, 12489, 12502, 12514, 12527, + 12540, 12553, 12566, 12579, 12592, 12605, 12618, 12631, 12644, 12656, + 12669, 12682, 12695, 12708, 12721, 12734, 12747, 12760, 12773, 12786, + 12798, 12811, 12824, 12837, 12850, 12863, 12876, 12889, 12902, 12915, + 12928, 12940, 12953, 12966, 12979, 12992, 13005, 13018, 13031, 13044, + 13057, 13070, 13082, 13093, 13101, 13108, 13114, 13118, 13124, 13130, + 13138, 13144, 13149, 4407, 13153, 13160, 13168, 13175, 13182, 5563, + 13189, 13198, 13203, 3662, 13210, 13215, 13220, 13228, 13235, 13242, + 13248, 13257, 13266, 13272, 13277, 13285, 13291, 13301, 13310, 13314, + 13321, 13325, 13330, 13336, 13344, 13348, 7949, 13357, 13363, 4294, + 13370, 4758, 13374, 13382, 13389, 13398, 13405, 13411, 13415, 13421, + 13427, 13435, 13441, 13448, 13454, 13462, 13467, 13478, 13483, 13488, + 13493, 13500, 13505, 13513, 13525, 13531, 13537, 13542, 13546, 13549, + 13560, 13565, 4550, 13572, 4418, 13577, 13581, 98, 13589, 13593, 13597, + 13601, 13606, 13610, 13614, 6499, 13618, 13624, 13629, 13633, 13637, + 13645, 13649, 13654, 13659, 13663, 13669, 13674, 13678, 13683, 13688, + 13692, 13699, 13703, 13716, 13721, 13730, 13735, 13738, 2235, 2240, + 13742, 13748, 13753, 13758, 13763, 13769, 13774, 13779, 13783, 13788, + 13793, 13799, 13804, 13809, 13815, 13820, 13824, 13829, 13834, 13839, + 13843, 13848, 13853, 13858, 13863, 13867, 13871, 13876, 2371, 13825, + 13880, 13887, 4837, 13899, 13830, 13835, 13906, 13911, 13916, 13921, + 13925, 13930, 13934, 13940, 13945, 4316, 1682, 1687, 13949, 13955, 13960, + 13964, 13968, 13972, 13975, 13981, 13988, 13996, 14002, 14008, 14013, + 14018, 14022, 8644, 14027, 14039, 14042, 14049, 14053, 14064, 14073, + 14086, 14096, 14110, 14122, 14136, 14154, 14173, 14186, 14200, 14216, + 14227, 14244, 14262, 14274, 14288, 14302, 14314, 14331, 14350, 14362, + 14380, 14393, 14407, 14427, 5312, 14439, 14444, 14449, 14454, 2017, + 14458, 14464, 14468, 14471, 14475, 14483, 14489, 13844, 14493, 14504, + 14510, 14516, 14525, 14532, 14539, 14545, 14554, 14562, 14572, 14577, + 14586, 14595, 14606, 14617, 14627, 14632, 14636, 14646, 14657, 14665, + 14672, 13854, 14678, 14687, 14692, 14701, 14709, 14719, 14728, 13859, + 13864, 14732, 14742, 973, 8117, 14751, 14760, 14768, 14779, 14790, 14800, + 14809, 14818, 14827, 14833, 14842, 14850, 4535, 14856, 14859, 14863, + 14868, 14873, 13872, 14881, 14887, 14891, 14897, 14903, 2795, 14911, + 14916, 14920, 14924, 14932, 14938, 14943, 14947, 14952, 14958, 14969, + 14974, 14978, 14989, 14993, 14997, 15000, 15005, 15009, 15013, 1442, 892, + 15017, 5, 15023, 15027, 15031, 15035, 15040, 15044, 15048, 15052, 15056, + 15061, 15065, 15070, 15074, 15077, 15081, 15086, 15090, 15095, 15099, + 15103, 15107, 15112, 15116, 15120, 15130, 15135, 15139, 15143, 15148, + 15153, 15162, 15167, 15172, 15176, 15180, 15192, 15198, 15202, 15212, + 15221, 15229, 15235, 15239, 15246, 15256, 15265, 15273, 15281, 15288, + 15297, 15306, 15314, 15319, 15323, 15327, 15330, 15332, 15336, 15340, + 15345, 15349, 15353, 15356, 15360, 15363, 15367, 15370, 15374, 15378, + 15382, 15386, 15391, 15396, 15401, 15405, 15408, 15413, 15419, 15424, + 15430, 15435, 15439, 15443, 15447, 15452, 15456, 15461, 15465, 15472, + 15476, 15479, 15483, 15489, 15495, 15499, 15503, 15508, 15515, 15521, + 15525, 15534, 15538, 15542, 15545, 15551, 15556, 15562, 15567, 1730, + 2383, 15571, 15572, 15576, 15580, 15585, 15589, 15593, 15596, 15601, + 15605, 15610, 15614, 15619, 15623, 8136, 15628, 15631, 15634, 15638, + 15642, 15649, 15654, 15661, 15665, 15669, 15674, 15679, 15683, 15695, + 15706, 15710, 15713, 15719, 3718, 1939, 15723, 15739, 4613, 15759, 15768, + 15784, 15788, 15791, 15797, 15807, 15813, 15828, 15840, 15851, 15859, + 15868, 15874, 15883, 15893, 15904, 15915, 15924, 15933, 15941, 15948, + 15956, 15962, 15967, 15973, 15978, 15986, 15998, 16010, 16024, 16031, + 16040, 16048, 16056, 16064, 16071, 16080, 16088, 16098, 16107, 16117, + 16126, 16135, 16143, 16148, 16152, 16155, 16159, 16163, 16169, 8174, + 16174, 16186, 16192, 4947, 16203, 16213, 16222, 16226, 16229, 16233, + 16239, 16243, 16248, 16255, 3742, 16262, 16270, 16277, 16283, 16288, + 16294, 16300, 16308, 16312, 16315, 16317, 16156, 16326, 16332, 16342, + 16347, 16351, 16356, 16365, 16374, 16380, 16387, 16392, 16396, 16406, + 16410, 16415, 16425, 16434, 16438, 16445, 16452, 16456, 7026, 16464, + 16471, 16478, 13665, 16085, 16483, 16487, 16492, 16505, 16519, 16535, + 16553, 16570, 16588, 14233, 16605, 16617, 16631, 8733, 14250, 16643, + 16655, 8001, 16669, 16674, 16679, 16685, 16689, 16694, 16704, 16710, + 5248, 16716, 16718, 16723, 16731, 16735, 16741, 16745, 16752, 16757, + 16761, 16764, 16770, 16778, 16788, 8762, 16802, 16809, 16813, 16816, + 16821, 16825, 16835, 16840, 16845, 16850, 8767, 16854, 16857, 16873, + 16881, 16889, 16897, 16902, 16906, 16912, 16915, 16921, 16933, 16940, + 16954, 16967, 16976, 16988, 16999, 17008, 17017, 17025, 17036, 1091, + 17043, 17049, 17059, 17065, 17070, 17077, 17089, 17096, 17105, 17113, + 17119, 17125, 17130, 17134, 17137, 17143, 17148, 17152, 17161, 17169, + 17174, 17180, 8506, 4059, 17185, 17188, 17194, 17202, 17206, 17211, + 17214, 17223, 17231, 17242, 17246, 17252, 17258, 17262, 17268, 17290, + 17314, 17321, 17327, 17338, 17356, 17363, 17367, 17376, 17389, 17401, + 17412, 17422, 17436, 17445, 17453, 17465, 4630, 17476, 17487, 17499, + 17509, 17518, 17523, 17527, 17532, 2216, 17536, 17545, 17552, 17561, + 17569, 17580, 17595, 17602, 17612, 17621, 7628, 17627, 17632, 17640, + 17646, 17655, 17660, 17670, 15342, 17674, 523, 17676, 17685, 16095, + 17692, 17696, 17702, 1307, 285, 17707, 17716, 17725, 17733, 17744, 17753, + 17761, 17765, 17768, 17776, 17784, 8149, 17789, 17795, 3263, 17800, + 17804, 17810, 17817, 1452, 17823, 4698, 17830, 17840, 17848, 17854, + 17863, 17871, 17879, 17886, 1482, 17893, 17899, 17910, 17921, 17928, + 17937, 17945, 17952, 17959, 17972, 17983, 18002, 1178, 18006, 18011, + 18019, 18023, 18028, 1456, 18038, 18042, 18047, 18051, 2777, 18057, + 18065, 1086, 1127, 213, 18073, 18081, 18089, 18096, 18102, 18109, 18112, + 18118, 16244, 18124, 18128, 18132, 18138, 1950, 18142, 18146, 18149, + 18152, 18159, 18165, 13918, 2860, 9359, 18170, 18178, 18181, 18193, + 18198, 18202, 18210, 18217, 18223, 18230, 18237, 18241, 18245, 1460, + 18255, 2266, 2070, 18260, 18265, 18269, 18274, 18279, 18285, 18290, + 18295, 18299, 18304, 18310, 18315, 18320, 18326, 18331, 18335, 18340, + 18345, 18350, 18355, 18360, 18366, 18372, 18377, 18381, 18386, 18390, + 18395, 18400, 18405, 18409, 18414, 18419, 18424, 18429, 18435, 18441, + 18446, 18450, 18455, 18460, 18465, 18470, 18474, 18479, 18484, 18488, + 18493, 18499, 18505, 18511, 18516, 18520, 18523, 18528, 18532, 18537, + 18541, 18544, 18549, 13401, 18554, 18558, 18563, 18567, 18570, 18573, + 18577, 18582, 18586, 18591, 18595, 18599, 18604, 18609, 18613, 18620, + 18627, 18631, 18634, 18640, 18649, 18656, 18661, 18665, 18671, 9474, + 8962, 18677, 18682, 18687, 18693, 18698, 18703, 18707, 18712, 18717, + 18723, 18728, 18733, 18737, 18742, 18747, 18751, 18756, 18761, 18766, + 18770, 18775, 18780, 18785, 18789, 18793, 18797, 18806, 18812, 18818, + 18827, 18835, 18840, 18844, 18851, 18857, 18861, 18866, 18875, 18880, + 1481, 18886, 18889, 18893, 13950, 18899, 18903, 18914, 18925, 18937, + 18944, 18951, 18956, 18960, 13127, 18968, 13400, 18970, 18974, 18979, + 18985, 18990, 18996, 19001, 19007, 19012, 2320, 19016, 19019, 19024, + 19029, 19035, 19040, 19045, 19049, 19054, 19060, 19065, 19070, 19076, + 19081, 19085, 19090, 19095, 19100, 19104, 19109, 19114, 19119, 19125, + 19131, 19137, 19142, 19146, 19150, 19153, 3783, 19157, 19164, 3792, + 19168, 19175, 19181, 19190, 19198, 19202, 19211, 19219, 19223, 19229, + 19239, 19244, 19257, 19271, 19282, 19294, 19308, 19321, 19333, 8012, + 19345, 19350, 19355, 19359, 19363, 1719, 16997, 19367, 19370, 19376, + 19382, 8673, 19387, 19392, 19397, 18980, 19402, 19408, 18986, 19413, + 19416, 18991, 19421, 19427, 19433, 18997, 19438, 19442, 19447, 19452, + 19460, 19464, 19469, 19474, 19478, 19483, 19488, 19002, 19008, 19494, + 2112, 316, 19497, 19500, 19504, 19508, 19516, 19520, 19523, 19529, 19537, + 19541, 19545, 19548, 19555, 19559, 19566, 19574, 19582, 19589, 19593, + 764, 19605, 19610, 19615, 19621, 19626, 19631, 19635, 19640, 19645, + 14035, 19650, 19655, 19660, 19665, 19671, 19676, 19680, 19685, 19690, + 19694, 19699, 19704, 19709, 19713, 19718, 19723, 19729, 19734, 19739, + 19743, 19748, 19753, 19759, 19764, 19769, 19773, 19778, 19783, 19788, + 19792, 19797, 19802, 19807, 19813, 19819, 19824, 19828, 19833, 19838, + 19843, 19847, 19855, 19861, 19865, 19872, 9254, 19878, 19885, 19893, + 19900, 19906, 19912, 19916, 19920, 19550, 19924, 19935, 19940, 19945, + 19950, 19954, 13407, 19959, 19964, 19968, 19971, 19977, 19988, 20000, + 20005, 20009, 2321, 20012, 20018, 39, 20023, 20027, 20031, 20039, 20043, + 20047, 20050, 20055, 20059, 20064, 20068, 20073, 20077, 20082, 20086, + 20089, 20091, 20094, 20096, 20100, 20112, 20121, 20125, 20131, 20136, + 20141, 20145, 20152, 16093, 16103, 20156, 20161, 20166, 20171, 20175, + 20181, 20190, 20198, 20213, 20227, 20235, 20244, 20249, 20259, 20264, + 20268, 13395, 20273, 20275, 20278, 20282, 20286, 20291, 20297, 20302, + 20311, 20317, 20322, 20329, 20333, 20340, 20353, 20361, 20365, 20375, + 20380, 20384, 20388, 20394, 20399, 20409, 20420, 20428, 20439, 20443, + 20451, 20457, 20465, 20472, 20478, 2030, 20482, 20484, 20489, 20494, + 20497, 20499, 20502, 20506, 20510, 20516, 20526, 20531, 20537, 20541, + 20546, 20559, 16337, 20565, 20574, 9790, 20581, 20586, 20590, 20598, + 20605, 20610, 20614, 20618, 20626, 20632, 20638, 20643, 20647, 20650, + 20655, 14320, 20671, 20683, 20695, 14337, 20709, 20721, 8786, 20735, + 20740, 20745, 20749, 20756, 20762, 20765, 20770, 20773, 20775, 20779, + 20782, 20787, 20792, 20798, 20803, 20808, 20814, 20820, 20825, 20829, + 20834, 20839, 20844, 20848, 20851, 20857, 20862, 20867, 20872, 20876, + 20881, 20886, 20891, 20895, 20898, 20904, 20908, 20916, 20923, 20931, + 20941, 20947, 20953, 20957, 20966, 20971, 20976, 20981, 20988, 20994, + 20999, 21007, 21011, 21014, 21025, 21032, 21038, 21042, 21045, 21051, + 21057, 21065, 18097, 21072, 21080, 21085, 21091, 21096, 21100, 21107, + 21113, 21122, 21125, 21130, 21138, 21146, 4726, 3278, 21153, 21157, + 21161, 21164, 21166, 21174, 21178, 21185, 21189, 21196, 21206, 21210, + 21214, 21222, 21228, 21237, 21244, 21252, 21260, 21268, 21275, 21282, + 21289, 21296, 21303, 21308, 21314, 21331, 21339, 21347, 786, 21354, + 21360, 20240, 21366, 21374, 21380, 21386, 21395, 2855, 13927, 21401, + 21408, 21413, 21417, 21424, 21432, 21441, 21451, 21457, 21465, 21474, + 21482, 21489, 21492, 21498, 21507, 21518, 21524, 21530, 21535, 21541, + 21546, 321, 21550, 21552, 21556, 21560, 21564, 21569, 21573, 4666, 3459, + 21577, 21580, 21585, 21589, 21594, 21598, 21602, 21607, 5151, 21611, + 21615, 21619, 8479, 21624, 21628, 21633, 21638, 21643, 21647, 21653, + 5155, 18196, 21658, 21666, 21673, 21677, 284, 21682, 21688, 21694, 21698, + 21707, 21711, 21716, 21721, 21725, 21731, 21736, 21751, 21766, 21781, + 21797, 21815, 21829, 21834, 21839, 21843, 20346, 21851, 21855, 21864, + 21872, 5159, 8281, 21876, 21879, 21882, 3871, 2990, 21887, 21895, 21899, + 21902, 21906, 21911, 21917, 21922, 21926, 21930, 21936, 21940, 21947, + 21951, 21956, 21962, 21969, 21976, 21983, 17720, 3820, 21990, 21997, + 22008, 22014, 22018, 22028, 22034, 22039, 22044, 22049, 22054, 22058, + 22062, 22068, 1942, 5167, 22077, 5172, 22082, 5177, 5182, 5188, 22087, + 22097, 22101, 5193, 22106, 22109, 22114, 22118, 22123, 22130, 22136, + 22146, 22155, 22159, 22163, 22167, 22177, 22183, 22189, 22192, 22199, + 22205, 22210, 22217, 22224, 22228, 22238, 22251, 22260, 22269, 22280, + 22293, 22298, 5198, 22303, 22311, 22316, 3487, 21, 22323, 22328, 22331, + 22334, 22338, 22346, 22350, 22353, 22359, 22365, 22373, 22380, 22384, + 22388, 22392, 22401, 22407, 22412, 22416, 22424, 22430, 22435, 22440, + 22444, 22450, 22456, 3090, 22463, 8407, 22475, 22481, 22485, 22490, + 22494, 22499, 22509, 22515, 22528, 22533, 22539, 22544, 1469, 22548, + 22554, 14, 22562, 22569, 22573, 22577, 22585, 22589, 22594, 22598, 22605, + 22610, 22614, 22619, 22625, 22630, 22636, 22641, 22645, 22649, 22653, + 22658, 22662, 22667, 22671, 22676, 22680, 22685, 22689, 22694, 22698, + 8540, 8545, 22703, 22707, 22710, 22714, 22719, 22723, 22729, 22734, + 22744, 22749, 22757, 22761, 22765, 22770, 22775, 22779, 3884, 22790, + 22792, 22795, 22800, 22804, 22813, 22829, 22845, 22855, 22862, 22866, + 22870, 16864, 22874, 22879, 22883, 22890, 22898, 22904, 22911, 22917, + 22921, 22927, 22935, 22939, 22948, 4647, 22956, 22960, 22968, 22975, + 22980, 22984, 22989, 16480, 22993, 22995, 23002, 23008, 23013, 23016, + 23018, 23025, 23032, 23038, 23041, 23045, 23049, 23053, 23058, 23062, + 23066, 23069, 23073, 14368, 23092, 5325, 23105, 23111, 23115, 23119, + 23129, 23141, 23152, 23157, 23164, 23168, 23171, 8870, 23179, 23183, + 23187, 23192, 23197, 23201, 6427, 23206, 23210, 23216, 21447, 23222, + 23227, 23234, 23238, 8809, 23241, 23248, 794, 23252, 23257, 23262, 23267, + 23271, 23276, 23282, 23287, 23293, 23298, 23308, 23313, 23318, 13726, + 20991, 23323, 23326, 23333, 23342, 23346, 23349, 23353, 622, 23358, + 23362, 23372, 23381, 23388, 23394, 23398, 23408, 23414, 23420, 23425, + 23429, 23436, 23442, 23054, 651, 23449, 23454, 23457, 23463, 1415, 23471, + 23475, 23481, 23485, 23490, 23499, 23509, 23515, 23532, 23536, 23545, + 23553, 23559, 23564, 23572, 23580, 23599, 14413, 23613, 23629, 23643, + 23649, 23654, 23659, 23664, 23669, 23673, 23680, 260, 2407, 23687, 23692, + 23700, 23706, 23710, 23713, 23717, 23721, 23724, 23729, 23735, 23740, + 13387, 416, 34, 19020, 19025, 19030, 19036, 19041, 19046, 23744, 19050, + 23748, 19055, 19061, 23752, 19066, 19071, 23760, 23765, 19077, 23770, + 23775, 23780, 23786, 23792, 19082, 23805, 23811, 19086, 19091, 23815, + 19096, 18918, 23818, 1198, 23825, 23830, 19101, 23834, 23839, 23844, + 23849, 23853, 23858, 23863, 23869, 23874, 23879, 23885, 23891, 23896, + 23900, 23905, 23910, 23915, 23919, 23924, 23929, 23934, 23940, 23946, + 23952, 23957, 23961, 23966, 23970, 19105, 19110, 19115, 23974, 19120, + 19126, 19132, 19138, 23978, 16252, 23982, 23986, 23991, 23996, 24000, + 24010, 24015, 24019, 24023, 24026, 23962, 1476, 24031, 24039, 24048, + 24052, 24060, 24068, 24084, 24089, 1697, 24093, 24105, 24106, 24114, + 24121, 24126, 24133, 1082, 5220, 24136, 24141, 24144, 24153, 1326, 24158, + 24165, 24168, 24173, 5406, 24177, 24183, 1970, 24192, 24201, 20527, 5861, + 1331, 24211, 24219, 24226, 24231, 24235, 24239, 14884, 24247, 24256, + 24264, 24271, 24276, 24289, 24302, 24314, 24326, 24338, 24351, 24362, + 24373, 24381, 24389, 24401, 24413, 24424, 24433, 24441, 24448, 24460, + 24467, 24476, 24483, 24493, 24498, 24504, 24509, 24513, 24520, 24524, + 24531, 24539, 2111, 24546, 24557, 24567, 24576, 24584, 24594, 24602, + 24612, 24618, 24629, 24639, 24648, 24657, 24667, 24676, 1660, 38, 24681, + 24692, 24703, 24713, 24720, 24731, 24741, 24750, 24761, 20587, 24766, + 24775, 24780, 24790, 24793, 1796, 24801, 24807, 7593, 1336, 24812, 24825, + 24839, 2196, 24857, 24869, 2210, 24883, 24895, 24908, 24922, 24934, 2227, + 24948, 1342, 1348, 1354, 5371, 24953, 24958, 24973, 24988, 25003, 25018, + 25033, 25048, 25063, 25078, 25093, 25108, 25123, 25138, 25153, 25168, + 25183, 25198, 25213, 25228, 25243, 25258, 25273, 25288, 25303, 25318, + 25333, 25348, 25363, 25378, 25393, 25408, 25423, 25438, 25453, 25468, + 25483, 25498, 25513, 25528, 25543, 25558, 25573, 25588, 25603, 25618, + 25633, 25648, 25663, 25678, 25693, 25708, 25723, 25738, 25753, 25768, + 25783, 25798, 25813, 25828, 25843, 25858, 25873, 25888, 25903, 25918, + 25933, 25948, 25963, 25978, 25993, 26008, 26023, 26038, 26053, 26068, + 26083, 26098, 26113, 26128, 26143, 26158, 26173, 26188, 26203, 26218, + 26233, 26248, 26263, 26278, 26293, 26308, 26323, 26338, 26353, 26368, + 26383, 26398, 26413, 26428, 26443, 26458, 26473, 26488, 26503, 26518, + 26533, 26548, 26563, 26578, 26593, 26608, 26623, 26638, 26653, 26668, + 26683, 26698, 26713, 26728, 26743, 26758, 26773, 26788, 26803, 26818, + 26833, 26848, 26863, 26878, 26893, 26908, 26923, 26938, 26953, 26968, + 26983, 26998, 27013, 27028, 27043, 27058, 27073, 27088, 27103, 27118, + 27133, 27148, 27163, 27178, 27193, 27208, 27223, 27238, 27253, 27268, + 27283, 27298, 27313, 27328, 27343, 27358, 27373, 27388, 27403, 27418, + 27433, 27448, 27463, 27478, 27493, 27508, 27523, 27538, 27553, 27568, + 27583, 27598, 27613, 27628, 27643, 27658, 27673, 27688, 27703, 27718, + 27733, 27748, 27763, 27778, 27793, 27808, 27823, 27838, 27853, 27868, + 27883, 27898, 27913, 27928, 27943, 27958, 27973, 27988, 28003, 28018, + 28033, 28048, 28063, 28078, 28093, 28108, 28123, 28138, 28153, 28168, + 28183, 28198, 28213, 28228, 28243, 28258, 28273, 28288, 28303, 28318, + 28333, 28348, 28363, 28378, 28393, 28408, 28423, 28438, 28453, 28468, + 28483, 28498, 28513, 28528, 28543, 28558, 28573, 28588, 28603, 28618, + 28633, 28648, 28663, 28678, 28693, 28708, 28723, 28738, 28753, 28768, + 28783, 28798, 28813, 28828, 28843, 28858, 28873, 28888, 28903, 28918, + 28933, 28948, 28963, 28978, 28993, 29008, 29023, 29038, 29053, 29068, + 29083, 29098, 29113, 29128, 29143, 29158, 29173, 29188, 29203, 29218, + 29233, 29248, 29263, 29278, 29293, 29308, 29323, 29338, 29353, 29368, + 29383, 29398, 29413, 29428, 29443, 29458, 29473, 29488, 29503, 29518, + 29533, 29548, 29563, 29578, 29593, 29608, 29623, 29638, 29653, 29668, + 29683, 29698, 29713, 29728, 29743, 29758, 29773, 29788, 29803, 29818, + 29833, 29848, 29863, 29878, 29893, 29908, 29923, 29938, 29953, 29968, + 29983, 29998, 30013, 30028, 30043, 30058, 30073, 30088, 30103, 30118, + 30133, 30148, 30163, 30178, 30193, 30208, 30223, 30238, 30253, 30268, + 30283, 30298, 30313, 30328, 30343, 30358, 30373, 30388, 30403, 30418, + 30433, 30448, 30463, 30478, 30493, 30508, 30523, 30538, 30553, 30568, + 30583, 30598, 30613, 30628, 30643, 30658, 30673, 30688, 30703, 30718, + 30733, 30748, 30763, 30778, 30793, 30808, 30823, 30838, 30853, 30868, + 30883, 30898, 30913, 30928, 30943, 30958, 30973, 30988, 31003, 31018, + 31033, 31048, 31063, 31078, 31093, 31108, 31123, 31138, 31153, 31168, + 31183, 31198, 31213, 31228, 31243, 31258, 31273, 31288, 31303, 31318, + 31333, 31348, 31363, 31378, 31393, 31408, 31423, 31438, 31453, 31468, + 31483, 31498, 31513, 31528, 31543, 31558, 31573, 31588, 31603, 31618, + 31633, 31648, 31663, 31678, 31693, 31708, 31723, 31738, 31753, 31768, + 31783, 31798, 31813, 31828, 31843, 31858, 31873, 31888, 31903, 31918, + 31933, 31948, 31963, 31979, 31995, 32011, 32027, 32043, 32059, 32075, + 32091, 32107, 32123, 32139, 32155, 32171, 32187, 32203, 32219, 32235, + 32251, 32267, 32283, 32299, 32315, 32331, 32347, 32363, 32379, 32395, + 32411, 32427, 32443, 32459, 32475, 32491, 32507, 32523, 32539, 32555, + 32571, 32587, 32603, 32619, 32635, 32651, 32667, 32683, 32699, 32715, + 32731, 32747, 32763, 32779, 32795, 32811, 32827, 32843, 32859, 32875, + 32891, 32907, 32923, 32939, 32955, 32971, 32987, 33003, 33019, 33035, + 33051, 33067, 33083, 33099, 33115, 33131, 33147, 33163, 33179, 33195, + 33211, 33227, 33243, 33259, 33275, 33291, 33307, 33323, 33339, 33355, + 33371, 33387, 33403, 33419, 33435, 33451, 33467, 33483, 33499, 33515, + 33531, 33547, 33563, 33579, 33595, 33611, 33627, 33643, 33659, 33675, + 33691, 33707, 33723, 33739, 33755, 33771, 33787, 33803, 33819, 33835, + 33851, 33867, 33883, 33899, 33915, 33931, 33947, 33963, 33979, 33995, + 34011, 34027, 34043, 34059, 34075, 34091, 34107, 34123, 34139, 34155, + 34171, 34187, 34203, 34219, 34235, 34251, 34267, 34283, 34299, 34315, + 34331, 34347, 34363, 34379, 34395, 34411, 34427, 34443, 34459, 34475, + 34491, 34507, 34523, 34539, 34555, 34571, 34587, 34603, 34619, 34635, + 34651, 34667, 34683, 34699, 34715, 34731, 34747, 34763, 34779, 34795, + 34811, 34827, 34843, 34859, 34875, 34891, 34907, 34923, 34939, 34955, + 34971, 34987, 35003, 35019, 35035, 35051, 35067, 35083, 35099, 35115, + 35131, 35147, 35163, 35179, 35195, 35211, 35227, 35243, 35259, 35275, + 35291, 35307, 35323, 35339, 35355, 35371, 35387, 35403, 35419, 35435, + 35451, 35467, 35483, 35499, 35515, 35531, 35547, 35563, 35579, 35595, + 35611, 35627, 35643, 35659, 35675, 35691, 35707, 35723, 35739, 35755, + 35771, 35787, 35803, 35819, 35835, 35851, 35867, 35883, 35899, 35915, + 35931, 35947, 35963, 35979, 35995, 36011, 36027, 36043, 36059, 36075, + 36091, 36107, 36123, 36139, 36155, 36171, 36187, 36203, 36219, 36235, + 36251, 36267, 36283, 36299, 36315, 36331, 36347, 36363, 36379, 36395, + 36411, 36427, 36443, 36459, 36475, 36491, 36507, 36523, 36539, 36555, + 36571, 36587, 36603, 36619, 36635, 36651, 36667, 36683, 36699, 36715, + 36731, 36747, 36763, 36779, 36795, 36811, 36827, 36843, 36859, 36875, + 36891, 36907, 36923, 36939, 36955, 36971, 36987, 37003, 37019, 37035, + 37051, 37067, 37083, 37099, 37115, 37131, 37147, 37163, 37179, 37195, + 37211, 37227, 37243, 37259, 37275, 37291, 37307, 37323, 37339, 37355, + 37371, 37387, 37403, 37419, 37435, 37451, 37467, 37483, 37499, 37515, + 37531, 37547, 37563, 37579, 37595, 37611, 37627, 37643, 37659, 37675, + 37691, 37707, 37723, 37739, 37755, 37771, 37787, 37803, 37819, 37835, + 37851, 37867, 37883, 37899, 37915, 37931, 37947, 37963, 37979, 37995, + 38011, 38027, 38043, 38059, 38075, 38091, 38107, 38123, 38139, 38155, + 38171, 38187, 38203, 38219, 38235, 38251, 38267, 38283, 38299, 38315, + 38331, 38347, 38363, 38379, 38395, 38411, 38427, 38443, 38459, 38475, + 38491, 38507, 38523, 38539, 38555, 38571, 38587, 38603, 38619, 38635, + 38651, 38667, 38683, 38699, 38715, 38731, 38747, 38763, 38779, 38795, + 38811, 38827, 38843, 38859, 38875, 38891, 38907, 38923, 38939, 38955, + 38971, 38987, 39003, 39019, 39035, 39051, 39067, 39083, 39099, 39115, + 39131, 39147, 39163, 39179, 39195, 39211, 39227, 39243, 39259, 39275, + 39291, 39307, 39323, 39339, 39355, 39371, 39387, 39403, 39419, 39435, + 39451, 39467, 39483, 39499, 39515, 39531, 39547, 39563, 39579, 39595, + 39611, 39627, 39643, 39659, 39675, 39691, 39707, 39723, 39739, 39755, + 39771, 39787, 39803, 39819, 39835, 39851, 39867, 39883, 39899, 39915, + 39931, 39947, 39963, 39979, 39995, 40011, 40027, 40043, 40059, 40075, + 40091, 40107, 40123, 40139, 40155, 40171, 40187, 40203, 40219, 40235, + 40251, 40267, 40283, 40299, 40315, 40331, 40347, 40363, 40379, 40395, + 40411, 40427, 40443, 40459, 40475, 40491, 40507, 40523, 40539, 40555, + 40571, 40587, 40603, 40619, 40635, 40650, 40659, 40665, 40671, 40681, + 40689, 8223, 40702, 40710, 40716, 40720, 2149, 40725, 40729, 40734, + 40741, 40749, 40753, 40758, 40763, 40767, 40772, 40776, 40780, 5383, + 40784, 40794, 40807, 40818, 40831, 40838, 40844, 40850, 40856, 40862, + 40867, 40872, 40877, 40882, 40886, 40891, 40896, 40901, 40907, 40913, + 40919, 40924, 40928, 40933, 40938, 40942, 40947, 40952, 40957, 40961, + 9046, 9057, 15414, 9062, 40965, 1528, 40971, 40974, 1559, 40980, 1565, + 1571, 5411, 40985, 40993, 41000, 41006, 41011, 41018, 1576, 41027, 41034, + 41039, 41043, 1580, 41046, 41052, 41062, 41066, 1585, 41071, 41074, 5519, + 41080, 41084, 41096, 41107, 1590, 41112, 41118, 41123, 5525, 17372, + 41127, 41138, 41148, 41155, 41161, 5536, 1595, 5541, 41165, 41170, 41176, + 41181, 41186, 41191, 41196, 41201, 41206, 41211, 41217, 41223, 41229, + 41234, 41238, 41243, 41248, 41252, 41257, 41262, 41267, 41271, 41276, + 41282, 41287, 41292, 41296, 41301, 41306, 41312, 41317, 41322, 41328, + 41334, 41339, 41343, 41348, 41353, 41358, 41362, 41367, 41372, 41377, + 41383, 41389, 41394, 41398, 41403, 41408, 41413, 41417, 41422, 41427, + 41433, 41438, 41443, 41447, 41452, 41457, 41463, 41468, 41473, 41479, + 41485, 41490, 41494, 41499, 41504, 41508, 41513, 41518, 41523, 41529, + 41535, 41540, 41544, 41549, 41554, 41558, 41563, 41568, 41573, 41577, + 41580, 19207, 41585, 21021, 5639, 41591, 5644, 41606, 41611, 41623, + 41635, 41647, 2258, 41659, 41664, 41668, 41674, 1607, 41680, 41685, + 41689, 41693, 41697, 41702, 41706, 9411, 41711, 1611, 41714, 1616, 41719, + 41726, 41731, 41740, 41750, 41757, 1621, 41764, 41768, 41773, 41780, + 41784, 41794, 9460, 4447, 4454, 1626, 41801, 41807, 41815, 41822, 41828, + 41834, 41839, 2894, 18822, 18831, 9494, 1631, 1635, 41847, 41858, 41863, + 1638, 41871, 41876, 41888, 41893, 1643, 41898, 41906, 41914, 41923, + 41931, 41940, 1648, 1653, 41944, 41951, 41959, 41965, 41970, 41979, + 41985, 41991, 41996, 42004, 42012, 42018, 2943, 23314, 42023, 42029, + 42034, 42042, 42049, 42054, 1664, 42058, 42061, 1115, 42067, 9, 42073, + 42077, 42082, 42086, 42090, 42094, 42099, 42103, 42108, 42113, 42117, + 42120, 42124, 42129, 42133, 42138, 42142, 20783, 20788, 20793, 42145, + 23145, 20799, 20804, 19371, 19377, 20815, 19383, 42155, 42158, 42163, + 42167, 42179, 8674, 42186, 42190, 42195, 42199, 7376, 42202, 42209, + 42222, 42231, 42241, 42254, 42266, 42273, 42278, 42283, 42289, 42294, + 42302, 17431, 461, 42308, 42314, 42320, 42325, 19388, 42329, 19393, + 42335, 42345, 42350, 42360, 42375, 42381, 19398, 42387, 42392, 42397, + 42402, 42406, 3356, 19414, 42410, 42416, 324, 42426, 42433, 42442, 42448, + 42456, 42460, 42464, 42468, 42476, 42480, 42486, 42492, 42497, 42501, + 19422, 42506, 19428, 19434, 42511, 18998, 9351, 42516, 42520, 42527, + 42533, 42537, 42543, 42547, 42551, 42556, 42561, 42565, 42568, 42573, + 42580, 42587, 42593, 42598, 42603, 42607, 42612, 42618, 42623, 42629, + 42634, 42639, 42644, 42650, 42655, 42660, 42666, 42672, 42678, 42683, + 42687, 42692, 42697, 42702, 42706, 42711, 42716, 42722, 42728, 42733, + 42737, 42742, 42747, 42752, 42757, 42761, 42766, 42771, 42776, 42781, + 19439, 19443, 42785, 42743, 42789, 42799, 42805, 42812, 5356, 19448, + 42818, 42831, 42840, 42846, 42855, 42861, 42868, 42875, 42753, 42885, + 42892, 42896, 3385, 42901, 42906, 42911, 42915, 42918, 42930, 42938, + 19465, 42942, 42952, 42961, 19470, 42966, 42975, 42981, 42989, 42993, + 19479, 42999, 43005, 43012, 43016, 43022, 43028, 43034, 602, 43039, + 43043, 43047, 43051, 43054, 43067, 43073, 19003, 3336, 317, 43079, 43083, + 43087, 43091, 43095, 43098, 43102, 43107, 43111, 43116, 43120, 43124, + 43128, 43133, 43137, 43142, 43146, 43150, 43157, 8365, 43166, 43175, + 15559, 43179, 43185, 43193, 43199, 43211, 43215, 43220, 43226, 43236, + 43246, 43252, 43256, 43261, 43267, 43276, 43285, 43293, 8584, 43297, + 43306, 43314, 43325, 43336, 43345, 43349, 43359, 43365, 43370, 43376, + 43381, 43392, 18906, 43396, 16420, 43402, 43409, 43415, 43419, 43429, + 43437, 43442, 43446, 43454, 43460, 43470, 919, 43473, 43476, 43480, + 43486, 43493, 43499, 43508, 43514, 43520, 43525, 43532, 43539, 43552, + 43561, 43566, 43570, 43577, 43584, 43591, 43598, 43605, 43610, 43613, + 43623, 43627, 43636, 43640, 43645, 43649, 43658, 43666, 43674, 43679, + 43683, 43688, 43693, 43697, 43703, 43715, 43723, 43733, 43740, 43746, + 43751, 43755, 43759, 43763, 43772, 43781, 43790, 43796, 43802, 43808, + 43813, 43820, 43826, 43834, 43841, 6490, 43847, 43853, 43857, 7794, + 43861, 43870, 43878, 43885, 43889, 43893, 43899, 43907, 43914, 43920, + 43931, 43935, 43939, 43943, 43946, 43951, 43955, 43959, 43968, 43976, + 43983, 14971, 23011, 43989, 43997, 44001, 44008, 44017, 44025, 44031, + 44036, 44040, 44045, 44049, 44054, 44063, 44067, 44074, 44081, 44089, + 44095, 44106, 44112, 44121, 44128, 44135, 44142, 44149, 44156, 25133, + 44163, 44168, 44174, 28210, 2469, 171, 22110, 44178, 43670, 44181, 44191, + 44198, 44207, 44217, 44227, 44235, 44239, 44242, 44249, 44255, 44266, + 44277, 44284, 1337, 1102, 44294, 2178, 44298, 1153, 22487, 44306, 44319, + 44323, 44328, 44333, 3969, 44339, 44347, 5907, 44352, 44358, 1676, 5684, + 623, 44367, 44376, 44386, 16898, 14628, 5968, 44395, 41853, 4508, 2717, + 7728, 44402, 44414, 44418, 44422, 5956, 3058, 4, 44427, 44437, 44443, + 44454, 44461, 44467, 44473, 44481, 44488, 44498, 44507, 44513, 2265, + 2271, 3966, 1898, 44517, 44526, 44537, 44548, 44556, 44562, 44567, 44575, + 44579, 44583, 20255, 44595, 44605, 44611, 44621, 44624, 44635, 44645, + 44654, 44661, 1155, 2171, 44671, 44676, 44684, 44695, 44709, 7680, 320, + 44719, 44728, 44734, 44741, 44747, 44754, 44762, 2950, 204, 44770, 44781, + 44785, 18156, 106, 44797, 44802, 44806, 44813, 44819, 44827, 44834, 4211, + 44841, 44850, 2994, 44858, 9461, 44862, 2287, 351, 44867, 28375, 44871, + 44879, 44885, 974, 44895, 8239, 44904, 44907, 2960, 14675, 44915, 14704, + 44919, 44926, 44932, 8253, 44937, 44949, 44957, 44965, 44969, 44973, + 44978, 44982, 44987, 44992, 44998, 45003, 45007, 45011, 45014, 45016, + 45020, 45023, 45028, 45032, 45036, 45040, 45044, 45053, 19606, 45056, + 19611, 19616, 45063, 19622, 19627, 45072, 45077, 45081, 45085, 19632, + 45088, 45092, 45095, 45100, 45104, 45110, 45123, 45129, 45133, 45140, + 45148, 45157, 45165, 19636, 45172, 45182, 45191, 45204, 45209, 45215, + 45222, 45233, 45245, 45252, 45261, 45270, 45279, 45286, 45292, 45299, + 45307, 45314, 45322, 45331, 45339, 45346, 45354, 45363, 45371, 45380, + 45390, 45399, 45407, 45414, 45422, 45431, 45439, 45448, 45458, 45467, + 45475, 45484, 45494, 45503, 45513, 45524, 45534, 45543, 45551, 45558, + 45566, 45575, 45583, 45592, 45602, 45611, 45619, 45628, 45638, 45647, + 45657, 45668, 45678, 45687, 45695, 45704, 45714, 45723, 45733, 45744, + 45754, 45763, 45773, 45784, 45794, 45805, 45817, 45828, 45838, 45847, + 45855, 45862, 45870, 45879, 45887, 45896, 45906, 45915, 45923, 45932, + 45942, 45951, 45961, 45972, 45982, 45991, 45999, 46008, 46018, 46027, + 46037, 46048, 46058, 46067, 46077, 46088, 46098, 46109, 46121, 46132, + 46142, 46151, 46159, 46168, 46178, 46187, 46197, 46208, 46218, 46227, + 46237, 46248, 46258, 46269, 46281, 46292, 46302, 46311, 46321, 46332, + 46342, 46353, 46365, 46376, 46386, 46397, 46409, 46420, 46432, 46445, + 46457, 46468, 46478, 46487, 46495, 46502, 46510, 46519, 46527, 46536, + 46546, 46555, 46563, 46572, 46582, 46591, 46601, 46612, 46622, 46631, + 46639, 46648, 46658, 46667, 46677, 46688, 46698, 46707, 46717, 46728, + 46738, 46749, 46761, 46772, 46782, 46791, 46799, 46808, 46818, 46827, + 46837, 46848, 46858, 46867, 46877, 46888, 46898, 46909, 46921, 46932, + 46942, 46951, 46961, 46972, 46982, 46993, 47005, 47016, 47026, 47037, + 47049, 47060, 47072, 47085, 47097, 47108, 47118, 47127, 47135, 47144, + 47154, 47163, 47173, 47184, 47194, 47203, 47213, 47224, 47234, 47245, + 47257, 47268, 47278, 47287, 47297, 47308, 47318, 47329, 47341, 47352, + 47362, 47373, 47385, 47396, 47408, 47421, 47433, 47444, 47454, 47463, + 47473, 47484, 47494, 47505, 47517, 47528, 47538, 47549, 47561, 47572, + 47584, 47597, 47609, 47620, 47630, 47641, 47653, 47664, 47676, 47689, + 47701, 47712, 47724, 47737, 47749, 47762, 47776, 47789, 47801, 47812, + 47822, 47831, 47839, 47846, 47851, 3829, 47858, 19646, 47863, 13211, + 47868, 47872, 47878, 47884, 47889, 47893, 47897, 47906, 47912, 47924, + 47935, 2519, 3804, 47939, 47942, 47944, 47948, 47952, 47956, 24954, + 47961, 47965, 47968, 47972, 47979, 47983, 19651, 47987, 47994, 48002, + 48013, 48021, 48029, 48036, 48043, 48049, 48060, 19656, 48065, 48076, + 48088, 48099, 48107, 48112, 48125, 48133, 9800, 48144, 48150, 48157, + 48165, 48171, 19661, 48176, 48183, 48191, 48204, 48217, 48230, 48243, + 48254, 48263, 48271, 48278, 48287, 48295, 48301, 48310, 48318, 48326, + 48330, 48339, 48348, 48358, 48371, 48384, 48394, 19666, 48400, 48407, + 48413, 19672, 48418, 48421, 48429, 48438, 24753, 48446, 48454, 48461, + 48469, 48479, 48488, 48497, 48506, 48514, 48525, 4541, 48534, 48538, + 48545, 48553, 48558, 48565, 48569, 48573, 48581, 48589, 19681, 48595, + 48601, 48613, 48618, 48629, 48639, 48649, 48661, 48667, 48677, 19686, + 48686, 48695, 48701, 48713, 48724, 48730, 48735, 48742, 48754, 48764, + 48773, 48780, 20474, 14860, 48786, 48791, 48795, 48799, 48804, 48810, + 48821, 48834, 48839, 48844, 48848, 48860, 48869, 48882, 48889, 48898, + 48906, 48911, 48917, 991, 48922, 48927, 48932, 48937, 48943, 48948, + 48953, 48959, 48965, 48970, 48974, 48979, 48984, 48989, 41023, 48994, + 48999, 49004, 49009, 49015, 49021, 49026, 49030, 49035, 49040, 49045, + 49050, 49055, 49059, 49065, 49074, 49079, 49084, 49089, 49094, 49098, + 49105, 49111, 9609, 28675, 49116, 49066, 49118, 19695, 49121, 49130, + 49136, 3397, 19700, 49140, 49146, 49152, 49157, 49161, 49168, 49173, + 49183, 49192, 49196, 49202, 49210, 49217, 49225, 49233, 19705, 49240, + 49243, 49250, 49256, 49261, 49265, 49274, 49282, 49288, 49293, 49300, + 49306, 49311, 49317, 49324, 19456, 17171, 49330, 49335, 49347, 49099, + 49106, 49357, 49362, 49369, 49376, 49382, 49387, 49395, 49399, 49403, + 49406, 49412, 42472, 3417, 703, 102, 49419, 49423, 49427, 49432, 49440, + 49444, 49452, 49456, 49469, 49473, 49476, 49481, 49485, 49490, 49494, + 49502, 49506, 13216, 49511, 49515, 49519, 49522, 49530, 49535, 49542, + 49548, 49554, 49559, 44311, 49566, 49571, 49576, 49580, 49584, 49589, + 49594, 49598, 49601, 49607, 49611, 49614, 49627, 49635, 49643, 49653, + 49666, 49673, 49684, 49690, 49695, 49700, 49706, 49715, 48850, 49723, + 49729, 49737, 49741, 49745, 49751, 49763, 49775, 49779, 49790, 49798, + 49805, 49817, 49825, 49833, 49840, 49846, 49856, 49865, 49870, 49880, + 49884, 49888, 49895, 49907, 49919, 49928, 48115, 49935, 49946, 49960, + 49968, 49978, 49985, 49993, 50002, 50010, 50020, 50031, 50043, 50052, + 50059, 50068, 50083, 50092, 50105, 50120, 50132, 50143, 50154, 50165, + 50175, 50186, 50194, 50200, 50210, 50216, 50221, 50227, 50233, 4812, + 9820, 50239, 50244, 50251, 50257, 50262, 50266, 50269, 50272, 50274, + 50281, 50292, 50296, 50302, 50310, 44637, 44647, 50316, 50326, 50333, + 50339, 50344, 50353, 50360, 50368, 50377, 50383, 50389, 50396, 50403, + 50408, 50412, 50417, 50422, 50427, 50431, 49464, 50440, 50444, 50455, + 9829, 50466, 50473, 17092, 50477, 50481, 50486, 8057, 50498, 50503, + 50508, 50513, 50517, 50520, 50525, 50530, 50536, 50541, 3237, 13267, + 50546, 50551, 50557, 50564, 50569, 50574, 50580, 50586, 50592, 50597, + 50603, 50607, 50615, 50623, 50629, 50634, 50641, 50646, 50651, 50659, + 50664, 50670, 50675, 50680, 50684, 50687, 50705, 50724, 50737, 50751, + 50767, 50774, 50780, 50787, 50792, 50798, 50814, 8855, 50828, 50835, + 50839, 50842, 50847, 50854, 50859, 50864, 50869, 6126, 50873, 50878, + 50884, 50889, 50893, 50896, 50901, 50911, 50920, 50925, 50933, 50940, + 50950, 50955, 50960, 50967, 50973, 50978, 50985, 50994, 51002, 51008, + 51014, 51018, 9504, 2493, 51023, 51027, 51031, 51052, 51074, 51090, + 51107, 51126, 51136, 51143, 51150, 17039, 51156, 51160, 51168, 51174, + 51182, 51186, 51194, 51201, 51205, 2819, 25150, 51211, 51215, 51219, + 51223, 51228, 51233, 51238, 51244, 51249, 51255, 51260, 51265, 51269, + 51274, 25165, 51278, 51283, 51291, 51295, 51300, 51307, 51316, 51322, + 51329, 51333, 51342, 51347, 51355, 51361, 51366, 51372, 51377, 51381, + 51391, 51396, 23329, 51404, 51416, 51420, 51432, 51438, 51445, 51457, + 51464, 51470, 13311, 51474, 51480, 51485, 3477, 51490, 51498, 51507, + 51511, 51270, 18546, 51516, 5726, 70, 51528, 51533, 19714, 19719, 19724, + 19730, 19735, 51537, 19740, 51559, 51561, 51565, 51569, 51574, 51578, + 19744, 51582, 19749, 51590, 51593, 19754, 19760, 19765, 51602, 51607, + 16112, 16122, 51612, 51616, 51621, 51630, 51637, 51643, 51648, 51653, + 51658, 51666, 19770, 885, 51673, 51679, 51684, 51689, 51694, 51700, + 51705, 51712, 51718, 51726, 51732, 9851, 51739, 51745, 51750, 51756, + 51769, 51778, 51785, 51791, 51799, 51806, 51812, 19774, 51815, 51822, + 51828, 51832, 51835, 51843, 51857, 51864, 19779, 51870, 19784, 51877, + 51882, 51886, 51891, 51896, 51901, 19789, 42894, 51905, 51910, 51916, + 51922, 51928, 51933, 51938, 51947, 51959, 51974, 51980, 9301, 19793, + 51984, 51991, 19798, 51997, 52006, 52013, 52022, 52027, 52033, 19803, + 52038, 52047, 52054, 52060, 52066, 52074, 52078, 19808, 52081, 19814, + 19820, 52086, 52094, 52104, 19825, 52108, 52112, 52118, 52122, 52129, + 52133, 52142, 52150, 52157, 52162, 52167, 52171, 52175, 52178, 52184, + 52192, 52198, 52202, 52207, 52214, 52219, 52223, 52226, 52231, 52235, + 52240, 52245, 52249, 52257, 16131, 16140, 52263, 52269, 52274, 52278, + 52281, 52291, 52296, 52302, 52308, 52313, 52317, 52321, 52329, 52334, + 52339, 40736, 25375, 52345, 52350, 52354, 52359, 52364, 52369, 52373, + 52378, 52383, 52389, 52394, 52399, 52405, 52411, 52416, 52420, 52425, + 52430, 52435, 52439, 52444, 52449, 52454, 52460, 52466, 52472, 52477, + 52481, 52486, 52491, 52495, 52500, 52505, 52510, 52514, 19829, 52522, + 52530, 13936, 52541, 52547, 52554, 52559, 52563, 52568, 52576, 52584, + 52591, 44408, 52597, 52605, 52612, 52623, 19839, 52626, 52633, 4337, + 52637, 52644, 52651, 52657, 52671, 52679, 52686, 52691, 52696, 52699, + 52706, 52716, 52726, 52735, 52746, 52751, 52759, 19844, 52763, 52768, + 52773, 52778, 52783, 52788, 52793, 52797, 52802, 52807, 52812, 52817, + 52822, 52827, 52831, 52836, 52841, 52845, 52849, 52853, 52857, 52862, + 52867, 52871, 52876, 52880, 52884, 52889, 52894, 52899, 52904, 52908, + 52913, 52918, 52922, 52927, 52932, 52937, 52942, 52947, 52952, 52957, + 52962, 52967, 52972, 52977, 52982, 52987, 52992, 52997, 53002, 53007, + 53012, 53017, 53022, 53026, 53031, 53036, 53041, 53046, 53051, 53056, + 53061, 53066, 53071, 53076, 53081, 53085, 53090, 53094, 53099, 53104, + 53109, 53114, 53119, 53124, 53129, 53134, 53139, 53143, 53147, 53152, + 53157, 53161, 53166, 53171, 53175, 53180, 53185, 53190, 53195, 53199, + 53204, 53209, 53213, 53218, 53222, 53226, 53230, 53234, 53239, 53243, + 53247, 53251, 53255, 53259, 53263, 53267, 53271, 53275, 53280, 53285, + 53290, 53295, 53300, 53305, 53310, 53315, 53320, 53325, 53329, 53333, + 53337, 53341, 53345, 53349, 53354, 53358, 53363, 53367, 53372, 53377, + 53381, 53385, 53390, 53394, 53398, 53402, 53406, 53410, 53414, 53418, + 53422, 53426, 53430, 53434, 53438, 53442, 53446, 53451, 53456, 53460, + 53464, 53468, 53472, 53476, 53480, 53485, 53489, 53493, 53497, 53501, + 53505, 53509, 53514, 53518, 53523, 53527, 53531, 53535, 53539, 53543, + 53547, 53551, 53555, 53559, 53563, 53567, 53572, 53576, 53580, 53584, + 53588, 53592, 53596, 53600, 53604, 53608, 53612, 53616, 53621, 53625, + 53629, 53634, 53639, 53643, 53647, 53651, 53655, 53659, 53663, 53667, + 53671, 53675, 53679, 53683, 53687, 53691, 53695, 53699, 53703, 53707, + 1703, 53711, 53715, 2317, 53719, 1416, 53724, 1382, 53728, 53732, 53739, + 53753, 53762, 53770, 53777, 53790, 53803, 53814, 53819, 53826, 53838, + 3046, 6184, 53842, 53847, 53856, 53866, 53871, 53875, 53880, 1387, 8103, + 53890, 53904, 53916, 53925, 53934, 53943, 53951, 53962, 3085, 2361, + 53972, 53979, 2366, 19476, 53988, 53995, 54001, 54008, 54014, 54021, + 54031, 54040, 54051, 54058, 54064, 54074, 54082, 54088, 54103, 54109, + 54114, 54121, 54124, 54130, 54137, 54146, 54154, 54160, 54169, 24755, + 54183, 54188, 8131, 54194, 54203, 54211, 54218, 54222, 54226, 54229, + 54236, 54244, 54252, 8068, 54261, 54273, 54282, 54292, 2382, 54301, + 54307, 54320, 54332, 54342, 54351, 54363, 54371, 54380, 54391, 54402, + 54412, 54422, 54431, 54439, 5889, 54446, 54450, 54455, 54461, 1392, + 54468, 54479, 54488, 54496, 54505, 54521, 54532, 54548, 54558, 54579, + 54592, 54597, 16712, 54603, 54606, 54613, 3904, 54623, 54628, 54633, + 54641, 4860, 54649, 2390, 2395, 5506, 54660, 54667, 54674, 1891, 88, + 54687, 54692, 54702, 54708, 54712, 2412, 54724, 54732, 54743, 54754, + 54763, 54768, 54774, 54784, 54789, 54795, 54800, 54809, 13471, 54813, + 3143, 12, 54818, 54825, 603, 54831, 54836, 54841, 54849, 54854, 54861, + 54867, 54873, 54883, 54891, 54896, 54904, 54911, 40967, 42582, 54920, + 1659, 1744, 54925, 54930, 2513, 479, 54937, 54943, 54948, 1748, 54955, + 54960, 3384, 54972, 54978, 54983, 54990, 55005, 55012, 55020, 55032, + 55037, 55048, 55057, 2060, 55068, 55070, 2518, 4546, 55078, 55087, 55093, + 55097, 55102, 55110, 55118, 55130, 55143, 55150, 55166, 55173, 55179, + 771, 55186, 55193, 55203, 55212, 55224, 55232, 55240, 2506, 2512, 55244, + 1397, 15010, 6364, 54240, 2533, 55254, 55257, 55263, 55269, 55276, 55281, + 55286, 1930, }; /* code->name phrasebook */ #define phrasebook_shift 7 #define phrasebook_short 226 static unsigned char phrasebook[] = { - 0, 240, 15, 233, 54, 69, 235, 51, 69, 61, 52, 240, 114, 52, 238, 107, 52, - 234, 17, 233, 59, 40, 232, 74, 38, 232, 74, 235, 52, 248, 49, 52, 240, - 27, 231, 94, 248, 37, 208, 236, 177, 26, 242, 217, 26, 127, 26, 111, 26, - 166, 26, 177, 26, 176, 26, 187, 26, 203, 26, 195, 26, 202, 240, 24, 234, - 14, 235, 44, 52, 240, 7, 52, 232, 68, 52, 236, 156, 69, 234, 20, 254, 20, - 8, 5, 1, 67, 8, 5, 1, 217, 8, 5, 1, 255, 18, 8, 5, 1, 209, 8, 5, 1, 72, - 8, 5, 1, 255, 19, 8, 5, 1, 210, 8, 5, 1, 192, 8, 5, 1, 71, 8, 5, 1, 221, - 8, 5, 1, 255, 15, 8, 5, 1, 162, 8, 5, 1, 173, 8, 5, 1, 197, 8, 5, 1, 73, - 8, 5, 1, 223, 8, 5, 1, 255, 20, 8, 5, 1, 144, 8, 5, 1, 193, 8, 5, 1, 214, - 8, 5, 1, 79, 8, 5, 1, 179, 8, 5, 1, 255, 16, 8, 5, 1, 206, 8, 5, 1, 255, - 14, 8, 5, 1, 255, 17, 40, 31, 104, 238, 75, 236, 177, 38, 31, 104, 190, - 238, 54, 170, 242, 224, 242, 245, 238, 54, 8, 3, 1, 67, 8, 3, 1, 217, 8, - 3, 1, 255, 18, 8, 3, 1, 209, 8, 3, 1, 72, 8, 3, 1, 255, 19, 8, 3, 1, 210, - 8, 3, 1, 192, 8, 3, 1, 71, 8, 3, 1, 221, 8, 3, 1, 255, 15, 8, 3, 1, 162, - 8, 3, 1, 173, 8, 3, 1, 197, 8, 3, 1, 73, 8, 3, 1, 223, 8, 3, 1, 255, 20, - 8, 3, 1, 144, 8, 3, 1, 193, 8, 3, 1, 214, 8, 3, 1, 79, 8, 3, 1, 179, 8, - 3, 1, 255, 16, 8, 3, 1, 206, 8, 3, 1, 255, 14, 8, 3, 1, 255, 17, 40, 242, - 225, 104, 59, 242, 224, 38, 242, 225, 104, 169, 236, 233, 240, 15, 236, - 145, 233, 54, 69, 249, 39, 52, 243, 246, 52, 236, 181, 52, 254, 134, 52, - 240, 129, 125, 238, 213, 52, 175, 235, 195, 52, 237, 9, 238, 205, 234, - 30, 231, 87, 45, 185, 235, 51, 69, 161, 52, 248, 186, 238, 93, 234, 245, - 52, 196, 240, 112, 52, 234, 236, 52, 233, 49, 111, 233, 49, 166, 242, - 241, 238, 54, 246, 81, 52, 238, 208, 52, 240, 1, 248, 40, 236, 151, 233, - 49, 127, 236, 58, 238, 205, 234, 30, 231, 36, 45, 185, 235, 51, 69, 240, - 30, 236, 155, 253, 125, 237, 33, 240, 30, 236, 155, 253, 125, 243, 7, - 240, 30, 236, 155, 204, 236, 84, 236, 145, 236, 156, 69, 8, 5, 1, 134, 2, - 191, 8, 5, 1, 134, 2, 135, 8, 5, 1, 134, 2, 233, 48, 8, 5, 1, 134, 2, - 169, 8, 5, 1, 134, 2, 175, 8, 5, 1, 134, 2, 248, 51, 48, 8, 5, 1, 253, - 178, 8, 5, 1, 255, 105, 2, 236, 151, 8, 5, 1, 157, 2, 191, 8, 5, 1, 157, - 2, 135, 8, 5, 1, 157, 2, 233, 48, 8, 5, 1, 157, 2, 175, 8, 5, 1, 220, 2, - 191, 8, 5, 1, 220, 2, 135, 8, 5, 1, 220, 2, 233, 48, 8, 5, 1, 220, 2, - 175, 8, 5, 1, 248, 109, 8, 5, 1, 255, 98, 2, 169, 8, 5, 1, 117, 2, 191, - 8, 5, 1, 117, 2, 135, 8, 5, 1, 117, 2, 233, 48, 8, 5, 1, 117, 2, 169, 8, - 5, 1, 117, 2, 175, 231, 37, 52, 8, 5, 1, 117, 2, 108, 8, 5, 1, 132, 2, - 191, 8, 5, 1, 132, 2, 135, 8, 5, 1, 132, 2, 233, 48, 8, 5, 1, 132, 2, - 175, 8, 5, 1, 255, 107, 2, 135, 8, 5, 1, 240, 149, 8, 3, 1, 243, 74, 193, - 8, 3, 1, 134, 2, 191, 8, 3, 1, 134, 2, 135, 8, 3, 1, 134, 2, 233, 48, 8, - 3, 1, 134, 2, 169, 8, 3, 1, 134, 2, 175, 8, 3, 1, 134, 2, 248, 51, 48, 8, - 3, 1, 253, 178, 8, 3, 1, 255, 105, 2, 236, 151, 8, 3, 1, 157, 2, 191, 8, - 3, 1, 157, 2, 135, 8, 3, 1, 157, 2, 233, 48, 8, 3, 1, 157, 2, 175, 8, 3, - 1, 220, 2, 191, 8, 3, 1, 220, 2, 135, 8, 3, 1, 220, 2, 233, 48, 8, 3, 1, - 220, 2, 175, 8, 3, 1, 248, 109, 8, 3, 1, 255, 98, 2, 169, 8, 3, 1, 117, - 2, 191, 8, 3, 1, 117, 2, 135, 8, 3, 1, 117, 2, 233, 48, 8, 3, 1, 117, 2, - 169, 8, 3, 1, 117, 2, 175, 236, 196, 52, 8, 3, 1, 117, 2, 108, 8, 3, 1, - 132, 2, 191, 8, 3, 1, 132, 2, 135, 8, 3, 1, 132, 2, 233, 48, 8, 3, 1, - 132, 2, 175, 8, 3, 1, 255, 107, 2, 135, 8, 3, 1, 240, 149, 8, 3, 1, 255, - 107, 2, 175, 8, 5, 1, 134, 2, 196, 8, 3, 1, 134, 2, 196, 8, 5, 1, 134, 2, - 239, 255, 8, 3, 1, 134, 2, 239, 255, 8, 5, 1, 134, 2, 238, 71, 8, 3, 1, - 134, 2, 238, 71, 8, 5, 1, 255, 105, 2, 135, 8, 3, 1, 255, 105, 2, 135, 8, - 5, 1, 255, 105, 2, 233, 48, 8, 3, 1, 255, 105, 2, 233, 48, 8, 5, 1, 255, - 105, 2, 53, 48, 8, 3, 1, 255, 105, 2, 53, 48, 8, 5, 1, 255, 105, 2, 239, - 254, 8, 3, 1, 255, 105, 2, 239, 254, 8, 5, 1, 255, 103, 2, 239, 254, 8, - 3, 1, 255, 103, 2, 239, 254, 8, 5, 1, 255, 103, 2, 108, 8, 3, 1, 255, - 103, 2, 108, 8, 5, 1, 157, 2, 196, 8, 3, 1, 157, 2, 196, 8, 5, 1, 157, 2, - 239, 255, 8, 3, 1, 157, 2, 239, 255, 8, 5, 1, 157, 2, 53, 48, 8, 3, 1, - 157, 2, 53, 48, 8, 5, 1, 157, 2, 238, 71, 8, 3, 1, 157, 2, 238, 71, 8, 5, - 1, 157, 2, 239, 254, 8, 3, 1, 157, 2, 239, 254, 8, 5, 1, 255, 104, 2, - 233, 48, 8, 3, 1, 255, 104, 2, 233, 48, 8, 5, 1, 255, 104, 2, 239, 255, - 8, 3, 1, 255, 104, 2, 239, 255, 8, 5, 1, 255, 104, 2, 53, 48, 8, 3, 1, - 255, 104, 2, 53, 48, 8, 5, 1, 255, 104, 2, 236, 151, 8, 3, 1, 255, 104, - 2, 236, 151, 8, 5, 1, 255, 106, 2, 233, 48, 8, 3, 1, 255, 106, 2, 233, - 48, 8, 5, 1, 255, 106, 2, 108, 8, 3, 1, 255, 106, 2, 108, 8, 5, 1, 220, - 2, 169, 8, 3, 1, 220, 2, 169, 8, 5, 1, 220, 2, 196, 8, 3, 1, 220, 2, 196, - 8, 5, 1, 220, 2, 239, 255, 8, 3, 1, 220, 2, 239, 255, 8, 5, 1, 220, 2, - 238, 71, 8, 3, 1, 220, 2, 238, 71, 8, 5, 1, 220, 2, 53, 48, 8, 3, 1, 238, - 70, 71, 8, 5, 18, 254, 99, 8, 3, 18, 254, 99, 8, 5, 1, 255, 115, 2, 233, - 48, 8, 3, 1, 255, 115, 2, 233, 48, 8, 5, 1, 255, 109, 2, 236, 151, 8, 3, - 1, 255, 109, 2, 236, 151, 8, 3, 1, 251, 164, 8, 5, 1, 255, 100, 2, 135, - 8, 3, 1, 255, 100, 2, 135, 8, 5, 1, 255, 100, 2, 236, 151, 8, 3, 1, 255, - 100, 2, 236, 151, 8, 5, 1, 255, 100, 2, 239, 254, 8, 3, 1, 255, 100, 2, - 239, 254, 8, 5, 1, 255, 100, 2, 240, 1, 248, 40, 8, 3, 1, 255, 100, 2, - 240, 1, 248, 40, 8, 5, 1, 255, 100, 2, 108, 8, 3, 1, 255, 100, 2, 108, 8, - 5, 1, 255, 98, 2, 135, 8, 3, 1, 255, 98, 2, 135, 8, 5, 1, 255, 98, 2, - 236, 151, 8, 3, 1, 255, 98, 2, 236, 151, 8, 5, 1, 255, 98, 2, 239, 254, - 8, 3, 1, 255, 98, 2, 239, 254, 8, 3, 1, 255, 98, 237, 241, 255, 25, 233, - 59, 8, 5, 1, 248, 108, 8, 3, 1, 248, 108, 8, 5, 1, 117, 2, 196, 8, 3, 1, - 117, 2, 196, 8, 5, 1, 117, 2, 239, 255, 8, 3, 1, 117, 2, 239, 255, 8, 5, - 1, 117, 2, 45, 135, 8, 3, 1, 117, 2, 45, 135, 8, 5, 18, 253, 193, 8, 3, - 18, 253, 193, 8, 5, 1, 255, 101, 2, 135, 8, 3, 1, 255, 101, 2, 135, 8, 5, - 1, 255, 101, 2, 236, 151, 8, 3, 1, 255, 101, 2, 236, 151, 8, 5, 1, 255, - 101, 2, 239, 254, 8, 3, 1, 255, 101, 2, 239, 254, 8, 5, 1, 255, 99, 2, - 135, 8, 3, 1, 255, 99, 2, 135, 8, 5, 1, 255, 99, 2, 233, 48, 8, 3, 1, - 255, 99, 2, 233, 48, 8, 5, 1, 255, 99, 2, 236, 151, 8, 3, 1, 255, 99, 2, - 236, 151, 8, 5, 1, 255, 99, 2, 239, 254, 8, 3, 1, 255, 99, 2, 239, 254, - 8, 5, 1, 255, 102, 2, 236, 151, 8, 3, 1, 255, 102, 2, 236, 151, 8, 5, 1, - 255, 102, 2, 239, 254, 8, 3, 1, 255, 102, 2, 239, 254, 8, 5, 1, 255, 102, - 2, 108, 8, 3, 1, 255, 102, 2, 108, 8, 5, 1, 132, 2, 169, 8, 3, 1, 132, 2, - 169, 8, 5, 1, 132, 2, 196, 8, 3, 1, 132, 2, 196, 8, 5, 1, 132, 2, 239, - 255, 8, 3, 1, 132, 2, 239, 255, 8, 5, 1, 132, 2, 248, 51, 48, 8, 3, 1, - 132, 2, 248, 51, 48, 8, 5, 1, 132, 2, 45, 135, 8, 3, 1, 132, 2, 45, 135, - 8, 5, 1, 132, 2, 238, 71, 8, 3, 1, 132, 2, 238, 71, 8, 5, 1, 255, 111, 2, - 233, 48, 8, 3, 1, 255, 111, 2, 233, 48, 8, 5, 1, 255, 107, 2, 233, 48, 8, - 3, 1, 255, 107, 2, 233, 48, 8, 5, 1, 255, 107, 2, 175, 8, 5, 1, 255, 97, - 2, 135, 8, 3, 1, 255, 97, 2, 135, 8, 5, 1, 255, 97, 2, 53, 48, 8, 3, 1, - 255, 97, 2, 53, 48, 8, 5, 1, 255, 97, 2, 239, 254, 8, 3, 1, 255, 97, 2, - 239, 254, 8, 3, 1, 183, 193, 8, 3, 1, 41, 2, 108, 8, 5, 1, 41, 2, 90, 8, - 5, 1, 41, 2, 238, 124, 8, 3, 1, 41, 2, 238, 124, 8, 5, 1, 188, 187, 8, 3, - 1, 188, 187, 8, 5, 1, 248, 35, 73, 8, 5, 1, 255, 105, 2, 90, 8, 3, 1, - 255, 105, 2, 90, 8, 5, 1, 238, 238, 209, 8, 5, 1, 255, 103, 2, 90, 8, 5, - 1, 255, 103, 2, 238, 124, 8, 3, 1, 255, 103, 2, 238, 124, 8, 3, 1, 205, - 240, 28, 8, 5, 1, 224, 72, 8, 5, 1, 240, 86, 8, 5, 1, 248, 35, 72, 8, 5, - 1, 255, 112, 2, 90, 8, 3, 1, 255, 112, 2, 90, 8, 5, 1, 255, 104, 2, 90, - 8, 5, 1, 240, 10, 8, 3, 1, 254, 98, 8, 5, 1, 242, 237, 8, 5, 1, 220, 2, - 108, 8, 5, 1, 255, 109, 2, 90, 8, 3, 1, 255, 109, 2, 90, 8, 3, 1, 255, - 100, 2, 125, 8, 3, 1, 241, 212, 2, 108, 8, 5, 1, 205, 173, 8, 5, 1, 255, - 98, 2, 40, 90, 8, 3, 1, 255, 98, 2, 183, 38, 248, 117, 8, 5, 1, 117, 2, - 240, 1, 169, 8, 5, 1, 117, 2, 243, 8, 8, 3, 1, 117, 2, 243, 8, 8, 5, 1, - 254, 42, 8, 3, 1, 254, 42, 8, 5, 1, 255, 114, 2, 90, 8, 3, 1, 255, 114, - 2, 90, 8, 1, 254, 135, 8, 5, 1, 188, 111, 8, 3, 1, 188, 111, 8, 5, 1, - 248, 93, 8, 1, 224, 254, 38, 243, 105, 8, 3, 1, 255, 102, 2, 238, 65, 90, - 8, 5, 1, 255, 102, 2, 90, 8, 3, 1, 255, 102, 2, 90, 8, 5, 1, 255, 102, 2, - 235, 54, 90, 8, 5, 1, 132, 2, 243, 8, 8, 3, 1, 132, 2, 243, 8, 8, 5, 1, - 236, 160, 8, 5, 1, 255, 110, 2, 90, 8, 5, 1, 255, 107, 2, 90, 8, 3, 1, - 255, 107, 2, 90, 8, 5, 1, 255, 97, 2, 108, 8, 3, 1, 255, 97, 2, 108, 8, - 5, 1, 248, 155, 8, 5, 1, 253, 244, 235, 142, 8, 3, 1, 253, 244, 235, 142, - 8, 3, 1, 253, 244, 2, 242, 226, 8, 1, 171, 2, 108, 8, 5, 1, 188, 176, 8, - 3, 1, 188, 176, 8, 1, 236, 145, 238, 62, 248, 119, 2, 108, 8, 1, 244, 54, - 8, 1, 241, 82, 240, 93, 8, 1, 239, 114, 240, 93, 8, 1, 237, 59, 240, 93, - 8, 1, 235, 54, 240, 93, 8, 5, 1, 255, 40, 2, 239, 254, 8, 5, 1, 255, 103, - 2, 3, 1, 255, 97, 2, 239, 254, 8, 3, 1, 255, 40, 2, 239, 254, 8, 5, 1, - 254, 109, 8, 5, 1, 255, 100, 2, 3, 1, 221, 8, 3, 1, 254, 109, 8, 5, 1, - 254, 113, 8, 5, 1, 255, 98, 2, 3, 1, 221, 8, 3, 1, 254, 113, 8, 5, 1, - 134, 2, 239, 254, 8, 3, 1, 134, 2, 239, 254, 8, 5, 1, 220, 2, 239, 254, - 8, 3, 1, 220, 2, 239, 254, 8, 5, 1, 117, 2, 239, 254, 8, 3, 1, 117, 2, - 239, 254, 8, 5, 1, 132, 2, 239, 254, 8, 3, 1, 132, 2, 239, 254, 8, 5, 1, - 132, 2, 235, 56, 19, 196, 8, 3, 1, 132, 2, 235, 56, 19, 196, 8, 5, 1, - 132, 2, 235, 56, 19, 135, 8, 3, 1, 132, 2, 235, 56, 19, 135, 8, 5, 1, - 132, 2, 235, 56, 19, 239, 254, 8, 3, 1, 132, 2, 235, 56, 19, 239, 254, 8, - 5, 1, 132, 2, 235, 56, 19, 191, 8, 3, 1, 132, 2, 235, 56, 19, 191, 8, 3, - 1, 205, 72, 8, 5, 1, 134, 2, 235, 56, 19, 196, 8, 3, 1, 134, 2, 235, 56, - 19, 196, 8, 5, 1, 134, 2, 53, 60, 19, 196, 8, 3, 1, 134, 2, 53, 60, 19, - 196, 8, 5, 1, 255, 30, 2, 196, 8, 3, 1, 255, 30, 2, 196, 8, 5, 1, 255, - 104, 2, 108, 8, 3, 1, 255, 104, 2, 108, 8, 5, 1, 255, 104, 2, 239, 254, - 8, 3, 1, 255, 104, 2, 239, 254, 8, 5, 1, 255, 109, 2, 239, 254, 8, 3, 1, - 255, 109, 2, 239, 254, 8, 5, 1, 117, 2, 238, 71, 8, 3, 1, 117, 2, 238, - 71, 8, 5, 1, 117, 2, 240, 204, 19, 196, 8, 3, 1, 117, 2, 240, 204, 19, - 196, 8, 5, 1, 253, 244, 2, 239, 254, 8, 3, 1, 253, 244, 2, 239, 254, 8, - 3, 1, 255, 115, 2, 239, 254, 8, 5, 1, 254, 88, 8, 5, 1, 255, 103, 2, 3, - 1, 255, 17, 8, 3, 1, 254, 88, 8, 5, 1, 255, 104, 2, 135, 8, 3, 1, 255, - 104, 2, 135, 8, 5, 1, 240, 190, 8, 5, 1, 244, 54, 8, 5, 1, 255, 98, 2, - 191, 8, 3, 1, 255, 98, 2, 191, 8, 5, 1, 134, 2, 248, 51, 60, 19, 135, 8, - 3, 1, 134, 2, 248, 51, 60, 19, 135, 8, 5, 1, 255, 30, 2, 135, 8, 3, 1, - 255, 30, 2, 135, 8, 5, 1, 117, 2, 240, 5, 19, 135, 8, 3, 1, 117, 2, 240, - 5, 19, 135, 8, 5, 1, 134, 2, 45, 191, 8, 3, 1, 134, 2, 45, 191, 8, 5, 1, - 134, 2, 236, 145, 239, 255, 8, 3, 1, 134, 2, 236, 145, 239, 255, 8, 5, 1, - 157, 2, 45, 191, 8, 3, 1, 157, 2, 45, 191, 8, 5, 1, 157, 2, 236, 145, - 239, 255, 8, 3, 1, 157, 2, 236, 145, 239, 255, 8, 5, 1, 220, 2, 45, 191, - 8, 3, 1, 220, 2, 45, 191, 8, 5, 1, 220, 2, 236, 145, 239, 255, 8, 3, 1, - 220, 2, 236, 145, 239, 255, 8, 5, 1, 117, 2, 45, 191, 8, 3, 1, 117, 2, - 45, 191, 8, 5, 1, 117, 2, 236, 145, 239, 255, 8, 3, 1, 117, 2, 236, 145, - 239, 255, 8, 5, 1, 255, 101, 2, 45, 191, 8, 3, 1, 255, 101, 2, 45, 191, - 8, 5, 1, 255, 101, 2, 236, 145, 239, 255, 8, 3, 1, 255, 101, 2, 236, 145, - 239, 255, 8, 5, 1, 132, 2, 45, 191, 8, 3, 1, 132, 2, 45, 191, 8, 5, 1, - 132, 2, 236, 145, 239, 255, 8, 3, 1, 132, 2, 236, 145, 239, 255, 8, 5, 1, - 255, 99, 2, 242, 244, 46, 8, 3, 1, 255, 99, 2, 242, 244, 46, 8, 5, 1, - 255, 102, 2, 242, 244, 46, 8, 3, 1, 255, 102, 2, 242, 244, 46, 8, 5, 1, - 244, 59, 8, 3, 1, 244, 59, 8, 5, 1, 255, 106, 2, 239, 254, 8, 3, 1, 255, - 106, 2, 239, 254, 8, 5, 1, 255, 98, 2, 183, 38, 248, 117, 8, 3, 1, 255, - 103, 2, 242, 253, 8, 5, 1, 254, 10, 8, 3, 1, 254, 10, 8, 5, 1, 255, 97, - 2, 90, 8, 3, 1, 255, 97, 2, 90, 8, 5, 1, 134, 2, 53, 48, 8, 3, 1, 134, 2, - 53, 48, 8, 5, 1, 157, 2, 236, 151, 8, 3, 1, 157, 2, 236, 151, 8, 5, 1, - 117, 2, 235, 56, 19, 196, 8, 3, 1, 117, 2, 235, 56, 19, 196, 8, 5, 1, - 117, 2, 242, 219, 19, 196, 8, 3, 1, 117, 2, 242, 219, 19, 196, 8, 5, 1, - 117, 2, 53, 48, 8, 3, 1, 117, 2, 53, 48, 8, 5, 1, 117, 2, 53, 60, 19, - 196, 8, 3, 1, 117, 2, 53, 60, 19, 196, 8, 5, 1, 255, 107, 2, 196, 8, 3, - 1, 255, 107, 2, 196, 8, 3, 1, 255, 100, 2, 242, 253, 8, 3, 1, 255, 98, 2, - 242, 253, 8, 3, 1, 255, 102, 2, 242, 253, 8, 3, 1, 238, 70, 221, 8, 3, 1, - 255, 71, 236, 182, 8, 3, 1, 255, 89, 236, 182, 8, 5, 1, 134, 2, 108, 8, - 5, 1, 255, 105, 2, 108, 8, 3, 1, 255, 105, 2, 108, 8, 5, 1, 255, 100, 2, - 125, 8, 5, 1, 255, 102, 2, 236, 159, 108, 8, 3, 1, 255, 99, 2, 243, 126, - 242, 226, 8, 3, 1, 255, 97, 2, 243, 126, 242, 226, 8, 5, 1, 238, 62, 208, - 8, 3, 1, 205, 67, 8, 3, 1, 240, 22, 8, 3, 1, 205, 240, 22, 8, 3, 1, 41, - 2, 90, 8, 3, 1, 248, 35, 73, 8, 3, 1, 255, 105, 2, 242, 253, 8, 3, 1, - 255, 103, 2, 242, 226, 8, 3, 1, 255, 103, 2, 90, 8, 3, 1, 224, 72, 8, 3, - 1, 240, 86, 8, 3, 1, 243, 73, 2, 90, 8, 3, 1, 248, 35, 72, 8, 3, 1, 224, - 248, 35, 72, 8, 3, 1, 224, 248, 35, 157, 2, 90, 8, 3, 1, 240, 23, 224, - 248, 35, 72, 8, 3, 1, 238, 70, 255, 115, 2, 108, 8, 3, 1, 255, 104, 2, - 90, 8, 3, 1, 84, 210, 8, 1, 3, 5, 210, 8, 3, 1, 240, 10, 8, 3, 1, 252, - 129, 243, 8, 8, 3, 1, 205, 192, 8, 3, 1, 255, 106, 2, 90, 8, 3, 1, 251, - 52, 2, 90, 8, 3, 1, 220, 2, 108, 8, 3, 1, 242, 237, 8, 1, 3, 5, 71, 8, 3, - 1, 255, 100, 2, 240, 1, 169, 8, 3, 1, 255, 100, 2, 244, 216, 8, 3, 1, - 255, 100, 2, 235, 54, 90, 8, 3, 1, 246, 43, 8, 3, 1, 205, 173, 8, 3, 1, - 205, 255, 108, 2, 183, 248, 117, 8, 3, 1, 255, 108, 2, 90, 8, 3, 1, 255, - 98, 2, 40, 90, 8, 3, 1, 255, 98, 2, 235, 54, 90, 8, 1, 3, 5, 197, 8, 3, - 1, 240, 60, 73, 8, 1, 3, 5, 253, 193, 8, 3, 1, 240, 23, 240, 20, 8, 3, 1, - 248, 68, 8, 3, 1, 205, 144, 8, 3, 1, 205, 255, 101, 2, 183, 248, 117, 8, - 3, 1, 205, 255, 101, 2, 90, 8, 3, 1, 255, 101, 2, 183, 248, 117, 8, 3, 1, - 255, 101, 2, 242, 226, 8, 3, 1, 255, 101, 2, 235, 100, 8, 3, 1, 224, 255, - 101, 2, 235, 100, 8, 1, 3, 5, 144, 8, 1, 3, 5, 236, 145, 144, 8, 3, 1, - 255, 99, 2, 90, 8, 3, 1, 248, 93, 8, 3, 1, 238, 70, 255, 115, 2, 240, 5, - 19, 90, 8, 3, 1, 244, 23, 224, 248, 93, 8, 3, 1, 254, 38, 2, 242, 253, 8, - 3, 1, 205, 214, 8, 3, 1, 255, 102, 2, 235, 54, 90, 8, 3, 1, 132, 125, 8, - 3, 1, 236, 160, 8, 3, 1, 255, 110, 2, 90, 8, 3, 1, 205, 179, 8, 3, 1, - 205, 255, 16, 8, 3, 1, 205, 255, 14, 8, 1, 3, 5, 255, 14, 8, 3, 1, 255, - 97, 2, 235, 54, 90, 8, 3, 1, 255, 97, 2, 242, 253, 8, 3, 1, 248, 155, 8, - 3, 1, 253, 244, 2, 242, 253, 8, 1, 238, 62, 208, 8, 1, 234, 12, 240, 59, - 234, 192, 8, 1, 236, 145, 238, 62, 208, 8, 1, 236, 110, 255, 18, 8, 1, - 236, 249, 240, 93, 8, 1, 3, 5, 217, 8, 3, 1, 240, 23, 248, 35, 72, 8, 1, - 3, 5, 255, 104, 2, 90, 8, 1, 3, 5, 192, 8, 3, 1, 255, 115, 2, 231, 101, - 8, 3, 1, 205, 255, 15, 8, 1, 3, 5, 162, 8, 3, 1, 255, 116, 2, 90, 8, 1, - 238, 62, 248, 119, 2, 108, 8, 1, 224, 238, 62, 248, 119, 2, 108, 8, 3, 1, - 255, 40, 236, 182, 8, 3, 1, 250, 192, 236, 182, 8, 3, 1, 255, 40, 238, - 112, 2, 242, 253, 8, 3, 1, 255, 94, 236, 182, 8, 3, 1, 252, 215, 236, - 182, 8, 3, 1, 255, 92, 238, 112, 2, 242, 253, 8, 3, 1, 250, 239, 236, - 182, 8, 3, 1, 255, 78, 236, 182, 8, 3, 1, 255, 79, 236, 182, 8, 1, 236, - 249, 233, 95, 8, 1, 237, 77, 233, 95, 8, 3, 1, 205, 255, 106, 2, 235, - 100, 8, 3, 1, 205, 255, 106, 2, 237, 11, 19, 242, 226, 49, 1, 3, 192, 49, - 1, 3, 255, 106, 2, 90, 49, 1, 3, 221, 49, 1, 3, 144, 49, 1, 3, 205, 144, - 49, 1, 3, 205, 255, 101, 2, 90, 49, 1, 3, 5, 236, 145, 144, 49, 1, 3, - 255, 16, 49, 1, 3, 255, 14, 49, 1, 240, 57, 49, 1, 45, 240, 57, 49, 1, - 205, 240, 27, 49, 1, 233, 59, 49, 1, 224, 240, 27, 49, 1, 38, 137, 242, - 233, 49, 1, 40, 137, 242, 233, 49, 1, 238, 62, 208, 49, 1, 224, 238, 62, - 208, 49, 1, 40, 234, 7, 49, 1, 38, 234, 7, 49, 1, 88, 234, 7, 49, 1, 92, - 234, 7, 49, 1, 190, 238, 54, 239, 254, 49, 1, 59, 242, 224, 49, 1, 196, - 49, 1, 242, 241, 238, 54, 49, 1, 242, 245, 238, 54, 49, 1, 170, 59, 242, - 224, 49, 1, 170, 196, 49, 1, 170, 242, 245, 238, 54, 49, 1, 170, 242, - 241, 238, 54, 49, 1, 234, 43, 240, 24, 49, 1, 137, 234, 43, 240, 24, 49, - 1, 238, 130, 38, 137, 242, 233, 49, 1, 238, 130, 40, 137, 242, 233, 49, - 1, 88, 242, 234, 49, 1, 92, 242, 234, 49, 1, 248, 49, 52, 49, 1, 242, - 250, 52, 239, 255, 53, 48, 248, 51, 48, 238, 71, 3, 169, 45, 242, 241, - 238, 54, 49, 1, 242, 83, 90, 49, 1, 243, 38, 238, 54, 49, 1, 3, 240, 10, - 49, 1, 3, 162, 49, 1, 3, 193, 49, 1, 3, 206, 49, 1, 3, 224, 238, 62, 208, - 49, 1, 234, 27, 188, 125, 49, 1, 200, 188, 125, 49, 1, 254, 40, 188, 125, - 49, 1, 170, 188, 125, 49, 1, 235, 87, 188, 125, 49, 1, 254, 15, 235, 98, - 188, 69, 49, 1, 248, 122, 235, 98, 188, 69, 49, 1, 238, 44, 49, 1, 233, - 47, 49, 1, 45, 233, 59, 49, 1, 170, 92, 234, 7, 49, 1, 170, 88, 234, 7, - 49, 1, 170, 40, 234, 7, 49, 1, 170, 38, 234, 7, 49, 1, 170, 242, 233, 49, - 1, 240, 1, 242, 245, 238, 54, 49, 1, 240, 1, 45, 242, 245, 238, 54, 49, - 1, 240, 1, 45, 242, 241, 238, 54, 49, 1, 170, 169, 49, 1, 240, 84, 240, - 24, 49, 1, 243, 24, 200, 243, 78, 49, 1, 253, 165, 200, 243, 78, 49, 1, - 243, 24, 170, 243, 78, 49, 1, 253, 165, 170, 243, 78, 49, 1, 240, 226, - 49, 1, 248, 35, 240, 226, 49, 1, 170, 40, 56, 50, 242, 245, 238, 54, 50, - 242, 241, 238, 54, 50, 190, 238, 54, 50, 169, 50, 196, 50, 235, 74, 50, - 239, 255, 50, 53, 48, 50, 175, 50, 248, 45, 48, 50, 248, 51, 48, 50, 45, - 242, 241, 238, 54, 50, 239, 254, 50, 59, 248, 41, 48, 50, 45, 59, 248, - 41, 48, 50, 45, 242, 245, 238, 54, 50, 232, 77, 50, 236, 145, 239, 255, - 50, 205, 242, 244, 48, 50, 242, 244, 48, 50, 224, 242, 244, 48, 50, 242, - 244, 60, 225, 50, 242, 245, 240, 2, 46, 50, 242, 241, 240, 2, 46, 50, 40, - 248, 84, 46, 50, 38, 248, 84, 46, 50, 40, 185, 48, 50, 243, 8, 50, 40, - 137, 248, 51, 46, 50, 88, 248, 84, 46, 50, 92, 248, 84, 46, 50, 248, 49, - 21, 46, 50, 242, 250, 21, 46, 50, 233, 222, 248, 45, 46, 50, 235, 54, - 248, 45, 46, 50, 53, 46, 50, 235, 56, 46, 50, 248, 51, 46, 50, 242, 244, - 46, 50, 236, 151, 50, 238, 71, 50, 59, 248, 41, 46, 50, 240, 109, 46, 50, - 236, 145, 45, 249, 239, 46, 50, 243, 86, 46, 50, 190, 240, 2, 46, 50, - 242, 243, 46, 50, 236, 145, 242, 243, 46, 50, 242, 219, 46, 50, 240, 42, - 46, 50, 170, 242, 224, 50, 45, 170, 242, 224, 50, 242, 219, 236, 161, 50, - 242, 215, 240, 5, 236, 161, 50, 183, 240, 5, 236, 161, 50, 242, 215, 238, - 83, 236, 161, 50, 183, 238, 83, 236, 161, 50, 38, 137, 248, 51, 46, 50, - 236, 145, 240, 109, 46, 50, 31, 46, 50, 239, 184, 46, 50, 255, 113, 48, - 50, 59, 169, 50, 45, 235, 74, 50, 242, 245, 188, 69, 50, 242, 241, 188, - 69, 50, 17, 232, 71, 50, 17, 236, 229, 50, 17, 235, 59, 240, 16, 50, 17, - 231, 35, 50, 240, 109, 48, 50, 240, 7, 21, 46, 50, 45, 59, 248, 41, 46, - 50, 40, 185, 46, 50, 161, 242, 219, 48, 50, 234, 200, 48, 50, 240, 40, - 95, 153, 48, 50, 40, 38, 65, 46, 50, 226, 226, 65, 46, 50, 237, 166, 238, - 140, 50, 38, 235, 76, 48, 50, 40, 137, 248, 51, 48, 50, 237, 10, 50, 255, - 113, 46, 50, 40, 235, 76, 46, 50, 38, 235, 76, 46, 50, 38, 235, 76, 19, - 88, 235, 76, 46, 50, 38, 137, 248, 51, 48, 50, 53, 60, 225, 50, 236, 219, - 46, 50, 45, 248, 51, 46, 50, 240, 126, 48, 50, 45, 242, 243, 46, 50, 45, - 239, 255, 50, 45, 196, 50, 45, 240, 42, 46, 50, 45, 169, 50, 45, 236, - 145, 239, 255, 50, 45, 77, 65, 46, 50, 8, 3, 1, 67, 50, 8, 3, 1, 72, 50, - 8, 3, 1, 71, 50, 8, 3, 1, 73, 50, 8, 3, 1, 79, 50, 8, 3, 1, 255, 18, 50, - 8, 3, 1, 209, 50, 8, 3, 1, 192, 50, 8, 3, 1, 173, 50, 8, 3, 1, 144, 50, - 8, 3, 1, 214, 50, 8, 3, 1, 179, 50, 8, 3, 1, 206, 17, 178, 52, 17, 168, - 178, 52, 17, 231, 35, 17, 236, 156, 69, 17, 240, 16, 17, 235, 59, 240, - 16, 17, 5, 1, 194, 2, 240, 16, 17, 254, 140, 238, 223, 17, 5, 1, 238, 57, - 2, 240, 16, 17, 5, 1, 253, 123, 2, 240, 16, 17, 5, 1, 248, 42, 2, 240, - 16, 17, 5, 1, 238, 64, 2, 240, 16, 17, 5, 1, 238, 53, 2, 240, 16, 17, 5, - 1, 211, 2, 240, 16, 17, 3, 1, 248, 42, 2, 235, 59, 19, 240, 16, 17, 5, 1, - 240, 22, 17, 5, 1, 242, 242, 17, 5, 1, 240, 10, 17, 5, 1, 240, 28, 17, 5, - 1, 236, 165, 17, 5, 1, 242, 251, 17, 5, 1, 248, 87, 17, 5, 1, 240, 38, - 17, 5, 1, 242, 237, 17, 5, 1, 240, 41, 17, 5, 1, 240, 33, 17, 5, 1, 253, - 154, 17, 5, 1, 253, 150, 17, 5, 1, 253, 188, 17, 5, 1, 236, 169, 17, 5, - 1, 253, 147, 17, 5, 1, 248, 73, 17, 5, 1, 240, 21, 17, 5, 1, 248, 85, 17, - 5, 1, 236, 160, 17, 5, 1, 248, 68, 17, 5, 1, 248, 67, 17, 5, 1, 248, 69, - 17, 5, 1, 240, 20, 17, 5, 1, 248, 42, 2, 234, 26, 17, 5, 1, 238, 53, 2, - 234, 26, 17, 3, 1, 194, 2, 240, 16, 17, 3, 1, 238, 57, 2, 240, 16, 17, 3, - 1, 253, 123, 2, 240, 16, 17, 3, 1, 248, 42, 2, 240, 16, 17, 3, 1, 238, - 53, 2, 235, 59, 19, 240, 16, 17, 3, 1, 240, 22, 17, 3, 1, 242, 242, 17, - 3, 1, 240, 10, 17, 3, 1, 240, 28, 17, 3, 1, 236, 165, 17, 3, 1, 242, 251, - 17, 3, 1, 248, 87, 17, 3, 1, 240, 38, 17, 3, 1, 242, 237, 17, 3, 1, 240, - 41, 17, 3, 1, 240, 33, 17, 3, 1, 253, 154, 17, 3, 1, 253, 150, 17, 3, 1, - 253, 188, 17, 3, 1, 236, 169, 17, 3, 1, 253, 147, 17, 3, 1, 248, 73, 17, - 3, 1, 30, 240, 21, 17, 3, 1, 240, 21, 17, 3, 1, 248, 85, 17, 3, 1, 236, - 160, 17, 3, 1, 248, 68, 17, 3, 1, 248, 67, 17, 3, 1, 248, 69, 17, 3, 1, - 240, 20, 17, 3, 1, 248, 42, 2, 234, 26, 17, 3, 1, 238, 53, 2, 234, 26, - 17, 3, 1, 238, 64, 2, 240, 16, 17, 3, 1, 238, 53, 2, 240, 16, 17, 3, 1, - 211, 2, 240, 16, 17, 250, 118, 91, 17, 243, 0, 91, 17, 238, 53, 2, 248, - 45, 91, 17, 238, 53, 2, 242, 241, 19, 248, 45, 91, 17, 238, 53, 2, 235, - 56, 19, 248, 45, 91, 17, 254, 11, 91, 17, 255, 29, 91, 17, 254, 65, 91, - 17, 1, 238, 162, 240, 77, 17, 3, 1, 238, 162, 240, 77, 17, 1, 238, 152, - 17, 3, 1, 238, 152, 17, 1, 237, 6, 17, 3, 1, 237, 6, 17, 1, 240, 77, 17, - 3, 1, 240, 77, 17, 1, 240, 121, 17, 3, 1, 240, 121, 62, 5, 1, 243, 32, - 62, 3, 1, 243, 32, 62, 5, 1, 249, 62, 62, 3, 1, 249, 62, 62, 5, 1, 243, - 64, 62, 3, 1, 243, 64, 62, 5, 1, 243, 28, 62, 3, 1, 243, 28, 62, 5, 1, - 238, 115, 62, 3, 1, 238, 115, 62, 5, 1, 240, 88, 62, 3, 1, 240, 88, 62, - 5, 1, 249, 53, 62, 3, 1, 249, 53, 17, 243, 29, 91, 17, 253, 218, 91, 17, - 240, 67, 243, 45, 91, 17, 1, 249, 211, 17, 5, 243, 0, 91, 17, 240, 67, - 238, 57, 91, 17, 224, 240, 67, 238, 57, 91, 17, 5, 1, 248, 110, 17, 3, 1, - 248, 110, 17, 5, 240, 67, 243, 45, 91, 17, 5, 1, 248, 134, 17, 3, 1, 248, - 134, 17, 253, 218, 2, 240, 5, 91, 17, 5, 224, 240, 67, 243, 45, 91, 17, - 5, 240, 4, 240, 67, 243, 45, 91, 17, 5, 224, 240, 4, 240, 67, 243, 45, - 91, 32, 5, 1, 255, 42, 2, 191, 32, 5, 1, 254, 100, 32, 5, 1, 248, 150, - 32, 5, 1, 249, 77, 32, 5, 1, 235, 156, 253, 237, 32, 5, 1, 248, 126, 32, - 5, 1, 226, 228, 71, 32, 5, 1, 253, 189, 32, 5, 1, 254, 24, 32, 5, 1, 248, - 165, 32, 5, 1, 248, 174, 32, 5, 1, 244, 40, 32, 5, 1, 249, 96, 32, 5, 1, - 220, 2, 191, 32, 5, 1, 242, 215, 79, 32, 5, 1, 243, 166, 32, 5, 1, 67, - 32, 5, 1, 253, 242, 32, 5, 1, 254, 12, 32, 5, 1, 248, 127, 32, 5, 1, 253, - 200, 32, 5, 1, 253, 237, 32, 5, 1, 248, 123, 32, 5, 1, 253, 228, 32, 5, - 1, 71, 32, 5, 1, 242, 215, 71, 32, 5, 1, 201, 32, 5, 1, 254, 3, 32, 5, 1, - 254, 22, 32, 5, 1, 253, 202, 32, 5, 1, 73, 32, 5, 1, 253, 175, 32, 5, 1, - 254, 4, 32, 5, 1, 254, 23, 32, 5, 1, 253, 195, 32, 5, 1, 79, 32, 5, 1, - 254, 21, 32, 5, 1, 219, 32, 5, 1, 248, 112, 32, 5, 1, 248, 88, 32, 5, 1, - 248, 46, 32, 5, 1, 240, 224, 32, 5, 1, 249, 79, 52, 32, 5, 1, 243, 83, - 32, 5, 1, 248, 186, 52, 32, 5, 1, 72, 32, 5, 1, 253, 161, 32, 5, 1, 216, - 32, 3, 1, 67, 32, 3, 1, 253, 242, 32, 3, 1, 254, 12, 32, 3, 1, 248, 127, - 32, 3, 1, 253, 200, 32, 3, 1, 253, 237, 32, 3, 1, 248, 123, 32, 3, 1, - 253, 228, 32, 3, 1, 71, 32, 3, 1, 242, 215, 71, 32, 3, 1, 201, 32, 3, 1, - 254, 3, 32, 3, 1, 254, 22, 32, 3, 1, 253, 202, 32, 3, 1, 73, 32, 3, 1, - 253, 175, 32, 3, 1, 254, 4, 32, 3, 1, 254, 23, 32, 3, 1, 253, 195, 32, 3, - 1, 79, 32, 3, 1, 254, 21, 32, 3, 1, 219, 32, 3, 1, 248, 112, 32, 3, 1, - 248, 88, 32, 3, 1, 248, 46, 32, 3, 1, 240, 224, 32, 3, 1, 249, 79, 52, - 32, 3, 1, 243, 83, 32, 3, 1, 248, 186, 52, 32, 3, 1, 72, 32, 3, 1, 253, - 161, 32, 3, 1, 216, 32, 3, 1, 255, 42, 2, 191, 32, 3, 1, 254, 100, 32, 3, - 1, 248, 150, 32, 3, 1, 249, 77, 32, 3, 1, 235, 156, 253, 237, 32, 3, 1, - 248, 126, 32, 3, 1, 226, 228, 71, 32, 3, 1, 253, 189, 32, 3, 1, 254, 24, - 32, 3, 1, 248, 165, 32, 3, 1, 248, 174, 32, 3, 1, 244, 40, 32, 3, 1, 249, - 96, 32, 3, 1, 220, 2, 191, 32, 3, 1, 242, 215, 79, 32, 3, 1, 243, 166, - 32, 5, 1, 240, 20, 32, 3, 1, 240, 20, 32, 5, 1, 249, 21, 32, 3, 1, 249, - 21, 32, 5, 1, 236, 197, 72, 32, 3, 1, 236, 197, 72, 32, 5, 1, 240, 101, - 248, 74, 32, 3, 1, 240, 101, 248, 74, 32, 5, 1, 236, 197, 240, 101, 248, - 74, 32, 3, 1, 236, 197, 240, 101, 248, 74, 32, 5, 1, 253, 213, 248, 74, - 32, 3, 1, 253, 213, 248, 74, 32, 5, 1, 236, 197, 253, 213, 248, 74, 32, - 3, 1, 236, 197, 253, 213, 248, 74, 32, 5, 1, 248, 163, 32, 3, 1, 248, - 163, 32, 5, 1, 248, 69, 32, 3, 1, 248, 69, 32, 5, 1, 243, 57, 32, 3, 1, - 243, 57, 32, 5, 1, 236, 215, 32, 3, 1, 236, 215, 32, 5, 1, 238, 192, 2, - 45, 242, 245, 238, 54, 32, 3, 1, 238, 192, 2, 45, 242, 245, 238, 54, 32, - 5, 1, 254, 130, 32, 3, 1, 254, 130, 32, 5, 1, 244, 1, 240, 20, 32, 3, 1, - 244, 1, 240, 20, 32, 5, 1, 211, 2, 240, 150, 32, 3, 1, 211, 2, 240, 150, - 32, 5, 1, 254, 67, 32, 3, 1, 254, 67, 32, 5, 1, 240, 77, 32, 3, 1, 240, - 77, 32, 235, 114, 52, 50, 32, 240, 150, 50, 32, 231, 27, 50, 32, 148, - 235, 135, 50, 32, 159, 235, 135, 50, 32, 238, 92, 235, 114, 52, 50, 32, - 237, 211, 52, 32, 5, 1, 242, 215, 220, 2, 242, 226, 32, 3, 1, 242, 215, - 220, 2, 242, 226, 32, 5, 1, 237, 36, 52, 32, 3, 1, 237, 36, 52, 32, 5, 1, - 255, 54, 2, 243, 36, 32, 3, 1, 255, 54, 2, 243, 36, 32, 5, 1, 253, 233, - 2, 238, 231, 32, 3, 1, 253, 233, 2, 238, 231, 32, 5, 1, 253, 233, 2, 108, - 32, 3, 1, 253, 233, 2, 108, 32, 5, 1, 253, 233, 2, 240, 1, 90, 32, 3, 1, - 253, 233, 2, 240, 1, 90, 32, 5, 1, 254, 16, 2, 234, 2, 32, 3, 1, 254, 16, - 2, 234, 2, 32, 5, 1, 255, 46, 2, 234, 2, 32, 3, 1, 255, 46, 2, 234, 2, - 32, 5, 1, 255, 26, 2, 234, 2, 32, 3, 1, 255, 26, 2, 234, 2, 32, 5, 1, - 255, 26, 2, 59, 108, 32, 3, 1, 255, 26, 2, 59, 108, 32, 5, 1, 255, 26, 2, - 108, 32, 3, 1, 255, 26, 2, 108, 32, 5, 1, 238, 165, 201, 32, 3, 1, 238, - 165, 201, 32, 5, 1, 255, 23, 2, 234, 2, 32, 3, 1, 255, 23, 2, 234, 2, 32, - 5, 18, 255, 23, 248, 127, 32, 3, 18, 255, 23, 248, 127, 32, 5, 1, 255, - 38, 2, 240, 1, 90, 32, 3, 1, 255, 38, 2, 240, 1, 90, 32, 5, 1, 235, 66, - 219, 32, 3, 1, 235, 66, 219, 32, 5, 1, 255, 55, 2, 234, 2, 32, 3, 1, 255, - 55, 2, 234, 2, 32, 5, 1, 255, 45, 2, 234, 2, 32, 3, 1, 255, 45, 2, 234, - 2, 32, 5, 1, 236, 218, 79, 32, 3, 1, 236, 218, 79, 32, 5, 1, 236, 218, - 132, 2, 108, 32, 3, 1, 236, 218, 132, 2, 108, 32, 5, 1, 255, 58, 2, 234, - 2, 32, 3, 1, 255, 58, 2, 234, 2, 32, 5, 18, 255, 45, 248, 112, 32, 3, 18, - 255, 45, 248, 112, 32, 5, 1, 253, 223, 2, 234, 2, 32, 3, 1, 253, 223, 2, - 234, 2, 32, 5, 1, 253, 223, 2, 59, 108, 32, 3, 1, 253, 223, 2, 59, 108, - 32, 5, 1, 244, 10, 32, 3, 1, 244, 10, 32, 5, 1, 235, 66, 248, 88, 32, 3, - 1, 235, 66, 248, 88, 32, 5, 1, 235, 66, 253, 223, 2, 234, 2, 32, 3, 1, - 235, 66, 253, 223, 2, 234, 2, 32, 1, 236, 69, 32, 5, 1, 254, 16, 2, 239, - 255, 32, 3, 1, 254, 16, 2, 239, 255, 32, 5, 1, 255, 26, 2, 90, 32, 3, 1, - 255, 26, 2, 90, 32, 5, 1, 255, 49, 2, 242, 226, 32, 3, 1, 255, 49, 2, - 242, 226, 32, 5, 1, 255, 23, 2, 90, 32, 3, 1, 255, 23, 2, 90, 32, 5, 1, - 255, 23, 2, 242, 226, 32, 3, 1, 255, 23, 2, 242, 226, 32, 5, 1, 234, 59, - 248, 88, 32, 3, 1, 234, 59, 248, 88, 32, 5, 1, 255, 28, 2, 242, 226, 32, - 3, 1, 255, 28, 2, 242, 226, 32, 5, 1, 134, 2, 239, 255, 32, 3, 1, 134, 2, - 239, 255, 32, 5, 1, 134, 2, 175, 32, 3, 1, 134, 2, 175, 32, 5, 18, 134, - 253, 237, 32, 3, 18, 134, 253, 237, 32, 5, 1, 255, 42, 2, 239, 255, 32, - 3, 1, 255, 42, 2, 239, 255, 32, 5, 1, 240, 86, 32, 3, 1, 240, 86, 32, 5, - 1, 243, 73, 2, 175, 32, 3, 1, 243, 73, 2, 175, 32, 5, 1, 254, 16, 2, 175, - 32, 3, 1, 254, 16, 2, 175, 32, 5, 1, 255, 46, 2, 175, 32, 3, 1, 255, 46, - 2, 175, 32, 5, 1, 235, 66, 248, 126, 32, 3, 1, 235, 66, 248, 126, 32, 5, - 1, 220, 2, 196, 32, 3, 1, 220, 2, 196, 32, 5, 1, 220, 2, 175, 32, 3, 1, - 220, 2, 175, 32, 5, 1, 117, 2, 175, 32, 3, 1, 117, 2, 175, 32, 5, 1, 240, - 60, 73, 32, 3, 1, 240, 60, 73, 32, 5, 1, 240, 60, 117, 2, 175, 32, 3, 1, - 240, 60, 117, 2, 175, 32, 5, 1, 157, 2, 175, 32, 3, 1, 157, 2, 175, 32, - 5, 1, 132, 2, 196, 32, 3, 1, 132, 2, 196, 32, 5, 1, 132, 2, 175, 32, 3, - 1, 132, 2, 175, 32, 5, 1, 132, 2, 45, 135, 32, 3, 1, 132, 2, 45, 135, 32, - 5, 1, 253, 223, 2, 175, 32, 3, 1, 253, 223, 2, 175, 32, 5, 1, 253, 233, - 2, 234, 2, 32, 3, 1, 253, 233, 2, 234, 2, 32, 5, 1, 249, 207, 2, 175, 32, - 3, 1, 249, 207, 2, 175, 32, 5, 1, 248, 72, 253, 200, 32, 3, 1, 248, 72, - 253, 200, 32, 5, 1, 248, 72, 248, 150, 32, 3, 1, 248, 72, 248, 150, 32, - 5, 1, 248, 72, 249, 220, 32, 3, 1, 248, 72, 249, 220, 32, 5, 1, 248, 72, - 243, 167, 32, 3, 1, 248, 72, 243, 167, 32, 5, 1, 248, 72, 248, 165, 32, - 3, 1, 248, 72, 248, 165, 32, 5, 1, 248, 72, 248, 174, 32, 3, 1, 248, 72, - 248, 174, 32, 5, 1, 248, 72, 249, 165, 32, 3, 1, 248, 72, 249, 165, 32, - 5, 1, 248, 72, 249, 178, 32, 3, 1, 248, 72, 249, 178, 100, 5, 1, 249, 28, - 100, 5, 1, 249, 32, 100, 5, 1, 249, 76, 100, 5, 1, 253, 133, 100, 5, 1, - 248, 208, 100, 5, 1, 253, 163, 100, 5, 1, 254, 36, 100, 5, 1, 254, 60, - 100, 5, 1, 87, 100, 5, 1, 248, 123, 100, 5, 1, 248, 216, 100, 5, 1, 243, - 216, 100, 5, 1, 249, 17, 100, 5, 1, 253, 152, 100, 5, 1, 249, 93, 100, 5, - 1, 253, 184, 100, 5, 1, 253, 146, 100, 5, 1, 243, 182, 100, 5, 1, 243, - 155, 100, 5, 1, 248, 228, 100, 5, 1, 253, 189, 100, 5, 1, 248, 175, 100, - 5, 1, 248, 46, 100, 5, 1, 254, 13, 100, 5, 1, 248, 57, 100, 5, 1, 248, - 237, 100, 5, 1, 243, 201, 100, 5, 1, 253, 130, 100, 5, 1, 249, 159, 100, - 5, 1, 249, 195, 100, 5, 1, 244, 32, 100, 5, 1, 248, 245, 100, 5, 1, 253, - 224, 100, 5, 1, 243, 136, 100, 5, 1, 243, 244, 100, 5, 1, 248, 218, 100, - 5, 1, 254, 118, 100, 5, 1, 248, 156, 100, 49, 1, 40, 137, 242, 233, 100, - 233, 59, 100, 237, 8, 69, 100, 233, 54, 69, 100, 240, 27, 100, 236, 156, - 69, 100, 232, 88, 69, 100, 3, 1, 249, 28, 100, 3, 1, 249, 32, 100, 3, 1, - 249, 76, 100, 3, 1, 253, 133, 100, 3, 1, 248, 208, 100, 3, 1, 253, 163, - 100, 3, 1, 254, 36, 100, 3, 1, 254, 60, 100, 3, 1, 87, 100, 3, 1, 248, - 123, 100, 3, 1, 248, 216, 100, 3, 1, 243, 216, 100, 3, 1, 249, 17, 100, - 3, 1, 253, 152, 100, 3, 1, 249, 93, 100, 3, 1, 253, 184, 100, 3, 1, 253, - 146, 100, 3, 1, 243, 182, 100, 3, 1, 243, 155, 100, 3, 1, 248, 228, 100, - 3, 1, 253, 189, 100, 3, 1, 248, 175, 100, 3, 1, 248, 46, 100, 3, 1, 254, - 13, 100, 3, 1, 248, 57, 100, 3, 1, 248, 237, 100, 3, 1, 243, 201, 100, 3, - 1, 253, 130, 100, 3, 1, 249, 159, 100, 3, 1, 249, 195, 100, 3, 1, 244, - 32, 100, 3, 1, 248, 245, 100, 3, 1, 253, 224, 100, 3, 1, 243, 136, 100, - 3, 1, 243, 244, 100, 3, 1, 248, 218, 100, 3, 1, 254, 118, 100, 3, 1, 248, - 156, 100, 3, 18, 254, 159, 243, 136, 100, 248, 37, 208, 100, 238, 93, 68, - 240, 2, 237, 152, 68, 240, 2, 240, 145, 68, 240, 2, 233, 242, 68, 240, 2, - 244, 64, 240, 212, 68, 240, 2, 244, 64, 241, 120, 68, 240, 2, 239, 222, - 68, 240, 2, 242, 81, 68, 240, 2, 242, 200, 68, 240, 2, 239, 158, 68, 240, - 2, 242, 197, 68, 240, 2, 242, 145, 68, 240, 2, 238, 186, 68, 240, 2, 241, - 126, 239, 141, 68, 240, 2, 234, 56, 68, 240, 2, 242, 71, 246, 238, 68, - 240, 2, 238, 224, 239, 80, 68, 240, 2, 242, 50, 68, 240, 2, 244, 85, 239, - 88, 68, 240, 2, 241, 250, 68, 240, 2, 236, 54, 68, 240, 2, 239, 134, 68, - 240, 2, 241, 235, 239, 106, 68, 240, 2, 241, 73, 68, 240, 2, 242, 69, 68, - 240, 2, 238, 224, 239, 171, 68, 240, 2, 247, 225, 254, 145, 247, 232, 68, - 240, 2, 252, 58, 68, 240, 2, 245, 226, 68, 240, 2, 245, 61, 68, 240, 2, - 242, 208, 68, 158, 241, 230, 238, 51, 68, 242, 232, 242, 105, 68, 242, - 232, 243, 98, 240, 145, 68, 242, 232, 243, 98, 240, 118, 68, 242, 232, - 243, 98, 238, 149, 68, 242, 232, 240, 187, 68, 242, 232, 242, 159, 68, - 242, 232, 240, 145, 68, 242, 232, 240, 118, 68, 242, 232, 238, 149, 68, - 242, 232, 240, 188, 68, 242, 232, 239, 172, 68, 242, 232, 240, 133, 128, - 240, 140, 68, 242, 232, 241, 236, 68, 233, 51, 241, 228, 68, 242, 232, - 243, 70, 68, 233, 51, 242, 47, 68, 242, 232, 248, 102, 248, 40, 68, 242, - 232, 254, 73, 248, 40, 68, 233, 51, 254, 240, 242, 48, 68, 158, 189, 248, - 40, 68, 158, 168, 248, 40, 68, 233, 51, 254, 114, 237, 167, 68, 242, 232, - 242, 70, 240, 212, 68, 1, 243, 3, 68, 1, 250, 117, 68, 1, 241, 136, 68, - 1, 240, 165, 68, 1, 253, 168, 68, 1, 249, 192, 68, 1, 242, 201, 68, 1, - 251, 54, 68, 1, 249, 176, 68, 1, 248, 193, 68, 1, 30, 248, 116, 68, 1, - 248, 116, 68, 1, 240, 139, 68, 1, 30, 248, 166, 68, 1, 248, 166, 68, 1, - 30, 248, 132, 68, 1, 248, 132, 68, 1, 239, 178, 68, 1, 243, 144, 68, 1, - 30, 253, 175, 68, 1, 253, 175, 68, 1, 30, 240, 248, 68, 1, 240, 248, 68, - 1, 252, 99, 68, 1, 243, 253, 68, 1, 243, 33, 68, 1, 249, 175, 68, 18, - 238, 126, 45, 249, 192, 68, 18, 238, 126, 254, 76, 248, 193, 68, 18, 238, - 126, 45, 248, 193, 68, 233, 51, 238, 186, 68, 233, 51, 234, 56, 11, 61, - 52, 11, 21, 242, 97, 11, 237, 159, 238, 95, 11, 21, 242, 93, 238, 237, - 52, 11, 240, 27, 11, 250, 186, 234, 6, 11, 242, 63, 244, 46, 52, 11, 21, - 241, 245, 11, 21, 233, 100, 240, 107, 235, 40, 11, 21, 240, 107, 235, - 173, 11, 21, 233, 228, 238, 242, 11, 21, 252, 127, 238, 244, 244, 80, 11, - 21, 235, 31, 11, 3, 200, 248, 137, 11, 234, 14, 11, 240, 3, 53, 233, 51, - 69, 11, 236, 156, 69, 11, 1, 240, 186, 11, 1, 83, 2, 243, 42, 48, 11, 1, - 83, 2, 143, 48, 11, 1, 253, 220, 2, 143, 48, 11, 1, 83, 2, 143, 46, 11, - 1, 57, 2, 143, 48, 11, 1, 243, 3, 11, 1, 249, 31, 11, 1, 253, 127, 237, - 200, 11, 1, 252, 213, 11, 1, 247, 142, 11, 1, 243, 200, 11, 1, 251, 45, - 11, 1, 243, 205, 11, 1, 250, 180, 11, 1, 247, 141, 11, 1, 248, 245, 11, - 1, 244, 63, 11, 1, 243, 120, 11, 1, 242, 103, 11, 1, 252, 165, 11, 1, - 250, 178, 11, 1, 248, 137, 11, 1, 253, 97, 11, 1, 248, 105, 11, 1, 240, - 180, 11, 238, 22, 11, 1, 248, 156, 11, 1, 249, 145, 11, 1, 248, 116, 11, - 1, 251, 182, 11, 1, 243, 223, 11, 1, 243, 236, 11, 1, 251, 50, 11, 1, - 248, 142, 11, 1, 83, 236, 232, 11, 1, 248, 144, 11, 236, 18, 11, 235, - 197, 11, 236, 43, 11, 241, 103, 11, 240, 134, 11, 241, 193, 11, 239, 191, - 11, 240, 240, 11, 241, 223, 48, 11, 143, 48, 11, 143, 46, 11, 235, 48, - 243, 3, 11, 236, 145, 240, 134, 11, 158, 198, 238, 187, 11, 236, 144, 11, - 33, 21, 3, 255, 110, 48, 11, 33, 21, 236, 145, 3, 255, 110, 48, 11, 33, - 21, 53, 46, 11, 224, 240, 134, 11, 243, 40, 2, 171, 243, 5, 232, 73, 26, - 242, 217, 232, 73, 26, 127, 232, 73, 26, 111, 232, 73, 26, 166, 232, 73, - 26, 177, 232, 73, 26, 176, 232, 73, 26, 187, 232, 73, 26, 203, 232, 73, - 26, 195, 232, 73, 26, 202, 11, 238, 107, 52, 11, 238, 176, 234, 6, 11, - 235, 114, 234, 6, 11, 248, 48, 238, 74, 242, 229, 11, 1, 238, 70, 249, - 31, 11, 1, 238, 70, 249, 145, 11, 1, 233, 49, 243, 3, 11, 1, 83, 242, - 182, 11, 1, 83, 2, 248, 103, 143, 48, 11, 1, 83, 2, 248, 103, 143, 46, - 11, 1, 200, 240, 186, 11, 1, 200, 143, 243, 3, 11, 1, 200, 143, 248, 142, - 11, 1, 132, 2, 143, 48, 11, 1, 200, 143, 248, 144, 11, 1, 247, 165, 11, - 1, 239, 231, 11, 1, 244, 214, 11, 1, 253, 127, 2, 242, 233, 11, 1, 253, - 127, 2, 204, 181, 60, 234, 9, 11, 1, 248, 237, 11, 1, 242, 143, 11, 1, - 241, 28, 11, 1, 94, 2, 143, 48, 11, 1, 94, 2, 171, 181, 59, 48, 11, 1, - 246, 201, 11, 1, 245, 77, 11, 1, 94, 2, 204, 181, 48, 11, 1, 242, 142, - 11, 1, 238, 23, 11, 1, 245, 37, 11, 1, 253, 199, 2, 242, 233, 11, 1, 253, - 199, 2, 53, 46, 11, 1, 253, 199, 2, 53, 242, 230, 19, 3, 248, 137, 11, 1, - 241, 71, 11, 1, 239, 38, 11, 1, 250, 208, 11, 1, 253, 199, 2, 204, 181, - 60, 234, 9, 11, 1, 253, 199, 2, 248, 58, 181, 48, 11, 1, 247, 36, 11, 1, - 253, 143, 2, 3, 179, 11, 1, 253, 143, 2, 242, 233, 11, 1, 253, 143, 2, - 53, 46, 11, 1, 253, 143, 2, 3, 255, 110, 46, 11, 1, 253, 143, 2, 53, 242, - 230, 19, 53, 48, 11, 1, 253, 143, 2, 171, 181, 48, 11, 1, 251, 112, 11, - 1, 253, 143, 2, 248, 58, 181, 48, 11, 1, 248, 39, 2, 53, 242, 230, 19, - 53, 48, 11, 1, 248, 39, 2, 204, 181, 46, 11, 1, 248, 39, 2, 204, 181, - 242, 230, 19, 204, 181, 48, 11, 1, 253, 157, 2, 171, 181, 46, 11, 1, 253, - 157, 2, 204, 181, 48, 11, 1, 253, 169, 2, 204, 181, 48, 11, 1, 253, 158, - 2, 204, 181, 48, 11, 1, 238, 70, 248, 156, 11, 1, 253, 153, 2, 53, 246, - 92, 46, 11, 1, 253, 153, 2, 53, 46, 11, 1, 253, 10, 11, 1, 253, 153, 2, - 204, 181, 46, 11, 1, 242, 53, 11, 1, 253, 167, 2, 53, 48, 11, 1, 253, - 167, 2, 204, 181, 48, 11, 1, 241, 197, 11, 1, 243, 126, 248, 116, 11, 1, - 253, 135, 2, 242, 233, 11, 1, 253, 135, 2, 53, 48, 11, 1, 254, 26, 11, 1, - 253, 135, 2, 204, 181, 46, 11, 1, 251, 5, 11, 1, 253, 246, 2, 242, 233, - 11, 1, 242, 8, 11, 1, 253, 246, 2, 171, 181, 46, 11, 1, 245, 129, 11, 1, - 253, 246, 2, 204, 181, 48, 11, 1, 182, 2, 3, 179, 11, 1, 182, 2, 53, 48, - 11, 1, 182, 2, 204, 181, 48, 11, 1, 182, 2, 204, 181, 46, 11, 1, 198, 2, - 53, 46, 11, 1, 198, 238, 187, 11, 1, 242, 85, 11, 1, 198, 2, 242, 233, - 11, 1, 198, 2, 204, 181, 48, 11, 1, 253, 124, 232, 133, 11, 1, 243, 47, - 2, 53, 48, 11, 1, 253, 124, 2, 57, 48, 11, 1, 253, 124, 243, 185, 11, 1, - 253, 124, 248, 128, 2, 143, 48, 11, 1, 253, 127, 238, 144, 243, 185, 11, - 1, 253, 220, 2, 242, 233, 11, 1, 238, 73, 253, 193, 11, 1, 253, 193, 11, - 1, 79, 11, 1, 253, 161, 11, 1, 238, 73, 253, 161, 11, 1, 253, 220, 2, - 171, 181, 48, 11, 1, 254, 12, 11, 1, 243, 26, 248, 144, 11, 1, 57, 2, - 242, 226, 11, 1, 57, 2, 3, 179, 11, 1, 253, 220, 2, 53, 48, 11, 1, 72, - 11, 1, 57, 2, 204, 181, 46, 11, 1, 57, 239, 5, 11, 1, 57, 240, 92, 2, - 143, 48, 11, 248, 37, 208, 11, 1, 253, 178, 11, 3, 200, 18, 253, 157, 2, - 182, 2, 83, 236, 232, 11, 3, 200, 18, 253, 167, 2, 182, 2, 83, 236, 232, - 11, 3, 200, 51, 54, 13, 11, 3, 200, 182, 243, 3, 11, 3, 200, 243, 200, - 11, 3, 200, 204, 243, 5, 11, 3, 200, 243, 120, 11, 253, 165, 147, 244, - 87, 11, 243, 124, 147, 254, 237, 255, 49, 245, 147, 11, 3, 200, 238, 121, - 242, 217, 11, 3, 200, 239, 234, 233, 97, 242, 217, 11, 3, 200, 238, 70, - 251, 49, 147, 243, 205, 11, 3, 200, 51, 39, 13, 11, 3, 170, 243, 120, 11, - 3, 200, 241, 222, 11, 3, 248, 142, 11, 3, 248, 144, 11, 3, 200, 248, 144, - 11, 3, 200, 243, 236, 11, 243, 245, 147, 239, 177, 11, 243, 15, 240, 46, - 170, 208, 11, 243, 15, 240, 46, 200, 208, 11, 238, 121, 200, 248, 119, 2, - 241, 109, 238, 129, 11, 3, 170, 243, 223, 11, 1, 253, 199, 2, 236, 145, - 179, 11, 1, 253, 143, 2, 236, 145, 179, 236, 174, 232, 73, 26, 242, 217, - 236, 174, 232, 73, 26, 127, 236, 174, 232, 73, 26, 111, 236, 174, 232, - 73, 26, 166, 236, 174, 232, 73, 26, 177, 236, 174, 232, 73, 26, 176, 236, - 174, 232, 73, 26, 187, 236, 174, 232, 73, 26, 203, 236, 174, 232, 73, 26, - 195, 236, 174, 232, 73, 26, 202, 11, 1, 242, 216, 2, 53, 46, 11, 1, 253, - 155, 2, 53, 46, 11, 1, 242, 240, 2, 53, 46, 11, 21, 240, 233, 234, 17, - 11, 21, 240, 233, 232, 197, 248, 228, 11, 1, 253, 124, 2, 236, 145, 179, - 129, 253, 165, 147, 234, 232, 129, 233, 80, 248, 37, 208, 129, 235, 110, - 248, 37, 208, 129, 233, 80, 240, 24, 129, 235, 110, 240, 24, 129, 163, - 240, 24, 129, 243, 14, 240, 122, 242, 220, 129, 243, 14, 240, 122, 225, - 129, 233, 80, 243, 14, 240, 122, 242, 220, 129, 235, 110, 243, 14, 240, - 122, 225, 129, 232, 121, 129, 236, 227, 239, 150, 129, 236, 227, 234, - 222, 129, 236, 227, 233, 117, 129, 232, 88, 69, 129, 1, 240, 155, 129, 1, - 233, 49, 240, 155, 129, 1, 244, 219, 129, 1, 241, 121, 129, 1, 245, 96, - 235, 123, 129, 1, 239, 35, 129, 1, 238, 70, 241, 72, 243, 255, 129, 1, - 253, 168, 129, 1, 248, 142, 129, 1, 244, 63, 129, 1, 245, 142, 129, 1, - 247, 140, 129, 1, 252, 216, 235, 123, 129, 1, 247, 238, 129, 1, 253, 87, - 253, 168, 129, 1, 246, 5, 129, 1, 239, 113, 129, 1, 251, 235, 129, 1, - 248, 132, 129, 1, 237, 37, 129, 1, 30, 237, 37, 129, 1, 72, 129, 1, 253, - 175, 129, 1, 224, 253, 175, 129, 1, 242, 92, 129, 1, 247, 6, 129, 1, 243, - 255, 129, 1, 243, 33, 129, 1, 252, 211, 129, 1, 184, 241, 30, 129, 1, - 184, 239, 84, 129, 1, 184, 237, 104, 129, 240, 143, 48, 129, 240, 143, - 46, 129, 240, 143, 238, 136, 129, 240, 154, 48, 129, 240, 154, 46, 129, - 240, 154, 238, 136, 129, 243, 252, 48, 129, 243, 252, 46, 129, 240, 4, - 244, 66, 233, 50, 129, 240, 4, 244, 66, 237, 61, 129, 243, 192, 48, 129, - 243, 192, 46, 129, 233, 205, 238, 136, 129, 243, 170, 48, 129, 243, 170, - 46, 129, 242, 91, 129, 237, 9, 248, 40, 129, 234, 244, 129, 236, 94, 129, + 0, 231, 193, 248, 156, 69, 235, 13, 69, 61, 52, 250, 107, 52, 236, 56, + 52, 255, 11, 254, 222, 40, 236, 106, 38, 236, 106, 254, 159, 235, 214, + 52, 251, 214, 245, 247, 247, 231, 208, 231, 208, 26, 227, 80, 26, 127, + 26, 111, 26, 166, 26, 177, 26, 176, 26, 187, 26, 203, 26, 195, 26, 202, + 251, 219, 232, 176, 239, 228, 52, 248, 202, 52, 247, 43, 52, 235, 23, 69, + 251, 213, 254, 153, 8, 5, 1, 67, 8, 5, 1, 217, 8, 5, 1, 252, 178, 8, 5, + 1, 209, 8, 5, 1, 72, 8, 5, 1, 248, 140, 8, 5, 1, 210, 8, 5, 1, 192, 8, 5, + 1, 71, 8, 5, 1, 221, 8, 5, 1, 241, 12, 8, 5, 1, 162, 8, 5, 1, 173, 8, 5, + 1, 197, 8, 5, 1, 73, 8, 5, 1, 223, 8, 5, 1, 235, 93, 8, 5, 1, 144, 8, 5, + 1, 193, 8, 5, 1, 214, 8, 5, 1, 79, 8, 5, 1, 179, 8, 5, 1, 228, 144, 8, 5, + 1, 206, 8, 5, 1, 228, 7, 8, 5, 1, 227, 103, 40, 31, 104, 234, 158, 231, + 208, 38, 31, 104, 190, 255, 90, 170, 239, 193, 247, 46, 255, 90, 8, 3, 1, + 67, 8, 3, 1, 217, 8, 3, 1, 252, 178, 8, 3, 1, 209, 8, 3, 1, 72, 8, 3, 1, + 248, 140, 8, 3, 1, 210, 8, 3, 1, 192, 8, 3, 1, 71, 8, 3, 1, 221, 8, 3, 1, + 241, 12, 8, 3, 1, 162, 8, 3, 1, 173, 8, 3, 1, 197, 8, 3, 1, 73, 8, 3, 1, + 223, 8, 3, 1, 235, 93, 8, 3, 1, 144, 8, 3, 1, 193, 8, 3, 1, 214, 8, 3, 1, + 79, 8, 3, 1, 179, 8, 3, 1, 228, 144, 8, 3, 1, 206, 8, 3, 1, 228, 7, 8, 3, + 1, 227, 103, 40, 251, 134, 104, 59, 239, 193, 38, 251, 134, 104, 169, + 237, 137, 231, 193, 241, 143, 248, 156, 69, 252, 109, 52, 235, 182, 52, + 251, 133, 52, 227, 205, 52, 252, 226, 125, 233, 196, 52, 175, 251, 176, + 52, 248, 92, 236, 182, 241, 183, 239, 247, 45, 185, 235, 13, 69, 161, 52, + 231, 212, 245, 248, 234, 187, 52, 196, 250, 243, 52, 235, 212, 52, 231, + 28, 111, 231, 28, 166, 255, 83, 255, 90, 238, 225, 52, 235, 233, 52, 238, + 223, 250, 100, 252, 115, 231, 28, 127, 239, 56, 236, 182, 241, 183, 234, + 119, 45, 185, 235, 13, 69, 228, 158, 247, 248, 236, 210, 235, 30, 228, + 158, 247, 248, 236, 210, 246, 236, 228, 158, 247, 248, 204, 235, 28, 241, + 143, 235, 23, 69, 8, 5, 1, 134, 2, 191, 8, 5, 1, 134, 2, 135, 8, 5, 1, + 134, 2, 252, 2, 8, 5, 1, 134, 2, 169, 8, 5, 1, 134, 2, 175, 8, 5, 1, 134, + 2, 234, 108, 48, 8, 5, 1, 255, 75, 8, 5, 1, 252, 179, 2, 252, 115, 8, 5, + 1, 157, 2, 191, 8, 5, 1, 157, 2, 135, 8, 5, 1, 157, 2, 252, 2, 8, 5, 1, + 157, 2, 175, 8, 5, 1, 220, 2, 191, 8, 5, 1, 220, 2, 135, 8, 5, 1, 220, 2, + 252, 2, 8, 5, 1, 220, 2, 175, 8, 5, 1, 248, 174, 8, 5, 1, 238, 94, 2, + 169, 8, 5, 1, 117, 2, 191, 8, 5, 1, 117, 2, 135, 8, 5, 1, 117, 2, 252, 2, + 8, 5, 1, 117, 2, 169, 8, 5, 1, 117, 2, 175, 238, 133, 52, 8, 5, 1, 117, + 2, 108, 8, 5, 1, 132, 2, 191, 8, 5, 1, 132, 2, 135, 8, 5, 1, 132, 2, 252, + 2, 8, 5, 1, 132, 2, 175, 8, 5, 1, 228, 8, 2, 135, 8, 5, 1, 230, 34, 8, 3, + 1, 232, 132, 193, 8, 3, 1, 134, 2, 191, 8, 3, 1, 134, 2, 135, 8, 3, 1, + 134, 2, 252, 2, 8, 3, 1, 134, 2, 169, 8, 3, 1, 134, 2, 175, 8, 3, 1, 134, + 2, 234, 108, 48, 8, 3, 1, 255, 75, 8, 3, 1, 252, 179, 2, 252, 115, 8, 3, + 1, 157, 2, 191, 8, 3, 1, 157, 2, 135, 8, 3, 1, 157, 2, 252, 2, 8, 3, 1, + 157, 2, 175, 8, 3, 1, 220, 2, 191, 8, 3, 1, 220, 2, 135, 8, 3, 1, 220, 2, + 252, 2, 8, 3, 1, 220, 2, 175, 8, 3, 1, 248, 174, 8, 3, 1, 238, 94, 2, + 169, 8, 3, 1, 117, 2, 191, 8, 3, 1, 117, 2, 135, 8, 3, 1, 117, 2, 252, 2, + 8, 3, 1, 117, 2, 169, 8, 3, 1, 117, 2, 175, 250, 133, 52, 8, 3, 1, 117, + 2, 108, 8, 3, 1, 132, 2, 191, 8, 3, 1, 132, 2, 135, 8, 3, 1, 132, 2, 252, + 2, 8, 3, 1, 132, 2, 175, 8, 3, 1, 228, 8, 2, 135, 8, 3, 1, 230, 34, 8, 3, + 1, 228, 8, 2, 175, 8, 5, 1, 134, 2, 196, 8, 3, 1, 134, 2, 196, 8, 5, 1, + 134, 2, 252, 231, 8, 3, 1, 134, 2, 252, 231, 8, 5, 1, 134, 2, 236, 230, + 8, 3, 1, 134, 2, 236, 230, 8, 5, 1, 252, 179, 2, 135, 8, 3, 1, 252, 179, + 2, 135, 8, 5, 1, 252, 179, 2, 252, 2, 8, 3, 1, 252, 179, 2, 252, 2, 8, 5, + 1, 252, 179, 2, 53, 48, 8, 3, 1, 252, 179, 2, 53, 48, 8, 5, 1, 252, 179, + 2, 252, 148, 8, 3, 1, 252, 179, 2, 252, 148, 8, 5, 1, 251, 104, 2, 252, + 148, 8, 3, 1, 251, 104, 2, 252, 148, 8, 5, 1, 251, 104, 2, 108, 8, 3, 1, + 251, 104, 2, 108, 8, 5, 1, 157, 2, 196, 8, 3, 1, 157, 2, 196, 8, 5, 1, + 157, 2, 252, 231, 8, 3, 1, 157, 2, 252, 231, 8, 5, 1, 157, 2, 53, 48, 8, + 3, 1, 157, 2, 53, 48, 8, 5, 1, 157, 2, 236, 230, 8, 3, 1, 157, 2, 236, + 230, 8, 5, 1, 157, 2, 252, 148, 8, 3, 1, 157, 2, 252, 148, 8, 5, 1, 247, + 209, 2, 252, 2, 8, 3, 1, 247, 209, 2, 252, 2, 8, 5, 1, 247, 209, 2, 252, + 231, 8, 3, 1, 247, 209, 2, 252, 231, 8, 5, 1, 247, 209, 2, 53, 48, 8, 3, + 1, 247, 209, 2, 53, 48, 8, 5, 1, 247, 209, 2, 252, 115, 8, 3, 1, 247, + 209, 2, 252, 115, 8, 5, 1, 246, 254, 2, 252, 2, 8, 3, 1, 246, 254, 2, + 252, 2, 8, 5, 1, 246, 254, 2, 108, 8, 3, 1, 246, 254, 2, 108, 8, 5, 1, + 220, 2, 169, 8, 3, 1, 220, 2, 169, 8, 5, 1, 220, 2, 196, 8, 3, 1, 220, 2, + 196, 8, 5, 1, 220, 2, 252, 231, 8, 3, 1, 220, 2, 252, 231, 8, 5, 1, 220, + 2, 236, 230, 8, 3, 1, 220, 2, 236, 230, 8, 5, 1, 220, 2, 53, 48, 8, 3, 1, + 250, 99, 71, 8, 5, 18, 241, 207, 8, 3, 18, 241, 207, 8, 5, 1, 241, 109, + 2, 252, 2, 8, 3, 1, 241, 109, 2, 252, 2, 8, 5, 1, 241, 13, 2, 252, 115, + 8, 3, 1, 241, 13, 2, 252, 115, 8, 3, 1, 240, 102, 8, 5, 1, 240, 44, 2, + 135, 8, 3, 1, 240, 44, 2, 135, 8, 5, 1, 240, 44, 2, 252, 115, 8, 3, 1, + 240, 44, 2, 252, 115, 8, 5, 1, 240, 44, 2, 252, 148, 8, 3, 1, 240, 44, 2, + 252, 148, 8, 5, 1, 240, 44, 2, 238, 223, 250, 100, 8, 3, 1, 240, 44, 2, + 238, 223, 250, 100, 8, 5, 1, 240, 44, 2, 108, 8, 3, 1, 240, 44, 2, 108, + 8, 5, 1, 238, 94, 2, 135, 8, 3, 1, 238, 94, 2, 135, 8, 5, 1, 238, 94, 2, + 252, 115, 8, 3, 1, 238, 94, 2, 252, 115, 8, 5, 1, 238, 94, 2, 252, 148, + 8, 3, 1, 238, 94, 2, 252, 148, 8, 3, 1, 238, 94, 235, 165, 252, 189, 254, + 222, 8, 5, 1, 248, 224, 8, 3, 1, 248, 224, 8, 5, 1, 117, 2, 196, 8, 3, 1, + 117, 2, 196, 8, 5, 1, 117, 2, 252, 231, 8, 3, 1, 117, 2, 252, 231, 8, 5, + 1, 117, 2, 45, 135, 8, 3, 1, 117, 2, 45, 135, 8, 5, 18, 236, 234, 8, 3, + 18, 236, 234, 8, 5, 1, 234, 239, 2, 135, 8, 3, 1, 234, 239, 2, 135, 8, 5, + 1, 234, 239, 2, 252, 115, 8, 3, 1, 234, 239, 2, 252, 115, 8, 5, 1, 234, + 239, 2, 252, 148, 8, 3, 1, 234, 239, 2, 252, 148, 8, 5, 1, 234, 11, 2, + 135, 8, 3, 1, 234, 11, 2, 135, 8, 5, 1, 234, 11, 2, 252, 2, 8, 3, 1, 234, + 11, 2, 252, 2, 8, 5, 1, 234, 11, 2, 252, 115, 8, 3, 1, 234, 11, 2, 252, + 115, 8, 5, 1, 234, 11, 2, 252, 148, 8, 3, 1, 234, 11, 2, 252, 148, 8, 5, + 1, 230, 183, 2, 252, 115, 8, 3, 1, 230, 183, 2, 252, 115, 8, 5, 1, 230, + 183, 2, 252, 148, 8, 3, 1, 230, 183, 2, 252, 148, 8, 5, 1, 230, 183, 2, + 108, 8, 3, 1, 230, 183, 2, 108, 8, 5, 1, 132, 2, 169, 8, 3, 1, 132, 2, + 169, 8, 5, 1, 132, 2, 196, 8, 3, 1, 132, 2, 196, 8, 5, 1, 132, 2, 252, + 231, 8, 3, 1, 132, 2, 252, 231, 8, 5, 1, 132, 2, 234, 108, 48, 8, 3, 1, + 132, 2, 234, 108, 48, 8, 5, 1, 132, 2, 45, 135, 8, 3, 1, 132, 2, 45, 135, + 8, 5, 1, 132, 2, 236, 230, 8, 3, 1, 132, 2, 236, 230, 8, 5, 1, 228, 145, + 2, 252, 2, 8, 3, 1, 228, 145, 2, 252, 2, 8, 5, 1, 228, 8, 2, 252, 2, 8, + 3, 1, 228, 8, 2, 252, 2, 8, 5, 1, 228, 8, 2, 175, 8, 5, 1, 227, 104, 2, + 135, 8, 3, 1, 227, 104, 2, 135, 8, 5, 1, 227, 104, 2, 53, 48, 8, 3, 1, + 227, 104, 2, 53, 48, 8, 5, 1, 227, 104, 2, 252, 148, 8, 3, 1, 227, 104, + 2, 252, 148, 8, 3, 1, 183, 193, 8, 3, 1, 41, 2, 108, 8, 5, 1, 41, 2, 90, + 8, 5, 1, 41, 2, 229, 205, 8, 3, 1, 41, 2, 229, 205, 8, 5, 1, 188, 187, 8, + 3, 1, 188, 187, 8, 5, 1, 236, 195, 73, 8, 5, 1, 252, 179, 2, 90, 8, 3, 1, + 252, 179, 2, 90, 8, 5, 1, 255, 66, 209, 8, 5, 1, 251, 104, 2, 90, 8, 5, + 1, 251, 104, 2, 229, 205, 8, 3, 1, 251, 104, 2, 229, 205, 8, 3, 1, 205, + 250, 229, 8, 5, 1, 224, 72, 8, 5, 1, 233, 212, 8, 5, 1, 236, 195, 72, 8, + 5, 1, 248, 141, 2, 90, 8, 3, 1, 248, 141, 2, 90, 8, 5, 1, 247, 209, 2, + 90, 8, 5, 1, 247, 195, 8, 3, 1, 246, 24, 8, 5, 1, 241, 137, 8, 5, 1, 220, + 2, 108, 8, 5, 1, 241, 13, 2, 90, 8, 3, 1, 241, 13, 2, 90, 8, 3, 1, 240, + 44, 2, 125, 8, 3, 1, 240, 24, 2, 108, 8, 5, 1, 205, 173, 8, 5, 1, 238, + 94, 2, 40, 90, 8, 3, 1, 238, 94, 2, 183, 38, 239, 241, 8, 5, 1, 117, 2, + 238, 223, 169, 8, 5, 1, 117, 2, 246, 50, 8, 3, 1, 117, 2, 246, 50, 8, 5, + 1, 236, 226, 8, 3, 1, 236, 226, 8, 5, 1, 236, 144, 2, 90, 8, 3, 1, 236, + 144, 2, 90, 8, 1, 227, 144, 8, 5, 1, 188, 111, 8, 3, 1, 188, 111, 8, 5, + 1, 248, 184, 8, 1, 224, 248, 185, 239, 148, 8, 3, 1, 230, 183, 2, 236, + 130, 90, 8, 5, 1, 230, 183, 2, 90, 8, 3, 1, 230, 183, 2, 90, 8, 5, 1, + 230, 183, 2, 234, 161, 90, 8, 5, 1, 132, 2, 246, 50, 8, 3, 1, 132, 2, + 246, 50, 8, 5, 1, 228, 252, 8, 5, 1, 228, 234, 2, 90, 8, 5, 1, 228, 8, 2, + 90, 8, 3, 1, 228, 8, 2, 90, 8, 5, 1, 227, 104, 2, 108, 8, 3, 1, 227, 104, + 2, 108, 8, 5, 1, 248, 142, 8, 5, 1, 248, 143, 234, 157, 8, 3, 1, 248, + 143, 234, 157, 8, 3, 1, 248, 143, 2, 230, 167, 8, 1, 171, 2, 108, 8, 5, + 1, 188, 176, 8, 3, 1, 188, 176, 8, 1, 241, 143, 247, 77, 231, 93, 2, 108, + 8, 1, 228, 56, 8, 1, 250, 226, 251, 246, 8, 1, 240, 10, 251, 246, 8, 1, + 255, 16, 251, 246, 8, 1, 234, 161, 251, 246, 8, 5, 1, 249, 49, 2, 252, + 148, 8, 5, 1, 251, 104, 2, 3, 1, 227, 104, 2, 252, 148, 8, 3, 1, 249, 49, + 2, 252, 148, 8, 5, 1, 239, 176, 8, 5, 1, 240, 44, 2, 3, 1, 221, 8, 3, 1, + 239, 176, 8, 5, 1, 237, 178, 8, 5, 1, 238, 94, 2, 3, 1, 221, 8, 3, 1, + 237, 178, 8, 5, 1, 134, 2, 252, 148, 8, 3, 1, 134, 2, 252, 148, 8, 5, 1, + 220, 2, 252, 148, 8, 3, 1, 220, 2, 252, 148, 8, 5, 1, 117, 2, 252, 148, + 8, 3, 1, 117, 2, 252, 148, 8, 5, 1, 132, 2, 252, 148, 8, 3, 1, 132, 2, + 252, 148, 8, 5, 1, 132, 2, 250, 201, 19, 196, 8, 3, 1, 132, 2, 250, 201, + 19, 196, 8, 5, 1, 132, 2, 250, 201, 19, 135, 8, 3, 1, 132, 2, 250, 201, + 19, 135, 8, 5, 1, 132, 2, 250, 201, 19, 252, 148, 8, 3, 1, 132, 2, 250, + 201, 19, 252, 148, 8, 5, 1, 132, 2, 250, 201, 19, 191, 8, 3, 1, 132, 2, + 250, 201, 19, 191, 8, 3, 1, 205, 72, 8, 5, 1, 134, 2, 250, 201, 19, 196, + 8, 3, 1, 134, 2, 250, 201, 19, 196, 8, 5, 1, 134, 2, 53, 60, 19, 196, 8, + 3, 1, 134, 2, 53, 60, 19, 196, 8, 5, 1, 255, 76, 2, 196, 8, 3, 1, 255, + 76, 2, 196, 8, 5, 1, 247, 209, 2, 108, 8, 3, 1, 247, 209, 2, 108, 8, 5, + 1, 247, 209, 2, 252, 148, 8, 3, 1, 247, 209, 2, 252, 148, 8, 5, 1, 241, + 13, 2, 252, 148, 8, 3, 1, 241, 13, 2, 252, 148, 8, 5, 1, 117, 2, 236, + 230, 8, 3, 1, 117, 2, 236, 230, 8, 5, 1, 117, 2, 236, 231, 19, 196, 8, 3, + 1, 117, 2, 236, 231, 19, 196, 8, 5, 1, 248, 143, 2, 252, 148, 8, 3, 1, + 248, 143, 2, 252, 148, 8, 3, 1, 241, 109, 2, 252, 148, 8, 5, 1, 249, 48, + 8, 5, 1, 251, 104, 2, 3, 1, 227, 103, 8, 3, 1, 249, 48, 8, 5, 1, 247, + 209, 2, 135, 8, 3, 1, 247, 209, 2, 135, 8, 5, 1, 246, 22, 8, 5, 1, 228, + 56, 8, 5, 1, 238, 94, 2, 191, 8, 3, 1, 238, 94, 2, 191, 8, 5, 1, 134, 2, + 234, 108, 60, 19, 135, 8, 3, 1, 134, 2, 234, 108, 60, 19, 135, 8, 5, 1, + 255, 76, 2, 135, 8, 3, 1, 255, 76, 2, 135, 8, 5, 1, 117, 2, 231, 79, 19, + 135, 8, 3, 1, 117, 2, 231, 79, 19, 135, 8, 5, 1, 134, 2, 45, 191, 8, 3, + 1, 134, 2, 45, 191, 8, 5, 1, 134, 2, 241, 143, 252, 231, 8, 3, 1, 134, 2, + 241, 143, 252, 231, 8, 5, 1, 157, 2, 45, 191, 8, 3, 1, 157, 2, 45, 191, + 8, 5, 1, 157, 2, 241, 143, 252, 231, 8, 3, 1, 157, 2, 241, 143, 252, 231, + 8, 5, 1, 220, 2, 45, 191, 8, 3, 1, 220, 2, 45, 191, 8, 5, 1, 220, 2, 241, + 143, 252, 231, 8, 3, 1, 220, 2, 241, 143, 252, 231, 8, 5, 1, 117, 2, 45, + 191, 8, 3, 1, 117, 2, 45, 191, 8, 5, 1, 117, 2, 241, 143, 252, 231, 8, 3, + 1, 117, 2, 241, 143, 252, 231, 8, 5, 1, 234, 239, 2, 45, 191, 8, 3, 1, + 234, 239, 2, 45, 191, 8, 5, 1, 234, 239, 2, 241, 143, 252, 231, 8, 3, 1, + 234, 239, 2, 241, 143, 252, 231, 8, 5, 1, 132, 2, 45, 191, 8, 3, 1, 132, + 2, 45, 191, 8, 5, 1, 132, 2, 241, 143, 252, 231, 8, 3, 1, 132, 2, 241, + 143, 252, 231, 8, 5, 1, 234, 11, 2, 251, 215, 46, 8, 3, 1, 234, 11, 2, + 251, 215, 46, 8, 5, 1, 230, 183, 2, 251, 215, 46, 8, 3, 1, 230, 183, 2, + 251, 215, 46, 8, 5, 1, 227, 158, 8, 3, 1, 227, 158, 8, 5, 1, 246, 254, 2, + 252, 148, 8, 3, 1, 246, 254, 2, 252, 148, 8, 5, 1, 238, 94, 2, 183, 38, + 239, 241, 8, 3, 1, 251, 104, 2, 251, 135, 8, 5, 1, 236, 167, 8, 3, 1, + 236, 167, 8, 5, 1, 227, 104, 2, 90, 8, 3, 1, 227, 104, 2, 90, 8, 5, 1, + 134, 2, 53, 48, 8, 3, 1, 134, 2, 53, 48, 8, 5, 1, 157, 2, 252, 115, 8, 3, + 1, 157, 2, 252, 115, 8, 5, 1, 117, 2, 250, 201, 19, 196, 8, 3, 1, 117, 2, + 250, 201, 19, 196, 8, 5, 1, 117, 2, 230, 1, 19, 196, 8, 3, 1, 117, 2, + 230, 1, 19, 196, 8, 5, 1, 117, 2, 53, 48, 8, 3, 1, 117, 2, 53, 48, 8, 5, + 1, 117, 2, 53, 60, 19, 196, 8, 3, 1, 117, 2, 53, 60, 19, 196, 8, 5, 1, + 228, 8, 2, 196, 8, 3, 1, 228, 8, 2, 196, 8, 3, 1, 240, 44, 2, 251, 135, + 8, 3, 1, 238, 94, 2, 251, 135, 8, 3, 1, 230, 183, 2, 251, 135, 8, 3, 1, + 250, 99, 221, 8, 3, 1, 251, 43, 250, 166, 8, 3, 1, 235, 39, 250, 166, 8, + 5, 1, 134, 2, 108, 8, 5, 1, 252, 179, 2, 108, 8, 3, 1, 252, 179, 2, 108, + 8, 5, 1, 240, 44, 2, 125, 8, 5, 1, 230, 183, 2, 250, 199, 108, 8, 3, 1, + 234, 11, 2, 231, 9, 230, 167, 8, 3, 1, 227, 104, 2, 231, 9, 230, 167, 8, + 5, 1, 247, 77, 208, 8, 3, 1, 205, 67, 8, 3, 1, 255, 21, 8, 3, 1, 205, + 255, 21, 8, 3, 1, 41, 2, 90, 8, 3, 1, 236, 195, 73, 8, 3, 1, 252, 179, 2, + 251, 135, 8, 3, 1, 251, 104, 2, 230, 167, 8, 3, 1, 251, 104, 2, 90, 8, 3, + 1, 224, 72, 8, 3, 1, 233, 212, 8, 3, 1, 233, 213, 2, 90, 8, 3, 1, 236, + 195, 72, 8, 3, 1, 224, 236, 195, 72, 8, 3, 1, 224, 236, 195, 157, 2, 90, + 8, 3, 1, 251, 239, 224, 236, 195, 72, 8, 3, 1, 250, 99, 241, 109, 2, 108, + 8, 3, 1, 247, 209, 2, 90, 8, 3, 1, 84, 210, 8, 1, 3, 5, 210, 8, 3, 1, + 247, 195, 8, 3, 1, 234, 217, 246, 50, 8, 3, 1, 205, 192, 8, 3, 1, 246, + 254, 2, 90, 8, 3, 1, 246, 189, 2, 90, 8, 3, 1, 220, 2, 108, 8, 3, 1, 241, + 137, 8, 1, 3, 5, 71, 8, 3, 1, 240, 44, 2, 238, 223, 169, 8, 3, 1, 240, + 44, 2, 253, 66, 8, 3, 1, 240, 44, 2, 234, 161, 90, 8, 3, 1, 239, 222, 8, + 3, 1, 205, 173, 8, 3, 1, 205, 239, 105, 2, 183, 239, 241, 8, 3, 1, 239, + 105, 2, 90, 8, 3, 1, 238, 94, 2, 40, 90, 8, 3, 1, 238, 94, 2, 234, 161, + 90, 8, 1, 3, 5, 197, 8, 3, 1, 253, 140, 73, 8, 1, 3, 5, 236, 234, 8, 3, + 1, 251, 239, 236, 216, 8, 3, 1, 236, 25, 8, 3, 1, 205, 144, 8, 3, 1, 205, + 234, 239, 2, 183, 239, 241, 8, 3, 1, 205, 234, 239, 2, 90, 8, 3, 1, 234, + 239, 2, 183, 239, 241, 8, 3, 1, 234, 239, 2, 230, 167, 8, 3, 1, 234, 239, + 2, 248, 51, 8, 3, 1, 224, 234, 239, 2, 248, 51, 8, 1, 3, 5, 144, 8, 1, 3, + 5, 241, 143, 144, 8, 3, 1, 234, 11, 2, 90, 8, 3, 1, 248, 184, 8, 3, 1, + 250, 99, 241, 109, 2, 231, 79, 19, 90, 8, 3, 1, 231, 167, 224, 248, 184, + 8, 3, 1, 248, 185, 2, 251, 135, 8, 3, 1, 205, 214, 8, 3, 1, 230, 183, 2, + 234, 161, 90, 8, 3, 1, 132, 125, 8, 3, 1, 228, 252, 8, 3, 1, 228, 234, 2, + 90, 8, 3, 1, 205, 179, 8, 3, 1, 205, 228, 144, 8, 3, 1, 205, 228, 7, 8, + 1, 3, 5, 228, 7, 8, 3, 1, 227, 104, 2, 234, 161, 90, 8, 3, 1, 227, 104, + 2, 251, 135, 8, 3, 1, 248, 142, 8, 3, 1, 248, 143, 2, 251, 135, 8, 1, + 247, 77, 208, 8, 1, 236, 29, 228, 171, 247, 240, 8, 1, 241, 143, 247, 77, + 208, 8, 1, 231, 83, 252, 178, 8, 1, 253, 33, 251, 246, 8, 1, 3, 5, 217, + 8, 3, 1, 251, 239, 236, 195, 72, 8, 1, 3, 5, 247, 209, 2, 90, 8, 1, 3, 5, + 192, 8, 3, 1, 241, 109, 2, 251, 149, 8, 3, 1, 205, 241, 12, 8, 1, 3, 5, + 162, 8, 3, 1, 235, 94, 2, 90, 8, 1, 247, 77, 231, 93, 2, 108, 8, 1, 224, + 247, 77, 231, 93, 2, 108, 8, 3, 1, 249, 49, 250, 166, 8, 3, 1, 250, 209, + 250, 166, 8, 3, 1, 249, 49, 250, 167, 2, 251, 135, 8, 3, 1, 229, 150, + 250, 166, 8, 3, 1, 230, 107, 250, 166, 8, 3, 1, 230, 137, 250, 167, 2, + 251, 135, 8, 3, 1, 248, 90, 250, 166, 8, 3, 1, 239, 136, 250, 166, 8, 3, + 1, 239, 106, 250, 166, 8, 1, 253, 33, 236, 55, 8, 1, 253, 40, 236, 55, 8, + 3, 1, 205, 246, 254, 2, 248, 51, 8, 3, 1, 205, 246, 254, 2, 248, 52, 19, + 230, 167, 49, 1, 3, 192, 49, 1, 3, 246, 254, 2, 90, 49, 1, 3, 221, 49, 1, + 3, 144, 49, 1, 3, 205, 144, 49, 1, 3, 205, 234, 239, 2, 90, 49, 1, 3, 5, + 241, 143, 144, 49, 1, 3, 228, 144, 49, 1, 3, 228, 7, 49, 1, 235, 156, 49, + 1, 45, 235, 156, 49, 1, 205, 251, 214, 49, 1, 254, 222, 49, 1, 224, 251, + 214, 49, 1, 38, 137, 234, 107, 49, 1, 40, 137, 234, 107, 49, 1, 247, 77, + 208, 49, 1, 224, 247, 77, 208, 49, 1, 40, 254, 174, 49, 1, 38, 254, 174, + 49, 1, 88, 254, 174, 49, 1, 92, 254, 174, 49, 1, 190, 255, 90, 252, 148, + 49, 1, 59, 239, 193, 49, 1, 196, 49, 1, 255, 83, 255, 90, 49, 1, 247, 46, + 255, 90, 49, 1, 170, 59, 239, 193, 49, 1, 170, 196, 49, 1, 170, 247, 46, + 255, 90, 49, 1, 170, 255, 83, 255, 90, 49, 1, 229, 179, 251, 219, 49, 1, + 137, 229, 179, 251, 219, 49, 1, 252, 106, 38, 137, 234, 107, 49, 1, 252, + 106, 40, 137, 234, 107, 49, 1, 88, 230, 174, 49, 1, 92, 230, 174, 49, 1, + 235, 214, 52, 49, 1, 238, 192, 52, 252, 231, 53, 48, 234, 108, 48, 236, + 230, 3, 169, 45, 255, 83, 255, 90, 49, 1, 234, 146, 90, 49, 1, 251, 153, + 255, 90, 49, 1, 3, 247, 195, 49, 1, 3, 162, 49, 1, 3, 193, 49, 1, 3, 206, + 49, 1, 3, 224, 247, 77, 208, 49, 1, 248, 148, 188, 125, 49, 1, 200, 188, + 125, 49, 1, 238, 224, 188, 125, 49, 1, 170, 188, 125, 49, 1, 248, 147, + 188, 125, 49, 1, 227, 177, 250, 223, 188, 69, 49, 1, 227, 232, 250, 223, + 188, 69, 49, 1, 228, 170, 49, 1, 229, 19, 49, 1, 45, 254, 222, 49, 1, + 170, 92, 254, 174, 49, 1, 170, 88, 254, 174, 49, 1, 170, 40, 254, 174, + 49, 1, 170, 38, 254, 174, 49, 1, 170, 234, 107, 49, 1, 238, 223, 247, 46, + 255, 90, 49, 1, 238, 223, 45, 247, 46, 255, 90, 49, 1, 238, 223, 45, 255, + 83, 255, 90, 49, 1, 170, 169, 49, 1, 234, 220, 251, 219, 49, 1, 253, 80, + 200, 229, 218, 49, 1, 248, 228, 200, 229, 218, 49, 1, 253, 80, 170, 229, + 218, 49, 1, 248, 228, 170, 229, 218, 49, 1, 232, 118, 49, 1, 236, 195, + 232, 118, 49, 1, 170, 40, 56, 50, 247, 46, 255, 90, 50, 255, 83, 255, 90, + 50, 190, 255, 90, 50, 169, 50, 196, 50, 236, 154, 50, 252, 231, 50, 53, + 48, 50, 175, 50, 246, 58, 48, 50, 234, 108, 48, 50, 45, 255, 83, 255, 90, + 50, 252, 148, 50, 59, 239, 194, 48, 50, 45, 59, 239, 194, 48, 50, 45, + 247, 46, 255, 90, 50, 252, 159, 50, 241, 143, 252, 231, 50, 205, 251, + 215, 48, 50, 251, 215, 48, 50, 224, 251, 215, 48, 50, 251, 215, 60, 225, + 50, 247, 46, 255, 91, 46, 50, 255, 83, 255, 91, 46, 50, 40, 230, 175, 46, + 50, 38, 230, 175, 46, 50, 40, 185, 48, 50, 246, 50, 50, 40, 137, 234, + 108, 46, 50, 88, 230, 175, 46, 50, 92, 230, 175, 46, 50, 235, 214, 21, + 46, 50, 238, 192, 21, 46, 50, 236, 128, 246, 58, 46, 50, 234, 161, 246, + 58, 46, 50, 53, 46, 50, 250, 201, 46, 50, 234, 108, 46, 50, 251, 215, 46, + 50, 252, 115, 50, 236, 230, 50, 59, 239, 194, 46, 50, 252, 228, 46, 50, + 241, 143, 45, 254, 201, 46, 50, 252, 149, 46, 50, 190, 255, 91, 46, 50, + 252, 232, 46, 50, 241, 143, 252, 232, 46, 50, 230, 1, 46, 50, 239, 102, + 46, 50, 170, 239, 193, 50, 45, 170, 239, 193, 50, 230, 1, 236, 155, 50, + 232, 93, 231, 79, 236, 155, 50, 183, 231, 79, 236, 155, 50, 232, 93, 231, + 209, 236, 155, 50, 183, 231, 209, 236, 155, 50, 38, 137, 234, 108, 46, + 50, 241, 143, 252, 228, 46, 50, 31, 46, 50, 233, 202, 46, 50, 228, 55, + 48, 50, 59, 169, 50, 45, 236, 154, 50, 247, 46, 188, 69, 50, 255, 83, + 188, 69, 50, 17, 236, 50, 50, 17, 240, 109, 50, 17, 250, 196, 229, 211, + 50, 17, 227, 149, 50, 252, 228, 48, 50, 248, 202, 21, 46, 50, 45, 59, + 239, 194, 46, 50, 40, 185, 46, 50, 161, 230, 1, 48, 50, 246, 62, 48, 50, + 255, 24, 95, 153, 48, 50, 40, 38, 65, 46, 50, 226, 226, 65, 46, 50, 247, + 49, 241, 43, 50, 38, 254, 175, 48, 50, 40, 137, 234, 108, 48, 50, 248, + 87, 50, 228, 55, 46, 50, 40, 254, 175, 46, 50, 38, 254, 175, 46, 50, 38, + 254, 175, 19, 88, 254, 175, 46, 50, 38, 137, 234, 108, 48, 50, 53, 60, + 225, 50, 254, 160, 46, 50, 45, 234, 108, 46, 50, 227, 37, 48, 50, 45, + 252, 232, 46, 50, 45, 252, 231, 50, 45, 196, 50, 45, 239, 102, 46, 50, + 45, 169, 50, 45, 241, 143, 252, 231, 50, 45, 77, 65, 46, 50, 8, 3, 1, 67, + 50, 8, 3, 1, 72, 50, 8, 3, 1, 71, 50, 8, 3, 1, 73, 50, 8, 3, 1, 79, 50, + 8, 3, 1, 252, 178, 50, 8, 3, 1, 209, 50, 8, 3, 1, 192, 50, 8, 3, 1, 173, + 50, 8, 3, 1, 144, 50, 8, 3, 1, 214, 50, 8, 3, 1, 179, 50, 8, 3, 1, 206, + 17, 178, 52, 17, 168, 178, 52, 17, 227, 149, 17, 235, 23, 69, 17, 229, + 211, 17, 250, 196, 229, 211, 17, 5, 1, 194, 2, 229, 211, 17, 254, 248, + 230, 119, 17, 5, 1, 248, 205, 2, 229, 211, 17, 5, 1, 248, 178, 2, 229, + 211, 17, 5, 1, 241, 138, 2, 229, 211, 17, 5, 1, 236, 215, 2, 229, 211, + 17, 5, 1, 228, 253, 2, 229, 211, 17, 5, 1, 211, 2, 229, 211, 17, 3, 1, + 241, 138, 2, 250, 196, 19, 229, 211, 17, 5, 1, 255, 21, 17, 5, 1, 253, + 53, 17, 5, 1, 247, 195, 17, 5, 1, 250, 229, 17, 5, 1, 248, 204, 17, 5, 1, + 227, 79, 17, 5, 1, 248, 177, 17, 5, 1, 230, 60, 17, 5, 1, 241, 137, 17, + 5, 1, 240, 245, 17, 5, 1, 240, 23, 17, 5, 1, 238, 141, 17, 5, 1, 237, 83, + 17, 5, 1, 228, 46, 17, 5, 1, 236, 214, 17, 5, 1, 236, 8, 17, 5, 1, 234, + 147, 17, 5, 1, 232, 41, 17, 5, 1, 230, 146, 17, 5, 1, 228, 252, 17, 5, 1, + 236, 25, 17, 5, 1, 252, 63, 17, 5, 1, 235, 134, 17, 5, 1, 236, 216, 17, + 5, 1, 241, 138, 2, 250, 195, 17, 5, 1, 228, 253, 2, 250, 195, 17, 3, 1, + 194, 2, 229, 211, 17, 3, 1, 248, 205, 2, 229, 211, 17, 3, 1, 248, 178, 2, + 229, 211, 17, 3, 1, 241, 138, 2, 229, 211, 17, 3, 1, 228, 253, 2, 250, + 196, 19, 229, 211, 17, 3, 1, 255, 21, 17, 3, 1, 253, 53, 17, 3, 1, 247, + 195, 17, 3, 1, 250, 229, 17, 3, 1, 248, 204, 17, 3, 1, 227, 79, 17, 3, 1, + 248, 177, 17, 3, 1, 230, 60, 17, 3, 1, 241, 137, 17, 3, 1, 240, 245, 17, + 3, 1, 240, 23, 17, 3, 1, 238, 141, 17, 3, 1, 237, 83, 17, 3, 1, 228, 46, + 17, 3, 1, 236, 214, 17, 3, 1, 236, 8, 17, 3, 1, 234, 147, 17, 3, 1, 30, + 232, 41, 17, 3, 1, 232, 41, 17, 3, 1, 230, 146, 17, 3, 1, 228, 252, 17, + 3, 1, 236, 25, 17, 3, 1, 252, 63, 17, 3, 1, 235, 134, 17, 3, 1, 236, 216, + 17, 3, 1, 241, 138, 2, 250, 195, 17, 3, 1, 228, 253, 2, 250, 195, 17, 3, + 1, 236, 215, 2, 229, 211, 17, 3, 1, 228, 253, 2, 229, 211, 17, 3, 1, 211, + 2, 229, 211, 17, 253, 54, 91, 17, 230, 61, 91, 17, 228, 253, 2, 246, 58, + 91, 17, 228, 253, 2, 255, 83, 19, 246, 58, 91, 17, 228, 253, 2, 250, 201, + 19, 246, 58, 91, 17, 236, 26, 91, 17, 236, 9, 91, 17, 241, 3, 91, 17, 1, + 254, 200, 240, 112, 17, 3, 1, 254, 200, 240, 112, 17, 1, 231, 100, 17, 3, + 1, 231, 100, 17, 1, 250, 173, 17, 3, 1, 250, 173, 17, 1, 240, 112, 17, 3, + 1, 240, 112, 17, 1, 233, 239, 17, 3, 1, 233, 239, 62, 5, 1, 232, 119, 62, + 3, 1, 232, 119, 62, 5, 1, 248, 96, 62, 3, 1, 248, 96, 62, 5, 1, 240, 182, + 62, 3, 1, 240, 182, 62, 5, 1, 246, 54, 62, 3, 1, 246, 54, 62, 5, 1, 247, + 193, 62, 3, 1, 247, 193, 62, 5, 1, 232, 104, 62, 3, 1, 232, 104, 62, 5, + 1, 250, 241, 62, 3, 1, 250, 241, 17, 240, 246, 91, 17, 234, 148, 91, 17, + 239, 133, 232, 42, 91, 17, 1, 227, 153, 17, 5, 230, 61, 91, 17, 239, 133, + 248, 205, 91, 17, 224, 239, 133, 248, 205, 91, 17, 5, 1, 232, 101, 17, 3, + 1, 232, 101, 17, 5, 239, 133, 232, 42, 91, 17, 5, 1, 233, 237, 17, 3, 1, + 233, 237, 17, 234, 148, 2, 231, 79, 91, 17, 5, 224, 239, 133, 232, 42, + 91, 17, 5, 249, 98, 239, 133, 232, 42, 91, 17, 5, 224, 249, 98, 239, 133, + 232, 42, 91, 32, 5, 1, 241, 231, 2, 191, 32, 5, 1, 241, 141, 32, 5, 1, + 250, 129, 32, 5, 1, 247, 81, 32, 5, 1, 229, 25, 241, 230, 32, 5, 1, 249, + 46, 32, 5, 1, 252, 187, 71, 32, 5, 1, 227, 186, 32, 5, 1, 241, 98, 32, 5, + 1, 239, 175, 32, 5, 1, 237, 177, 32, 5, 1, 229, 140, 32, 5, 1, 240, 145, + 32, 5, 1, 220, 2, 191, 32, 5, 1, 232, 93, 79, 32, 5, 1, 249, 42, 32, 5, + 1, 67, 32, 5, 1, 253, 91, 32, 5, 1, 228, 212, 32, 5, 1, 247, 107, 32, 5, + 1, 251, 2, 32, 5, 1, 241, 230, 32, 5, 1, 227, 68, 32, 5, 1, 227, 86, 32, + 5, 1, 71, 32, 5, 1, 232, 93, 71, 32, 5, 1, 201, 32, 5, 1, 248, 250, 32, + 5, 1, 248, 241, 32, 5, 1, 248, 234, 32, 5, 1, 73, 32, 5, 1, 236, 80, 32, + 5, 1, 248, 196, 32, 5, 1, 248, 188, 32, 5, 1, 230, 131, 32, 5, 1, 79, 32, + 5, 1, 249, 18, 32, 5, 1, 219, 32, 5, 1, 229, 144, 32, 5, 1, 252, 75, 32, + 5, 1, 232, 147, 32, 5, 1, 232, 127, 32, 5, 1, 246, 226, 52, 32, 5, 1, + 227, 197, 32, 5, 1, 231, 212, 52, 32, 5, 1, 72, 32, 5, 1, 227, 142, 32, + 5, 1, 216, 32, 3, 1, 67, 32, 3, 1, 253, 91, 32, 3, 1, 228, 212, 32, 3, 1, + 247, 107, 32, 3, 1, 251, 2, 32, 3, 1, 241, 230, 32, 3, 1, 227, 68, 32, 3, + 1, 227, 86, 32, 3, 1, 71, 32, 3, 1, 232, 93, 71, 32, 3, 1, 201, 32, 3, 1, + 248, 250, 32, 3, 1, 248, 241, 32, 3, 1, 248, 234, 32, 3, 1, 73, 32, 3, 1, + 236, 80, 32, 3, 1, 248, 196, 32, 3, 1, 248, 188, 32, 3, 1, 230, 131, 32, + 3, 1, 79, 32, 3, 1, 249, 18, 32, 3, 1, 219, 32, 3, 1, 229, 144, 32, 3, 1, + 252, 75, 32, 3, 1, 232, 147, 32, 3, 1, 232, 127, 32, 3, 1, 246, 226, 52, + 32, 3, 1, 227, 197, 32, 3, 1, 231, 212, 52, 32, 3, 1, 72, 32, 3, 1, 227, + 142, 32, 3, 1, 216, 32, 3, 1, 241, 231, 2, 191, 32, 3, 1, 241, 141, 32, + 3, 1, 250, 129, 32, 3, 1, 247, 81, 32, 3, 1, 229, 25, 241, 230, 32, 3, 1, + 249, 46, 32, 3, 1, 252, 187, 71, 32, 3, 1, 227, 186, 32, 3, 1, 241, 98, + 32, 3, 1, 239, 175, 32, 3, 1, 237, 177, 32, 3, 1, 229, 140, 32, 3, 1, + 240, 145, 32, 3, 1, 220, 2, 191, 32, 3, 1, 232, 93, 79, 32, 3, 1, 249, + 42, 32, 5, 1, 236, 216, 32, 3, 1, 236, 216, 32, 5, 1, 227, 222, 32, 3, 1, + 227, 222, 32, 5, 1, 241, 135, 72, 32, 3, 1, 241, 135, 72, 32, 5, 1, 239, + 179, 227, 123, 32, 3, 1, 239, 179, 227, 123, 32, 5, 1, 241, 135, 239, + 179, 227, 123, 32, 3, 1, 241, 135, 239, 179, 227, 123, 32, 5, 1, 253, 35, + 227, 123, 32, 3, 1, 253, 35, 227, 123, 32, 5, 1, 241, 135, 253, 35, 227, + 123, 32, 3, 1, 241, 135, 253, 35, 227, 123, 32, 5, 1, 240, 96, 32, 3, 1, + 240, 96, 32, 5, 1, 235, 134, 32, 3, 1, 235, 134, 32, 5, 1, 248, 49, 32, + 3, 1, 248, 49, 32, 5, 1, 241, 110, 32, 3, 1, 241, 110, 32, 5, 1, 241, + 111, 2, 45, 247, 46, 255, 90, 32, 3, 1, 241, 111, 2, 45, 247, 46, 255, + 90, 32, 5, 1, 229, 26, 32, 3, 1, 229, 26, 32, 5, 1, 234, 77, 236, 216, + 32, 3, 1, 234, 77, 236, 216, 32, 5, 1, 211, 2, 229, 242, 32, 3, 1, 211, + 2, 229, 242, 32, 5, 1, 236, 172, 32, 3, 1, 236, 172, 32, 5, 1, 240, 112, + 32, 3, 1, 240, 112, 32, 230, 31, 52, 50, 32, 229, 242, 50, 32, 236, 129, + 50, 32, 148, 235, 209, 50, 32, 159, 235, 209, 50, 32, 246, 32, 230, 31, + 52, 50, 32, 238, 198, 52, 32, 5, 1, 232, 93, 220, 2, 230, 167, 32, 3, 1, + 232, 93, 220, 2, 230, 167, 32, 5, 1, 232, 173, 52, 32, 3, 1, 232, 173, + 52, 32, 5, 1, 248, 197, 2, 230, 13, 32, 3, 1, 248, 197, 2, 230, 13, 32, + 5, 1, 247, 108, 2, 228, 251, 32, 3, 1, 247, 108, 2, 228, 251, 32, 5, 1, + 247, 108, 2, 108, 32, 3, 1, 247, 108, 2, 108, 32, 5, 1, 247, 108, 2, 238, + 223, 90, 32, 3, 1, 247, 108, 2, 238, 223, 90, 32, 5, 1, 227, 69, 2, 250, + 219, 32, 3, 1, 227, 69, 2, 250, 219, 32, 5, 1, 227, 87, 2, 250, 219, 32, + 3, 1, 227, 87, 2, 250, 219, 32, 5, 1, 241, 11, 2, 250, 219, 32, 3, 1, + 241, 11, 2, 250, 219, 32, 5, 1, 241, 11, 2, 59, 108, 32, 3, 1, 241, 11, + 2, 59, 108, 32, 5, 1, 241, 11, 2, 108, 32, 3, 1, 241, 11, 2, 108, 32, 5, + 1, 253, 132, 201, 32, 3, 1, 253, 132, 201, 32, 5, 1, 248, 235, 2, 250, + 219, 32, 3, 1, 248, 235, 2, 250, 219, 32, 5, 18, 248, 235, 247, 107, 32, + 3, 18, 248, 235, 247, 107, 32, 5, 1, 236, 81, 2, 238, 223, 90, 32, 3, 1, + 236, 81, 2, 238, 223, 90, 32, 5, 1, 255, 96, 219, 32, 3, 1, 255, 96, 219, + 32, 5, 1, 248, 189, 2, 250, 219, 32, 3, 1, 248, 189, 2, 250, 219, 32, 5, + 1, 230, 132, 2, 250, 219, 32, 3, 1, 230, 132, 2, 250, 219, 32, 5, 1, 231, + 87, 79, 32, 3, 1, 231, 87, 79, 32, 5, 1, 231, 87, 132, 2, 108, 32, 3, 1, + 231, 87, 132, 2, 108, 32, 5, 1, 246, 252, 2, 250, 219, 32, 3, 1, 246, + 252, 2, 250, 219, 32, 5, 18, 230, 132, 229, 144, 32, 3, 18, 230, 132, + 229, 144, 32, 5, 1, 252, 76, 2, 250, 219, 32, 3, 1, 252, 76, 2, 250, 219, + 32, 5, 1, 252, 76, 2, 59, 108, 32, 3, 1, 252, 76, 2, 59, 108, 32, 5, 1, + 232, 110, 32, 3, 1, 232, 110, 32, 5, 1, 255, 96, 252, 75, 32, 3, 1, 255, + 96, 252, 75, 32, 5, 1, 255, 96, 252, 76, 2, 250, 219, 32, 3, 1, 255, 96, + 252, 76, 2, 250, 219, 32, 1, 236, 126, 32, 5, 1, 227, 69, 2, 252, 231, + 32, 3, 1, 227, 69, 2, 252, 231, 32, 5, 1, 241, 11, 2, 90, 32, 3, 1, 241, + 11, 2, 90, 32, 5, 1, 248, 251, 2, 230, 167, 32, 3, 1, 248, 251, 2, 230, + 167, 32, 5, 1, 248, 235, 2, 90, 32, 3, 1, 248, 235, 2, 90, 32, 5, 1, 248, + 235, 2, 230, 167, 32, 3, 1, 248, 235, 2, 230, 167, 32, 5, 1, 240, 190, + 252, 75, 32, 3, 1, 240, 190, 252, 75, 32, 5, 1, 248, 242, 2, 230, 167, + 32, 3, 1, 248, 242, 2, 230, 167, 32, 5, 1, 134, 2, 252, 231, 32, 3, 1, + 134, 2, 252, 231, 32, 5, 1, 134, 2, 175, 32, 3, 1, 134, 2, 175, 32, 5, + 18, 134, 241, 230, 32, 3, 18, 134, 241, 230, 32, 5, 1, 241, 231, 2, 252, + 231, 32, 3, 1, 241, 231, 2, 252, 231, 32, 5, 1, 233, 212, 32, 3, 1, 233, + 212, 32, 5, 1, 233, 213, 2, 175, 32, 3, 1, 233, 213, 2, 175, 32, 5, 1, + 227, 69, 2, 175, 32, 3, 1, 227, 69, 2, 175, 32, 5, 1, 227, 87, 2, 175, + 32, 3, 1, 227, 87, 2, 175, 32, 5, 1, 255, 96, 249, 46, 32, 3, 1, 255, 96, + 249, 46, 32, 5, 1, 220, 2, 196, 32, 3, 1, 220, 2, 196, 32, 5, 1, 220, 2, + 175, 32, 3, 1, 220, 2, 175, 32, 5, 1, 117, 2, 175, 32, 3, 1, 117, 2, 175, + 32, 5, 1, 253, 140, 73, 32, 3, 1, 253, 140, 73, 32, 5, 1, 253, 140, 117, + 2, 175, 32, 3, 1, 253, 140, 117, 2, 175, 32, 5, 1, 157, 2, 175, 32, 3, 1, + 157, 2, 175, 32, 5, 1, 132, 2, 196, 32, 3, 1, 132, 2, 196, 32, 5, 1, 132, + 2, 175, 32, 3, 1, 132, 2, 175, 32, 5, 1, 132, 2, 45, 135, 32, 3, 1, 132, + 2, 45, 135, 32, 5, 1, 252, 76, 2, 175, 32, 3, 1, 252, 76, 2, 175, 32, 5, + 1, 247, 108, 2, 250, 219, 32, 3, 1, 247, 108, 2, 250, 219, 32, 5, 1, 227, + 198, 2, 175, 32, 3, 1, 227, 198, 2, 175, 32, 5, 1, 240, 120, 251, 2, 32, + 3, 1, 240, 120, 251, 2, 32, 5, 1, 240, 120, 250, 129, 32, 3, 1, 240, 120, + 250, 129, 32, 5, 1, 240, 120, 227, 31, 32, 3, 1, 240, 120, 227, 31, 32, + 5, 1, 240, 120, 249, 40, 32, 3, 1, 240, 120, 249, 40, 32, 5, 1, 240, 120, + 239, 175, 32, 3, 1, 240, 120, 239, 175, 32, 5, 1, 240, 120, 237, 177, 32, + 3, 1, 240, 120, 237, 177, 32, 5, 1, 240, 120, 231, 249, 32, 3, 1, 240, + 120, 231, 249, 32, 5, 1, 240, 120, 229, 238, 32, 3, 1, 240, 120, 229, + 238, 100, 5, 1, 254, 125, 100, 5, 1, 253, 64, 100, 5, 1, 247, 89, 100, 5, + 1, 251, 102, 100, 5, 1, 249, 24, 100, 5, 1, 227, 102, 100, 5, 1, 249, 15, + 100, 5, 1, 248, 179, 100, 5, 1, 87, 100, 5, 1, 227, 68, 100, 5, 1, 241, + 172, 100, 5, 1, 239, 178, 100, 5, 1, 228, 49, 100, 5, 1, 252, 176, 100, + 5, 1, 240, 209, 100, 5, 1, 246, 67, 100, 5, 1, 241, 107, 100, 5, 1, 247, + 114, 100, 5, 1, 252, 71, 100, 5, 1, 239, 15, 100, 5, 1, 227, 186, 100, 5, + 1, 237, 109, 100, 5, 1, 232, 147, 100, 5, 1, 228, 173, 100, 5, 1, 252, + 96, 100, 5, 1, 236, 70, 100, 5, 1, 241, 88, 100, 5, 1, 234, 236, 100, 5, + 1, 233, 186, 100, 5, 1, 228, 195, 100, 5, 1, 229, 240, 100, 5, 1, 234, + 185, 100, 5, 1, 251, 226, 100, 5, 1, 227, 172, 100, 5, 1, 235, 224, 100, + 5, 1, 240, 214, 100, 5, 1, 236, 229, 100, 5, 1, 248, 98, 100, 49, 1, 40, + 137, 234, 107, 100, 254, 222, 100, 248, 237, 69, 100, 248, 156, 69, 100, + 251, 214, 100, 235, 23, 69, 100, 255, 97, 69, 100, 3, 1, 254, 125, 100, + 3, 1, 253, 64, 100, 3, 1, 247, 89, 100, 3, 1, 251, 102, 100, 3, 1, 249, + 24, 100, 3, 1, 227, 102, 100, 3, 1, 249, 15, 100, 3, 1, 248, 179, 100, 3, + 1, 87, 100, 3, 1, 227, 68, 100, 3, 1, 241, 172, 100, 3, 1, 239, 178, 100, + 3, 1, 228, 49, 100, 3, 1, 252, 176, 100, 3, 1, 240, 209, 100, 3, 1, 246, + 67, 100, 3, 1, 241, 107, 100, 3, 1, 247, 114, 100, 3, 1, 252, 71, 100, 3, + 1, 239, 15, 100, 3, 1, 227, 186, 100, 3, 1, 237, 109, 100, 3, 1, 232, + 147, 100, 3, 1, 228, 173, 100, 3, 1, 252, 96, 100, 3, 1, 236, 70, 100, 3, + 1, 241, 88, 100, 3, 1, 234, 236, 100, 3, 1, 233, 186, 100, 3, 1, 228, + 195, 100, 3, 1, 229, 240, 100, 3, 1, 234, 185, 100, 3, 1, 251, 226, 100, + 3, 1, 227, 172, 100, 3, 1, 235, 224, 100, 3, 1, 240, 214, 100, 3, 1, 236, + 229, 100, 3, 1, 248, 98, 100, 3, 18, 249, 25, 227, 172, 100, 247, 231, + 208, 100, 245, 248, 68, 255, 91, 248, 172, 68, 255, 91, 233, 187, 68, + 255, 91, 232, 138, 68, 255, 91, 227, 95, 235, 75, 68, 255, 91, 227, 95, + 247, 205, 68, 255, 91, 229, 247, 68, 255, 91, 234, 156, 68, 255, 91, 227, + 94, 68, 255, 91, 236, 98, 68, 255, 91, 227, 192, 68, 255, 91, 230, 93, + 68, 255, 91, 247, 157, 68, 255, 91, 247, 158, 238, 121, 68, 255, 91, 247, + 155, 68, 255, 91, 235, 76, 236, 119, 68, 255, 91, 230, 116, 247, 170, 68, + 255, 91, 236, 83, 68, 255, 91, 254, 151, 246, 246, 68, 255, 91, 238, 129, + 68, 255, 91, 239, 97, 68, 255, 91, 239, 11, 68, 255, 91, 239, 12, 240, + 215, 68, 255, 91, 251, 61, 68, 255, 91, 235, 87, 68, 255, 91, 230, 116, + 235, 71, 68, 255, 91, 227, 200, 253, 65, 227, 157, 68, 255, 91, 236, 221, + 68, 255, 91, 241, 205, 68, 255, 91, 250, 242, 68, 255, 91, 227, 35, 68, + 158, 239, 55, 252, 5, 68, 235, 202, 232, 112, 68, 235, 202, 246, 219, + 233, 187, 68, 235, 202, 246, 219, 236, 93, 68, 235, 202, 246, 219, 235, + 80, 68, 235, 202, 246, 154, 68, 235, 202, 229, 142, 68, 235, 202, 233, + 187, 68, 235, 202, 236, 93, 68, 235, 202, 235, 80, 68, 235, 202, 246, 64, + 68, 235, 202, 235, 26, 68, 235, 202, 251, 93, 128, 239, 74, 68, 235, 202, + 239, 4, 68, 235, 122, 239, 73, 68, 235, 202, 234, 226, 68, 235, 122, 236, + 99, 68, 235, 202, 232, 103, 250, 100, 68, 235, 202, 232, 32, 250, 100, + 68, 235, 122, 231, 213, 236, 95, 68, 158, 189, 250, 100, 68, 158, 168, + 250, 100, 68, 235, 122, 237, 75, 246, 245, 68, 235, 202, 235, 81, 235, + 75, 68, 1, 255, 38, 68, 1, 253, 55, 68, 1, 247, 87, 68, 1, 251, 78, 68, + 1, 246, 210, 68, 1, 228, 216, 68, 1, 227, 88, 68, 1, 246, 181, 68, 1, + 230, 102, 68, 1, 227, 159, 68, 1, 30, 241, 5, 68, 1, 241, 5, 68, 1, 240, + 19, 68, 1, 30, 239, 20, 68, 1, 239, 20, 68, 1, 30, 237, 74, 68, 1, 237, + 74, 68, 1, 233, 242, 68, 1, 254, 123, 68, 1, 30, 236, 80, 68, 1, 236, 80, + 68, 1, 30, 229, 145, 68, 1, 229, 145, 68, 1, 235, 46, 68, 1, 234, 170, + 68, 1, 232, 102, 68, 1, 230, 143, 68, 18, 227, 184, 45, 228, 216, 68, 18, + 227, 184, 228, 217, 227, 159, 68, 18, 227, 184, 45, 227, 159, 68, 235, + 122, 247, 157, 68, 235, 122, 247, 155, 11, 61, 52, 11, 21, 233, 236, 11, + 248, 15, 239, 61, 11, 21, 233, 254, 255, 68, 52, 11, 251, 214, 11, 251, + 49, 232, 166, 11, 235, 204, 228, 203, 52, 11, 21, 238, 184, 11, 21, 233, + 246, 255, 40, 228, 127, 11, 21, 255, 40, 254, 163, 11, 21, 234, 225, 255, + 39, 11, 21, 234, 229, 255, 28, 254, 253, 11, 21, 230, 163, 11, 3, 200, + 230, 169, 11, 232, 176, 11, 229, 170, 53, 235, 122, 69, 11, 235, 23, 69, + 11, 1, 246, 234, 11, 1, 83, 2, 239, 101, 48, 11, 1, 83, 2, 143, 48, 11, + 1, 228, 116, 2, 143, 48, 11, 1, 83, 2, 143, 46, 11, 1, 57, 2, 143, 48, + 11, 1, 255, 38, 11, 1, 253, 77, 11, 1, 230, 124, 239, 70, 11, 1, 230, + 123, 11, 1, 230, 73, 11, 1, 241, 96, 11, 1, 246, 242, 11, 1, 240, 192, + 11, 1, 251, 83, 11, 1, 230, 82, 11, 1, 234, 185, 11, 1, 227, 97, 11, 1, + 233, 191, 11, 1, 232, 122, 11, 1, 234, 1, 11, 1, 251, 97, 11, 1, 230, + 169, 11, 1, 227, 99, 11, 1, 255, 51, 11, 1, 247, 112, 11, 230, 148, 11, + 1, 248, 98, 11, 1, 235, 85, 11, 1, 241, 5, 11, 1, 240, 26, 11, 1, 239, + 30, 11, 1, 237, 128, 11, 1, 246, 196, 11, 1, 228, 115, 11, 1, 83, 239, + 87, 11, 1, 227, 207, 11, 248, 112, 11, 251, 73, 11, 240, 234, 11, 248, + 114, 11, 251, 75, 11, 240, 236, 11, 232, 142, 11, 231, 40, 11, 239, 99, + 48, 11, 143, 48, 11, 143, 46, 11, 231, 54, 255, 38, 11, 241, 143, 251, + 75, 11, 158, 198, 247, 99, 11, 227, 9, 11, 33, 21, 3, 228, 234, 48, 11, + 33, 21, 241, 143, 3, 228, 234, 48, 11, 33, 21, 53, 46, 11, 224, 251, 75, + 11, 248, 115, 2, 171, 250, 98, 254, 209, 26, 227, 80, 254, 209, 26, 127, + 254, 209, 26, 111, 254, 209, 26, 166, 254, 209, 26, 177, 254, 209, 26, + 176, 254, 209, 26, 187, 254, 209, 26, 203, 254, 209, 26, 195, 254, 209, + 26, 202, 11, 236, 56, 52, 11, 250, 252, 232, 166, 11, 230, 31, 232, 166, + 11, 248, 48, 235, 200, 231, 112, 11, 1, 250, 99, 253, 77, 11, 1, 250, 99, + 235, 85, 11, 1, 231, 28, 255, 38, 11, 1, 83, 228, 128, 11, 1, 83, 2, 228, + 117, 143, 48, 11, 1, 83, 2, 228, 117, 143, 46, 11, 1, 200, 246, 234, 11, + 1, 200, 143, 255, 38, 11, 1, 200, 143, 228, 115, 11, 1, 132, 2, 143, 48, + 11, 1, 200, 143, 227, 207, 11, 1, 229, 124, 11, 1, 229, 122, 11, 1, 253, + 83, 11, 1, 230, 124, 2, 234, 107, 11, 1, 230, 124, 2, 204, 181, 60, 249, + 85, 11, 1, 236, 70, 11, 1, 230, 121, 11, 1, 253, 75, 11, 1, 94, 2, 143, + 48, 11, 1, 94, 2, 171, 181, 59, 48, 11, 1, 237, 50, 11, 1, 249, 52, 11, + 1, 94, 2, 204, 181, 48, 11, 1, 230, 135, 11, 1, 230, 133, 11, 1, 251, 36, + 11, 1, 251, 84, 2, 234, 107, 11, 1, 251, 84, 2, 53, 46, 11, 1, 251, 84, + 2, 53, 253, 68, 19, 3, 230, 169, 11, 1, 251, 88, 11, 1, 251, 38, 11, 1, + 249, 68, 11, 1, 251, 84, 2, 204, 181, 60, 249, 85, 11, 1, 251, 84, 2, + 248, 0, 181, 48, 11, 1, 234, 68, 11, 1, 234, 186, 2, 3, 179, 11, 1, 234, + 186, 2, 234, 107, 11, 1, 234, 186, 2, 53, 46, 11, 1, 234, 186, 2, 3, 228, + 234, 46, 11, 1, 234, 186, 2, 53, 253, 68, 19, 53, 48, 11, 1, 234, 186, 2, + 171, 181, 48, 11, 1, 241, 94, 11, 1, 234, 186, 2, 248, 0, 181, 48, 11, 1, + 233, 192, 2, 53, 253, 68, 19, 53, 48, 11, 1, 233, 192, 2, 204, 181, 46, + 11, 1, 233, 192, 2, 204, 181, 253, 68, 19, 204, 181, 48, 11, 1, 234, 2, + 2, 171, 181, 46, 11, 1, 234, 2, 2, 204, 181, 48, 11, 1, 230, 170, 2, 204, + 181, 48, 11, 1, 255, 52, 2, 204, 181, 48, 11, 1, 250, 99, 248, 98, 11, 1, + 248, 99, 2, 53, 238, 146, 46, 11, 1, 248, 99, 2, 53, 46, 11, 1, 228, 206, + 11, 1, 248, 99, 2, 204, 181, 46, 11, 1, 236, 68, 11, 1, 235, 86, 2, 53, + 48, 11, 1, 235, 86, 2, 204, 181, 48, 11, 1, 240, 212, 11, 1, 231, 9, 241, + 5, 11, 1, 241, 6, 2, 234, 107, 11, 1, 241, 6, 2, 53, 48, 11, 1, 237, 244, + 11, 1, 241, 6, 2, 204, 181, 46, 11, 1, 247, 202, 11, 1, 247, 203, 2, 234, + 107, 11, 1, 237, 220, 11, 1, 247, 203, 2, 171, 181, 46, 11, 1, 247, 28, + 11, 1, 247, 203, 2, 204, 181, 48, 11, 1, 182, 2, 3, 179, 11, 1, 182, 2, + 53, 48, 11, 1, 182, 2, 204, 181, 48, 11, 1, 182, 2, 204, 181, 46, 11, 1, + 198, 2, 53, 46, 11, 1, 198, 247, 99, 11, 1, 234, 93, 11, 1, 198, 2, 234, + 107, 11, 1, 198, 2, 204, 181, 48, 11, 1, 246, 197, 250, 113, 11, 1, 230, + 136, 2, 53, 48, 11, 1, 246, 197, 2, 57, 48, 11, 1, 246, 197, 247, 69, 11, + 1, 246, 197, 247, 70, 2, 143, 48, 11, 1, 230, 124, 239, 71, 247, 69, 11, + 1, 228, 116, 2, 234, 107, 11, 1, 240, 157, 236, 234, 11, 1, 236, 234, 11, + 1, 79, 11, 1, 227, 142, 11, 1, 240, 157, 227, 142, 11, 1, 228, 116, 2, + 171, 181, 48, 11, 1, 228, 212, 11, 1, 248, 117, 227, 207, 11, 1, 57, 2, + 230, 167, 11, 1, 57, 2, 3, 179, 11, 1, 228, 116, 2, 53, 48, 11, 1, 72, + 11, 1, 57, 2, 204, 181, 46, 11, 1, 57, 253, 138, 11, 1, 57, 253, 139, 2, + 143, 48, 11, 247, 231, 208, 11, 1, 255, 75, 11, 3, 200, 18, 234, 2, 2, + 182, 2, 83, 239, 87, 11, 3, 200, 18, 235, 86, 2, 182, 2, 83, 239, 87, 11, + 3, 200, 51, 54, 13, 11, 3, 200, 182, 255, 38, 11, 3, 200, 241, 96, 11, 3, + 200, 204, 250, 98, 11, 3, 200, 233, 191, 11, 248, 228, 147, 254, 127, 11, + 231, 110, 147, 234, 41, 248, 251, 246, 152, 11, 3, 200, 234, 75, 227, 80, + 11, 3, 200, 228, 254, 234, 194, 227, 80, 11, 3, 200, 250, 99, 246, 208, + 147, 240, 192, 11, 3, 200, 51, 39, 13, 11, 3, 170, 233, 191, 11, 3, 200, + 239, 100, 11, 3, 228, 115, 11, 3, 227, 207, 11, 3, 200, 227, 207, 11, 3, + 200, 237, 128, 11, 235, 220, 147, 233, 250, 11, 248, 236, 252, 108, 170, + 208, 11, 248, 236, 252, 108, 200, 208, 11, 234, 75, 200, 231, 93, 2, 248, + 64, 252, 107, 11, 3, 170, 239, 30, 11, 1, 251, 84, 2, 241, 143, 179, 11, + 1, 234, 186, 2, 241, 143, 179, 248, 150, 254, 209, 26, 227, 80, 248, 150, + 254, 209, 26, 127, 248, 150, 254, 209, 26, 111, 248, 150, 254, 209, 26, + 166, 248, 150, 254, 209, 26, 177, 248, 150, 254, 209, 26, 176, 248, 150, + 254, 209, 26, 187, 248, 150, 254, 209, 26, 203, 248, 150, 254, 209, 26, + 195, 248, 150, 254, 209, 26, 202, 11, 1, 232, 123, 2, 53, 46, 11, 1, 251, + 98, 2, 53, 46, 11, 1, 247, 113, 2, 53, 46, 11, 21, 232, 31, 255, 11, 11, + 21, 232, 31, 235, 184, 239, 15, 11, 1, 246, 197, 2, 241, 143, 179, 129, + 248, 228, 147, 236, 117, 129, 231, 24, 247, 231, 208, 129, 231, 56, 247, + 231, 208, 129, 231, 24, 251, 219, 129, 231, 56, 251, 219, 129, 163, 251, + 219, 129, 251, 220, 231, 247, 239, 248, 129, 251, 220, 231, 247, 225, + 129, 231, 24, 251, 220, 231, 247, 239, 248, 129, 231, 56, 251, 220, 231, + 247, 225, 129, 251, 183, 129, 246, 224, 236, 244, 129, 246, 224, 239, 3, + 129, 246, 224, 254, 161, 129, 255, 97, 69, 129, 1, 255, 41, 129, 1, 231, + 28, 255, 41, 129, 1, 253, 52, 129, 1, 247, 197, 129, 1, 247, 198, 247, + 186, 129, 1, 251, 81, 129, 1, 250, 99, 251, 82, 234, 104, 129, 1, 246, + 210, 129, 1, 228, 115, 129, 1, 227, 97, 129, 1, 246, 180, 129, 1, 230, + 98, 129, 1, 230, 99, 247, 186, 129, 1, 227, 132, 129, 1, 227, 133, 246, + 210, 129, 1, 240, 248, 129, 1, 240, 25, 129, 1, 238, 197, 129, 1, 237, + 74, 129, 1, 232, 171, 129, 1, 30, 232, 171, 129, 1, 72, 129, 1, 236, 80, + 129, 1, 224, 236, 80, 129, 1, 233, 255, 129, 1, 235, 79, 129, 1, 234, + 104, 129, 1, 232, 102, 129, 1, 230, 141, 129, 1, 184, 253, 45, 129, 1, + 184, 247, 110, 129, 1, 184, 250, 205, 129, 235, 125, 48, 129, 235, 125, + 46, 129, 235, 125, 249, 97, 129, 227, 21, 48, 129, 227, 21, 46, 129, 227, + 21, 249, 97, 129, 234, 206, 48, 129, 234, 206, 46, 129, 249, 98, 227, 28, + 246, 53, 129, 249, 98, 227, 28, 254, 254, 129, 246, 213, 48, 129, 246, + 213, 46, 129, 246, 212, 249, 97, 129, 248, 187, 48, 129, 248, 187, 46, + 129, 234, 20, 129, 248, 92, 250, 100, 129, 235, 7, 129, 234, 39, 129, 171, 59, 181, 48, 129, 171, 59, 181, 46, 129, 204, 181, 48, 129, 204, - 181, 46, 129, 238, 106, 248, 41, 48, 129, 238, 106, 248, 41, 46, 129, - 241, 251, 129, 237, 71, 129, 1, 238, 151, 242, 202, 129, 1, 238, 151, - 241, 201, 129, 1, 238, 151, 254, 62, 11, 1, 253, 136, 2, 204, 181, 232, - 173, 46, 11, 1, 253, 136, 2, 53, 242, 230, 19, 204, 181, 48, 11, 1, 253, - 136, 2, 204, 181, 236, 150, 226, 226, 46, 11, 1, 253, 136, 2, 204, 181, - 236, 150, 226, 226, 242, 230, 19, 171, 181, 48, 11, 1, 253, 136, 2, 171, - 181, 242, 230, 19, 53, 48, 11, 1, 253, 136, 2, 236, 145, 3, 255, 110, 46, - 11, 1, 253, 136, 2, 3, 179, 11, 1, 94, 2, 171, 181, 48, 11, 1, 94, 2, - 204, 181, 236, 150, 226, 226, 46, 11, 1, 253, 199, 2, 171, 181, 234, 33, - 242, 230, 19, 3, 248, 137, 11, 1, 253, 199, 2, 236, 145, 3, 255, 110, 46, - 11, 1, 253, 143, 2, 108, 11, 1, 248, 39, 2, 248, 58, 181, 48, 11, 1, 253, - 158, 2, 171, 181, 48, 11, 1, 253, 158, 2, 204, 181, 236, 150, 235, 45, - 48, 11, 1, 253, 158, 2, 171, 181, 234, 33, 48, 11, 1, 253, 153, 2, 171, - 181, 46, 11, 1, 253, 153, 2, 204, 181, 236, 150, 226, 226, 46, 11, 1, - 243, 21, 2, 53, 48, 11, 1, 243, 21, 2, 204, 181, 48, 11, 1, 243, 21, 2, - 204, 181, 236, 150, 226, 226, 46, 11, 1, 51, 2, 53, 48, 11, 1, 51, 2, 53, - 46, 11, 1, 198, 2, 171, 181, 46, 11, 1, 198, 2, 3, 248, 137, 11, 1, 198, - 2, 3, 179, 11, 1, 182, 2, 125, 11, 1, 253, 143, 2, 171, 181, 234, 33, 48, - 11, 1, 253, 143, 2, 143, 48, 11, 1, 248, 39, 2, 171, 181, 234, 33, 48, - 199, 1, 248, 114, 199, 1, 234, 254, 199, 1, 242, 22, 199, 1, 248, 182, - 199, 1, 249, 30, 199, 1, 234, 218, 199, 1, 241, 191, 199, 1, 241, 8, 199, - 1, 242, 173, 199, 1, 241, 231, 199, 1, 241, 101, 199, 1, 239, 41, 199, 1, - 243, 76, 199, 1, 241, 210, 199, 1, 241, 119, 199, 1, 234, 195, 199, 1, - 242, 99, 199, 1, 235, 199, 199, 1, 236, 143, 199, 1, 236, 127, 199, 1, - 248, 191, 199, 1, 236, 72, 199, 1, 236, 42, 199, 1, 234, 100, 199, 1, - 247, 163, 199, 1, 243, 194, 199, 1, 246, 8, 199, 1, 239, 217, 199, 1, - 249, 216, 199, 1, 239, 193, 199, 1, 239, 176, 199, 1, 239, 34, 199, 1, - 87, 199, 1, 253, 222, 199, 1, 244, 74, 199, 1, 239, 83, 199, 1, 242, 68, - 199, 1, 242, 181, 199, 237, 54, 199, 234, 88, 199, 237, 176, 199, 234, - 183, 199, 238, 37, 199, 234, 229, 199, 237, 145, 199, 234, 189, 199, 237, - 223, 199, 234, 228, 199, 240, 240, 199, 1, 248, 231, 85, 21, 232, 77, 85, - 21, 235, 61, 85, 21, 236, 173, 85, 1, 242, 215, 67, 85, 1, 67, 85, 1, - 253, 140, 85, 1, 71, 85, 1, 253, 142, 85, 1, 79, 85, 1, 253, 148, 85, 1, - 165, 144, 85, 1, 165, 162, 85, 1, 240, 61, 72, 85, 1, 242, 215, 72, 85, - 1, 72, 85, 1, 253, 149, 85, 1, 240, 61, 73, 85, 1, 242, 215, 73, 85, 1, - 73, 85, 1, 253, 151, 85, 1, 201, 85, 1, 248, 61, 85, 1, 253, 139, 85, 1, - 248, 77, 85, 1, 248, 50, 85, 1, 253, 152, 85, 1, 248, 57, 85, 1, 253, - 146, 85, 1, 248, 89, 85, 1, 248, 78, 85, 1, 248, 71, 85, 1, 242, 247, 85, - 1, 248, 75, 85, 1, 242, 249, 85, 1, 248, 82, 85, 1, 253, 126, 85, 1, 248, - 55, 85, 1, 253, 133, 85, 1, 248, 76, 85, 1, 253, 131, 85, 1, 243, 234, - 85, 1, 253, 129, 85, 1, 248, 65, 85, 1, 253, 141, 85, 1, 248, 81, 85, 1, - 222, 85, 1, 216, 85, 1, 253, 130, 85, 1, 248, 96, 85, 1, 253, 134, 85, 1, - 248, 94, 85, 1, 243, 104, 85, 1, 253, 171, 85, 1, 248, 46, 85, 1, 248, - 66, 85, 1, 253, 132, 85, 1, 219, 85, 21, 240, 81, 85, 21, 235, 80, 85, - 33, 21, 253, 140, 85, 33, 21, 71, 85, 33, 21, 253, 142, 85, 33, 21, 79, - 85, 33, 21, 253, 148, 85, 33, 21, 165, 144, 85, 33, 21, 165, 253, 182, - 85, 33, 21, 240, 61, 72, 85, 33, 21, 242, 215, 72, 85, 33, 21, 72, 85, - 33, 21, 253, 149, 85, 33, 21, 240, 61, 73, 85, 33, 21, 242, 215, 73, 85, - 33, 21, 73, 85, 33, 21, 253, 151, 85, 21, 238, 72, 85, 254, 43, 85, 240, - 148, 21, 239, 233, 85, 240, 148, 21, 235, 163, 85, 242, 245, 238, 54, 85, - 242, 241, 238, 54, 85, 1, 253, 217, 85, 1, 243, 207, 85, 1, 243, 183, 85, - 1, 253, 163, 85, 1, 241, 75, 85, 1, 248, 246, 85, 1, 253, 179, 85, 1, - 249, 24, 85, 1, 165, 253, 182, 85, 1, 165, 253, 191, 85, 33, 21, 165, - 162, 85, 33, 21, 165, 253, 191, 85, 240, 111, 85, 45, 240, 111, 85, 26, - 242, 217, 85, 26, 127, 85, 26, 111, 85, 26, 166, 85, 26, 177, 85, 26, - 176, 85, 26, 187, 85, 26, 203, 85, 26, 195, 85, 26, 202, 85, 232, 88, 52, - 85, 1, 238, 62, 208, 101, 21, 232, 77, 101, 21, 235, 61, 101, 21, 236, - 173, 101, 1, 67, 101, 1, 253, 140, 101, 1, 71, 101, 1, 253, 142, 101, 1, - 79, 101, 1, 253, 148, 101, 1, 165, 144, 101, 1, 165, 162, 101, 1, 72, - 101, 1, 253, 149, 101, 1, 73, 101, 1, 253, 151, 101, 1, 201, 101, 1, 248, - 61, 101, 1, 253, 139, 101, 1, 248, 77, 101, 1, 248, 50, 101, 1, 253, 152, - 101, 1, 248, 57, 101, 1, 253, 146, 101, 1, 248, 89, 101, 1, 248, 78, 101, - 1, 248, 71, 101, 1, 242, 247, 101, 1, 248, 75, 101, 1, 242, 249, 101, 1, - 248, 82, 101, 1, 253, 126, 101, 1, 248, 55, 101, 1, 253, 133, 101, 1, - 248, 76, 101, 1, 253, 131, 101, 1, 253, 129, 101, 1, 248, 65, 101, 1, - 253, 141, 101, 1, 248, 81, 101, 1, 222, 101, 1, 216, 101, 1, 253, 130, - 101, 1, 253, 134, 101, 1, 248, 46, 101, 1, 248, 66, 101, 1, 253, 132, - 101, 1, 219, 101, 21, 240, 81, 101, 21, 235, 80, 101, 33, 21, 253, 140, - 101, 33, 21, 71, 101, 33, 21, 253, 142, 101, 33, 21, 79, 101, 33, 21, - 253, 148, 101, 33, 21, 165, 144, 101, 33, 21, 165, 253, 182, 101, 33, 21, - 72, 101, 33, 21, 253, 149, 101, 33, 21, 73, 101, 33, 21, 253, 151, 101, - 21, 238, 72, 101, 1, 241, 200, 253, 126, 101, 255, 39, 240, 51, 69, 101, - 1, 248, 96, 101, 1, 248, 246, 101, 1, 249, 24, 101, 1, 165, 253, 182, - 101, 1, 165, 253, 191, 101, 33, 21, 165, 162, 101, 33, 21, 165, 253, 191, - 101, 26, 242, 217, 101, 26, 127, 101, 26, 111, 101, 26, 166, 101, 26, - 177, 101, 26, 176, 101, 26, 187, 101, 26, 203, 101, 26, 195, 101, 26, - 202, 101, 1, 255, 63, 2, 240, 1, 235, 86, 101, 1, 255, 63, 2, 168, 235, - 86, 101, 243, 44, 69, 101, 243, 44, 52, 101, 236, 181, 235, 79, 127, 101, - 236, 181, 235, 79, 111, 101, 236, 181, 235, 79, 166, 101, 236, 181, 235, - 79, 177, 101, 236, 181, 235, 79, 253, 125, 251, 190, 249, 1, 253, 145, - 232, 129, 101, 236, 181, 233, 131, 236, 202, 101, 238, 191, 133, 21, 249, - 233, 240, 160, 133, 21, 240, 160, 133, 21, 236, 173, 133, 1, 67, 133, 1, - 253, 140, 133, 1, 71, 133, 1, 253, 142, 133, 1, 79, 133, 1, 253, 148, - 133, 1, 253, 164, 133, 1, 253, 149, 133, 1, 253, 156, 133, 1, 253, 151, - 133, 1, 201, 133, 1, 248, 61, 133, 1, 253, 139, 133, 1, 248, 77, 133, 1, - 248, 50, 133, 1, 253, 152, 133, 1, 248, 57, 133, 1, 253, 146, 133, 1, - 248, 89, 133, 1, 248, 78, 133, 1, 248, 71, 133, 1, 242, 247, 133, 1, 248, - 75, 133, 1, 242, 249, 133, 1, 248, 82, 133, 1, 253, 126, 133, 1, 248, 55, - 133, 1, 253, 133, 133, 1, 248, 76, 133, 1, 253, 131, 133, 1, 253, 129, - 133, 1, 248, 65, 133, 1, 253, 141, 133, 1, 248, 81, 133, 1, 222, 133, 1, - 216, 133, 1, 253, 130, 133, 1, 253, 134, 133, 1, 248, 94, 133, 1, 253, - 171, 133, 1, 248, 46, 133, 1, 253, 132, 133, 1, 219, 133, 21, 240, 81, - 133, 33, 21, 253, 140, 133, 33, 21, 71, 133, 33, 21, 253, 142, 133, 33, - 21, 79, 133, 33, 21, 253, 148, 133, 33, 21, 253, 164, 133, 33, 21, 253, - 149, 133, 33, 21, 253, 156, 133, 33, 21, 253, 151, 133, 21, 238, 72, 133, - 1, 243, 207, 133, 1, 243, 183, 133, 1, 253, 163, 133, 1, 248, 96, 133, 1, - 253, 179, 133, 26, 242, 217, 133, 26, 127, 133, 26, 111, 133, 26, 166, - 133, 26, 177, 133, 26, 176, 133, 26, 187, 133, 26, 203, 133, 26, 195, - 133, 26, 202, 133, 242, 154, 133, 241, 5, 133, 251, 107, 133, 253, 2, - 133, 255, 73, 242, 41, 112, 21, 232, 77, 112, 21, 235, 61, 112, 21, 236, - 173, 112, 1, 67, 112, 1, 253, 140, 112, 1, 71, 112, 1, 253, 142, 112, 1, - 79, 112, 1, 253, 148, 112, 1, 165, 144, 112, 1, 165, 162, 112, 33, 240, - 61, 72, 112, 1, 72, 112, 1, 253, 149, 112, 33, 240, 61, 73, 112, 1, 73, - 112, 1, 253, 151, 112, 1, 201, 112, 1, 248, 61, 112, 1, 253, 139, 112, 1, - 248, 77, 112, 1, 248, 50, 112, 1, 253, 152, 112, 1, 248, 57, 112, 1, 253, - 146, 112, 1, 248, 89, 112, 1, 248, 78, 112, 1, 248, 71, 112, 1, 242, 247, - 112, 1, 248, 75, 112, 1, 242, 249, 112, 1, 248, 82, 112, 1, 253, 126, - 112, 1, 248, 55, 112, 1, 253, 133, 112, 1, 248, 76, 112, 1, 253, 131, - 112, 1, 253, 129, 112, 1, 248, 65, 112, 1, 253, 141, 112, 1, 248, 81, - 112, 1, 222, 112, 1, 216, 112, 1, 253, 130, 112, 1, 253, 134, 112, 1, - 248, 94, 112, 1, 253, 171, 112, 1, 248, 46, 112, 1, 248, 66, 112, 1, 253, - 132, 112, 1, 219, 112, 21, 240, 81, 112, 21, 235, 80, 112, 33, 21, 253, - 140, 112, 33, 21, 71, 112, 33, 21, 253, 142, 112, 33, 21, 79, 112, 33, - 21, 253, 148, 112, 33, 21, 165, 144, 112, 33, 21, 165, 253, 182, 112, 33, - 21, 240, 61, 72, 112, 33, 21, 72, 112, 33, 21, 253, 149, 112, 33, 21, - 240, 61, 73, 112, 33, 21, 73, 112, 33, 21, 253, 151, 112, 21, 238, 72, - 112, 254, 43, 112, 1, 165, 253, 182, 112, 1, 165, 253, 191, 112, 33, 21, - 165, 162, 112, 33, 21, 165, 253, 191, 112, 26, 242, 217, 112, 26, 127, - 112, 26, 111, 112, 26, 166, 112, 26, 177, 112, 26, 176, 112, 26, 187, - 112, 26, 203, 112, 26, 195, 112, 26, 202, 112, 243, 44, 52, 118, 21, 232, - 77, 118, 21, 235, 61, 118, 21, 236, 173, 118, 1, 67, 118, 1, 253, 140, - 118, 1, 71, 118, 1, 253, 142, 118, 1, 79, 118, 1, 253, 148, 118, 1, 165, - 144, 118, 1, 165, 162, 118, 1, 72, 118, 1, 253, 149, 118, 1, 73, 118, 1, - 253, 151, 118, 1, 201, 118, 1, 248, 61, 118, 1, 253, 139, 118, 1, 248, - 77, 118, 1, 248, 50, 118, 1, 253, 152, 118, 1, 248, 57, 118, 1, 253, 146, - 118, 1, 248, 89, 118, 1, 248, 78, 118, 1, 248, 71, 118, 1, 242, 247, 118, - 1, 248, 75, 118, 1, 242, 249, 118, 1, 248, 82, 118, 1, 253, 126, 118, 1, - 248, 55, 118, 1, 253, 133, 118, 1, 248, 76, 118, 1, 253, 131, 118, 1, - 253, 129, 118, 1, 248, 65, 118, 1, 253, 141, 118, 1, 248, 81, 118, 1, - 222, 118, 1, 216, 118, 1, 253, 130, 118, 1, 253, 134, 118, 1, 248, 94, - 118, 1, 253, 171, 118, 1, 248, 46, 118, 1, 248, 66, 118, 1, 253, 132, - 118, 1, 219, 118, 21, 240, 81, 118, 21, 235, 80, 118, 33, 21, 253, 140, - 118, 33, 21, 71, 118, 33, 21, 253, 142, 118, 33, 21, 79, 118, 33, 21, - 253, 148, 118, 33, 21, 165, 144, 118, 33, 21, 72, 118, 33, 21, 253, 149, - 118, 33, 21, 73, 118, 33, 21, 253, 151, 118, 21, 238, 72, 118, 255, 37, - 240, 51, 69, 118, 255, 39, 240, 51, 69, 118, 1, 248, 96, 118, 1, 248, - 246, 118, 1, 249, 24, 118, 1, 165, 253, 182, 118, 1, 165, 253, 191, 118, - 26, 242, 217, 118, 26, 127, 118, 26, 111, 118, 26, 166, 118, 26, 177, - 118, 26, 176, 118, 26, 187, 118, 26, 203, 118, 26, 195, 118, 26, 202, - 118, 238, 191, 118, 1, 253, 138, 140, 21, 235, 61, 140, 21, 236, 173, - 140, 1, 67, 140, 1, 253, 140, 140, 1, 71, 140, 1, 253, 142, 140, 1, 79, - 140, 1, 253, 148, 140, 1, 72, 140, 1, 253, 164, 140, 1, 253, 149, 140, 1, - 73, 140, 1, 253, 156, 140, 1, 253, 151, 140, 1, 201, 140, 1, 248, 50, - 140, 1, 253, 152, 140, 1, 253, 146, 140, 1, 248, 78, 140, 1, 248, 71, - 140, 1, 248, 82, 140, 1, 253, 126, 140, 1, 253, 131, 140, 1, 243, 234, - 140, 1, 253, 129, 140, 1, 222, 140, 1, 216, 140, 1, 253, 130, 140, 1, - 248, 96, 140, 1, 253, 134, 140, 1, 248, 94, 140, 1, 243, 104, 140, 1, - 253, 171, 140, 1, 248, 46, 140, 1, 248, 66, 140, 1, 253, 132, 140, 1, - 219, 140, 33, 21, 253, 140, 140, 33, 21, 71, 140, 33, 21, 253, 142, 140, - 33, 21, 79, 140, 33, 21, 253, 148, 140, 33, 21, 72, 140, 33, 21, 253, - 164, 140, 33, 21, 253, 149, 140, 33, 21, 73, 140, 33, 21, 253, 156, 140, - 33, 21, 253, 151, 140, 21, 238, 72, 140, 255, 39, 240, 51, 69, 140, 26, - 242, 217, 140, 26, 127, 140, 26, 111, 140, 26, 166, 140, 26, 177, 140, - 26, 176, 140, 26, 187, 140, 26, 203, 140, 26, 195, 140, 26, 202, 140, 61, - 248, 53, 140, 61, 253, 125, 236, 149, 140, 61, 253, 125, 235, 49, 140, - 253, 137, 52, 140, 246, 90, 52, 140, 249, 206, 52, 140, 245, 59, 52, 140, - 241, 68, 52, 140, 255, 24, 60, 52, 140, 243, 44, 52, 140, 61, 52, 124, - 21, 232, 77, 124, 21, 235, 61, 124, 21, 236, 173, 124, 1, 67, 124, 1, - 253, 140, 124, 1, 71, 124, 1, 253, 142, 124, 1, 79, 124, 1, 253, 148, - 124, 1, 165, 144, 124, 1, 165, 162, 124, 1, 72, 124, 1, 253, 164, 124, 1, - 253, 149, 124, 1, 73, 124, 1, 253, 156, 124, 1, 253, 151, 124, 1, 201, - 124, 1, 248, 61, 124, 1, 253, 139, 124, 1, 248, 77, 124, 1, 248, 50, 124, - 1, 253, 152, 124, 1, 248, 57, 124, 1, 253, 146, 124, 1, 248, 89, 124, 1, - 248, 78, 124, 1, 248, 71, 124, 1, 242, 247, 124, 1, 248, 75, 124, 1, 242, - 249, 124, 1, 248, 82, 124, 1, 253, 126, 124, 1, 248, 55, 124, 1, 253, - 133, 124, 1, 248, 76, 124, 1, 253, 131, 124, 1, 253, 129, 124, 1, 248, - 65, 124, 1, 253, 141, 124, 1, 248, 81, 124, 1, 222, 124, 1, 216, 124, 1, - 253, 130, 124, 1, 248, 96, 124, 1, 253, 134, 124, 1, 248, 94, 124, 1, - 253, 171, 124, 1, 248, 46, 124, 1, 248, 66, 124, 1, 253, 132, 124, 1, - 219, 124, 33, 21, 253, 140, 124, 33, 21, 71, 124, 33, 21, 253, 142, 124, - 33, 21, 79, 124, 33, 21, 253, 148, 124, 33, 21, 165, 144, 124, 33, 21, - 165, 253, 182, 124, 33, 21, 72, 124, 33, 21, 253, 164, 124, 33, 21, 253, - 149, 124, 33, 21, 73, 124, 33, 21, 253, 156, 124, 33, 21, 253, 151, 124, - 21, 238, 72, 124, 240, 51, 69, 124, 255, 37, 240, 51, 69, 124, 1, 165, - 253, 182, 124, 1, 165, 253, 191, 124, 26, 242, 217, 124, 26, 127, 124, - 26, 111, 124, 26, 166, 124, 26, 177, 124, 26, 176, 124, 26, 187, 124, 26, - 203, 124, 26, 195, 124, 26, 202, 115, 21, 235, 61, 115, 21, 236, 173, - 115, 1, 67, 115, 1, 253, 140, 115, 1, 71, 115, 1, 253, 142, 115, 1, 79, - 115, 1, 253, 148, 115, 1, 165, 144, 115, 1, 165, 162, 115, 1, 72, 115, 1, - 253, 164, 115, 1, 253, 149, 115, 1, 73, 115, 1, 253, 156, 115, 1, 253, - 151, 115, 1, 201, 115, 1, 248, 61, 115, 1, 253, 139, 115, 1, 248, 77, - 115, 1, 248, 50, 115, 1, 253, 152, 115, 1, 248, 57, 115, 1, 253, 146, - 115, 1, 248, 89, 115, 1, 248, 78, 115, 1, 248, 71, 115, 1, 242, 247, 115, - 1, 248, 75, 115, 1, 242, 249, 115, 1, 248, 82, 115, 1, 253, 126, 115, 1, - 248, 55, 115, 1, 253, 133, 115, 1, 248, 76, 115, 1, 253, 131, 115, 1, - 253, 129, 115, 1, 248, 65, 115, 1, 253, 141, 115, 1, 248, 81, 115, 1, - 222, 115, 1, 216, 115, 1, 253, 130, 115, 1, 248, 96, 115, 1, 253, 134, - 115, 1, 248, 94, 115, 1, 253, 171, 115, 1, 248, 46, 115, 1, 248, 66, 115, - 1, 253, 132, 115, 1, 219, 115, 21, 240, 81, 115, 21, 235, 80, 115, 33, - 21, 253, 140, 115, 33, 21, 71, 115, 33, 21, 253, 142, 115, 33, 21, 79, - 115, 33, 21, 253, 148, 115, 33, 21, 165, 144, 115, 33, 21, 165, 253, 182, - 115, 33, 21, 72, 115, 33, 21, 253, 164, 115, 33, 21, 253, 149, 115, 33, - 21, 73, 115, 33, 21, 253, 156, 115, 33, 21, 253, 151, 115, 21, 238, 72, - 115, 240, 51, 69, 115, 255, 37, 240, 51, 69, 115, 1, 253, 179, 115, 1, - 165, 253, 182, 115, 1, 165, 253, 191, 115, 26, 242, 217, 115, 26, 127, - 115, 26, 111, 115, 26, 166, 115, 26, 177, 115, 26, 176, 115, 26, 187, - 115, 26, 203, 115, 26, 195, 115, 26, 202, 130, 21, 235, 61, 130, 21, 236, - 173, 130, 1, 67, 130, 1, 253, 140, 130, 1, 71, 130, 1, 253, 142, 130, 1, - 79, 130, 1, 253, 148, 130, 1, 165, 144, 130, 1, 165, 162, 130, 1, 72, - 130, 1, 253, 164, 130, 1, 253, 149, 130, 1, 73, 130, 1, 253, 156, 130, 1, - 253, 151, 130, 1, 201, 130, 1, 248, 61, 130, 1, 253, 139, 130, 1, 248, - 77, 130, 1, 248, 50, 130, 1, 253, 152, 130, 1, 248, 57, 130, 1, 253, 146, - 130, 1, 248, 89, 130, 1, 248, 78, 130, 1, 248, 71, 130, 1, 242, 247, 130, - 1, 248, 75, 130, 1, 242, 249, 130, 1, 248, 82, 130, 1, 253, 126, 130, 1, - 248, 55, 130, 1, 253, 133, 130, 1, 248, 76, 130, 1, 253, 131, 130, 1, - 253, 129, 130, 1, 248, 65, 130, 1, 253, 141, 130, 1, 248, 81, 130, 1, - 222, 130, 1, 216, 130, 1, 253, 130, 130, 1, 248, 96, 130, 1, 253, 134, - 130, 1, 248, 94, 130, 1, 243, 104, 130, 1, 253, 171, 130, 1, 248, 46, - 130, 1, 248, 66, 130, 1, 253, 132, 130, 1, 219, 130, 33, 21, 253, 140, - 130, 33, 21, 71, 130, 33, 21, 253, 142, 130, 33, 21, 79, 130, 33, 21, - 253, 148, 130, 33, 21, 165, 144, 130, 33, 21, 72, 130, 33, 21, 253, 164, - 130, 33, 21, 253, 149, 130, 33, 21, 73, 130, 33, 21, 253, 156, 130, 33, - 21, 253, 151, 130, 21, 238, 72, 130, 255, 39, 240, 51, 69, 130, 1, 165, - 253, 182, 130, 1, 165, 253, 191, 130, 26, 242, 217, 130, 26, 127, 130, - 26, 111, 130, 26, 166, 130, 26, 177, 130, 26, 176, 130, 26, 187, 130, 26, - 203, 130, 26, 195, 130, 26, 202, 123, 21, 233, 115, 123, 21, 235, 39, - 123, 1, 239, 0, 123, 1, 237, 53, 123, 1, 237, 56, 123, 1, 235, 161, 123, - 1, 239, 102, 123, 1, 237, 178, 123, 1, 239, 237, 123, 1, 238, 39, 123, 1, - 236, 41, 123, 1, 234, 209, 123, 1, 236, 37, 123, 1, 234, 202, 123, 1, - 239, 59, 123, 1, 237, 146, 123, 1, 237, 57, 123, 1, 239, 156, 123, 1, - 237, 227, 123, 1, 237, 68, 123, 1, 234, 8, 237, 16, 123, 1, 233, 58, 237, - 16, 123, 1, 234, 8, 236, 226, 123, 1, 233, 58, 236, 226, 123, 1, 239, - 105, 233, 89, 123, 1, 238, 122, 236, 226, 123, 1, 234, 8, 236, 250, 123, - 1, 233, 58, 236, 250, 123, 1, 234, 8, 236, 228, 123, 1, 233, 58, 236, - 228, 123, 1, 238, 154, 233, 89, 123, 1, 238, 154, 238, 1, 232, 185, 123, - 1, 238, 122, 236, 228, 123, 1, 234, 8, 235, 155, 123, 1, 233, 58, 235, - 155, 123, 1, 234, 8, 235, 97, 123, 1, 233, 58, 235, 97, 123, 1, 235, 104, - 237, 25, 123, 1, 238, 122, 235, 97, 123, 1, 234, 8, 237, 46, 123, 1, 233, - 58, 237, 46, 123, 1, 234, 8, 236, 222, 123, 1, 233, 58, 236, 222, 123, 1, - 238, 134, 237, 25, 123, 1, 238, 122, 236, 222, 123, 1, 234, 8, 237, 27, - 123, 1, 233, 58, 237, 27, 123, 1, 234, 8, 236, 220, 123, 1, 233, 58, 236, - 220, 123, 1, 237, 205, 123, 1, 249, 237, 236, 220, 123, 1, 238, 47, 123, - 1, 237, 247, 123, 1, 238, 134, 237, 20, 123, 1, 238, 41, 123, 1, 238, - 154, 236, 238, 123, 1, 235, 104, 236, 238, 123, 1, 238, 134, 236, 238, - 123, 1, 237, 171, 123, 1, 235, 104, 237, 20, 123, 1, 237, 155, 123, 21, - 234, 90, 123, 33, 21, 233, 67, 123, 33, 21, 243, 102, 233, 81, 123, 33, - 21, 248, 107, 233, 81, 123, 33, 21, 243, 102, 235, 130, 123, 33, 21, 248, - 107, 235, 130, 123, 33, 21, 243, 102, 234, 60, 123, 33, 21, 248, 107, - 234, 60, 123, 33, 21, 231, 104, 123, 33, 21, 237, 17, 123, 33, 21, 248, - 107, 237, 17, 123, 33, 21, 246, 18, 245, 62, 123, 33, 21, 238, 141, 254, - 64, 233, 67, 123, 33, 21, 238, 141, 254, 64, 248, 107, 233, 67, 123, 33, - 21, 238, 141, 254, 64, 232, 90, 123, 33, 21, 232, 90, 123, 33, 21, 248, - 107, 231, 104, 123, 33, 21, 248, 107, 232, 90, 123, 233, 51, 233, 214, - 107, 99, 255, 59, 249, 91, 107, 99, 253, 249, 246, 9, 107, 99, 253, 249, - 241, 202, 107, 99, 253, 249, 241, 203, 107, 99, 253, 249, 246, 12, 107, - 99, 253, 249, 237, 245, 107, 99, 254, 213, 252, 19, 107, 99, 254, 35, - 244, 253, 107, 99, 254, 35, 241, 53, 107, 99, 254, 35, 241, 51, 107, 99, - 255, 35, 253, 186, 107, 99, 254, 35, 245, 5, 107, 99, 255, 66, 247, 230, - 107, 99, 255, 48, 241, 49, 107, 99, 153, 242, 49, 107, 99, 253, 240, 243, - 127, 107, 99, 253, 240, 233, 218, 107, 99, 253, 240, 237, 237, 107, 99, - 255, 51, 252, 12, 107, 99, 255, 48, 250, 188, 107, 99, 153, 252, 208, - 107, 99, 253, 240, 242, 152, 107, 99, 253, 240, 239, 218, 107, 99, 253, - 240, 242, 151, 107, 99, 255, 51, 253, 150, 107, 99, 255, 69, 239, 2, 107, - 99, 255, 88, 252, 70, 107, 99, 254, 27, 242, 60, 107, 99, 255, 41, 253, - 179, 107, 99, 254, 27, 246, 244, 107, 99, 255, 41, 250, 233, 107, 99, - 254, 27, 238, 0, 107, 99, 255, 83, 222, 107, 99, 255, 66, 249, 20, 107, - 99, 255, 90, 252, 150, 107, 99, 253, 185, 107, 99, 255, 43, 243, 215, - 107, 99, 254, 8, 107, 99, 255, 96, 247, 191, 107, 99, 255, 35, 247, 63, - 107, 99, 255, 35, 247, 57, 107, 99, 255, 35, 252, 191, 107, 99, 255, 32, - 251, 62, 107, 99, 255, 43, 241, 55, 107, 99, 117, 248, 124, 107, 99, 255, - 32, 239, 145, 107, 99, 234, 231, 107, 99, 248, 83, 67, 107, 99, 253, 205, - 236, 32, 107, 99, 248, 83, 253, 140, 107, 99, 248, 83, 254, 32, 107, 99, - 248, 83, 71, 107, 99, 248, 83, 253, 142, 107, 99, 248, 83, 253, 252, 107, - 99, 248, 83, 252, 249, 107, 99, 248, 83, 79, 107, 99, 248, 83, 253, 148, - 107, 99, 237, 236, 107, 236, 181, 12, 244, 190, 107, 99, 248, 83, 72, - 107, 99, 248, 83, 253, 178, 107, 99, 248, 83, 73, 107, 99, 248, 83, 255, - 37, 237, 198, 107, 99, 248, 83, 255, 37, 236, 55, 107, 99, 232, 181, 107, - 99, 236, 56, 107, 99, 234, 220, 107, 99, 253, 205, 254, 90, 107, 99, 253, - 205, 248, 97, 107, 99, 253, 205, 252, 229, 107, 99, 253, 205, 235, 188, - 107, 99, 233, 41, 107, 99, 236, 63, 107, 99, 236, 141, 107, 99, 237, 158, - 107, 26, 242, 217, 107, 26, 127, 107, 26, 111, 107, 26, 166, 107, 26, + 181, 46, 129, 236, 242, 239, 194, 48, 129, 236, 242, 239, 194, 46, 129, + 238, 117, 129, 253, 137, 129, 1, 231, 210, 227, 74, 129, 1, 231, 210, + 240, 186, 129, 1, 231, 210, 248, 107, 11, 1, 253, 78, 2, 204, 181, 246, + 52, 46, 11, 1, 253, 78, 2, 53, 253, 68, 19, 204, 181, 48, 11, 1, 253, 78, + 2, 204, 181, 235, 198, 226, 226, 46, 11, 1, 253, 78, 2, 204, 181, 235, + 198, 226, 226, 253, 68, 19, 171, 181, 48, 11, 1, 253, 78, 2, 171, 181, + 253, 68, 19, 53, 48, 11, 1, 253, 78, 2, 241, 143, 3, 228, 234, 46, 11, 1, + 253, 78, 2, 3, 179, 11, 1, 94, 2, 171, 181, 48, 11, 1, 94, 2, 204, 181, + 235, 198, 226, 226, 46, 11, 1, 251, 84, 2, 171, 181, 228, 200, 253, 68, + 19, 3, 230, 169, 11, 1, 251, 84, 2, 241, 143, 3, 228, 234, 46, 11, 1, + 234, 186, 2, 108, 11, 1, 233, 192, 2, 248, 0, 181, 48, 11, 1, 255, 52, 2, + 171, 181, 48, 11, 1, 255, 52, 2, 204, 181, 235, 198, 249, 86, 48, 11, 1, + 255, 52, 2, 171, 181, 228, 200, 48, 11, 1, 248, 99, 2, 171, 181, 46, 11, + 1, 248, 99, 2, 204, 181, 235, 198, 226, 226, 46, 11, 1, 240, 213, 2, 53, + 48, 11, 1, 240, 213, 2, 204, 181, 48, 11, 1, 240, 213, 2, 204, 181, 235, + 198, 226, 226, 46, 11, 1, 51, 2, 53, 48, 11, 1, 51, 2, 53, 46, 11, 1, + 198, 2, 171, 181, 46, 11, 1, 198, 2, 3, 230, 169, 11, 1, 198, 2, 3, 179, + 11, 1, 182, 2, 125, 11, 1, 234, 186, 2, 171, 181, 228, 200, 48, 11, 1, + 234, 186, 2, 143, 48, 11, 1, 233, 192, 2, 171, 181, 228, 200, 48, 199, 1, + 246, 249, 199, 1, 232, 129, 199, 1, 237, 127, 199, 1, 234, 233, 199, 1, + 253, 165, 199, 1, 239, 217, 199, 1, 241, 8, 199, 1, 255, 33, 199, 1, 228, + 231, 199, 1, 239, 29, 199, 1, 248, 137, 199, 1, 250, 207, 199, 1, 230, + 86, 199, 1, 240, 38, 199, 1, 247, 206, 199, 1, 247, 75, 199, 1, 233, 190, + 199, 1, 251, 47, 199, 1, 227, 91, 199, 1, 230, 142, 199, 1, 228, 3, 199, + 1, 236, 88, 199, 1, 241, 100, 199, 1, 252, 78, 199, 1, 229, 129, 199, 1, + 246, 176, 199, 1, 240, 193, 199, 1, 230, 85, 199, 1, 227, 101, 199, 1, + 232, 121, 199, 1, 234, 5, 199, 1, 251, 100, 199, 1, 87, 199, 1, 227, 27, + 199, 1, 255, 49, 199, 1, 247, 111, 199, 1, 235, 89, 199, 1, 228, 141, + 199, 255, 98, 199, 255, 103, 199, 245, 226, 199, 249, 21, 199, 229, 34, + 199, 236, 201, 199, 249, 26, 199, 248, 145, 199, 236, 241, 199, 236, 248, + 199, 231, 40, 199, 1, 238, 89, 85, 21, 252, 159, 85, 21, 254, 236, 85, + 21, 228, 177, 85, 1, 232, 93, 67, 85, 1, 67, 85, 1, 255, 104, 85, 1, 71, + 85, 1, 241, 209, 85, 1, 79, 85, 1, 228, 238, 85, 1, 165, 144, 85, 1, 165, + 162, 85, 1, 252, 160, 72, 85, 1, 232, 93, 72, 85, 1, 72, 85, 1, 255, 55, + 85, 1, 252, 160, 73, 85, 1, 232, 93, 73, 85, 1, 73, 85, 1, 254, 144, 85, + 1, 201, 85, 1, 240, 194, 85, 1, 247, 208, 85, 1, 247, 115, 85, 1, 237, + 242, 85, 1, 252, 176, 85, 1, 252, 96, 85, 1, 241, 107, 85, 1, 241, 90, + 85, 1, 237, 57, 85, 1, 229, 130, 85, 1, 229, 120, 85, 1, 251, 41, 85, 1, + 251, 26, 85, 1, 237, 150, 85, 1, 230, 182, 85, 1, 230, 87, 85, 1, 251, + 102, 85, 1, 250, 208, 85, 1, 238, 91, 85, 1, 237, 142, 85, 1, 236, 142, + 85, 1, 236, 33, 85, 1, 253, 166, 85, 1, 253, 46, 85, 1, 222, 85, 1, 216, + 85, 1, 234, 236, 85, 1, 234, 72, 85, 1, 240, 41, 85, 1, 239, 172, 85, 1, + 239, 171, 85, 1, 228, 233, 85, 1, 232, 147, 85, 1, 231, 163, 85, 1, 234, + 8, 85, 1, 219, 85, 21, 237, 81, 85, 21, 254, 134, 85, 33, 21, 255, 104, + 85, 33, 21, 71, 85, 33, 21, 241, 209, 85, 33, 21, 79, 85, 33, 21, 228, + 238, 85, 33, 21, 165, 144, 85, 33, 21, 165, 234, 73, 85, 33, 21, 252, + 160, 72, 85, 33, 21, 232, 93, 72, 85, 33, 21, 72, 85, 33, 21, 255, 55, + 85, 33, 21, 252, 160, 73, 85, 33, 21, 232, 93, 73, 85, 33, 21, 73, 85, + 33, 21, 254, 144, 85, 21, 228, 182, 85, 236, 218, 85, 231, 84, 21, 229, + 33, 85, 231, 84, 21, 254, 238, 85, 247, 46, 255, 90, 85, 255, 83, 255, + 90, 85, 1, 235, 92, 85, 1, 240, 181, 85, 1, 247, 105, 85, 1, 227, 102, + 85, 1, 251, 31, 85, 1, 234, 149, 85, 1, 248, 139, 85, 1, 227, 110, 85, 1, + 165, 234, 73, 85, 1, 165, 239, 173, 85, 33, 21, 165, 162, 85, 33, 21, + 165, 239, 173, 85, 251, 70, 85, 45, 251, 70, 85, 26, 227, 80, 85, 26, + 127, 85, 26, 111, 85, 26, 166, 85, 26, 177, 85, 26, 176, 85, 26, 187, 85, + 26, 203, 85, 26, 195, 85, 26, 202, 85, 255, 97, 52, 85, 1, 247, 77, 208, + 101, 21, 252, 159, 101, 21, 254, 236, 101, 21, 228, 177, 101, 1, 67, 101, + 1, 255, 104, 101, 1, 71, 101, 1, 241, 209, 101, 1, 79, 101, 1, 228, 238, + 101, 1, 165, 144, 101, 1, 165, 162, 101, 1, 72, 101, 1, 255, 55, 101, 1, + 73, 101, 1, 254, 144, 101, 1, 201, 101, 1, 240, 194, 101, 1, 247, 208, + 101, 1, 247, 115, 101, 1, 237, 242, 101, 1, 252, 176, 101, 1, 252, 96, + 101, 1, 241, 107, 101, 1, 241, 90, 101, 1, 237, 57, 101, 1, 229, 130, + 101, 1, 229, 120, 101, 1, 251, 41, 101, 1, 251, 26, 101, 1, 237, 150, + 101, 1, 230, 182, 101, 1, 230, 87, 101, 1, 251, 102, 101, 1, 250, 208, + 101, 1, 238, 91, 101, 1, 236, 142, 101, 1, 236, 33, 101, 1, 253, 166, + 101, 1, 253, 46, 101, 1, 222, 101, 1, 216, 101, 1, 234, 236, 101, 1, 240, + 41, 101, 1, 232, 147, 101, 1, 231, 163, 101, 1, 234, 8, 101, 1, 219, 101, + 21, 237, 81, 101, 21, 254, 134, 101, 33, 21, 255, 104, 101, 33, 21, 71, + 101, 33, 21, 241, 209, 101, 33, 21, 79, 101, 33, 21, 228, 238, 101, 33, + 21, 165, 144, 101, 33, 21, 165, 234, 73, 101, 33, 21, 72, 101, 33, 21, + 255, 55, 101, 33, 21, 73, 101, 33, 21, 254, 144, 101, 21, 228, 182, 101, + 1, 240, 188, 230, 182, 101, 254, 145, 239, 233, 69, 101, 1, 234, 72, 101, + 1, 234, 149, 101, 1, 227, 110, 101, 1, 165, 234, 73, 101, 1, 165, 239, + 173, 101, 33, 21, 165, 162, 101, 33, 21, 165, 239, 173, 101, 26, 227, 80, + 101, 26, 127, 101, 26, 111, 101, 26, 166, 101, 26, 177, 101, 26, 176, + 101, 26, 187, 101, 26, 203, 101, 26, 195, 101, 26, 202, 101, 1, 234, 237, + 2, 238, 223, 250, 198, 101, 1, 234, 237, 2, 168, 250, 198, 101, 234, 30, + 69, 101, 234, 30, 52, 101, 251, 133, 237, 77, 127, 101, 251, 133, 237, + 77, 111, 101, 251, 133, 237, 77, 166, 101, 251, 133, 237, 77, 177, 101, + 251, 133, 237, 77, 236, 210, 239, 229, 230, 81, 230, 77, 250, 227, 101, + 251, 133, 250, 228, 232, 0, 101, 241, 122, 133, 21, 255, 82, 253, 31, + 133, 21, 253, 31, 133, 21, 228, 177, 133, 1, 67, 133, 1, 255, 104, 133, + 1, 71, 133, 1, 241, 209, 133, 1, 79, 133, 1, 228, 238, 133, 1, 249, 22, + 133, 1, 255, 55, 133, 1, 236, 202, 133, 1, 254, 144, 133, 1, 201, 133, 1, + 240, 194, 133, 1, 247, 208, 133, 1, 247, 115, 133, 1, 237, 242, 133, 1, + 252, 176, 133, 1, 252, 96, 133, 1, 241, 107, 133, 1, 241, 90, 133, 1, + 237, 57, 133, 1, 229, 130, 133, 1, 229, 120, 133, 1, 251, 41, 133, 1, + 251, 26, 133, 1, 237, 150, 133, 1, 230, 182, 133, 1, 230, 87, 133, 1, + 251, 102, 133, 1, 250, 208, 133, 1, 238, 91, 133, 1, 236, 142, 133, 1, + 236, 33, 133, 1, 253, 166, 133, 1, 253, 46, 133, 1, 222, 133, 1, 216, + 133, 1, 234, 236, 133, 1, 240, 41, 133, 1, 239, 172, 133, 1, 228, 233, + 133, 1, 232, 147, 133, 1, 234, 8, 133, 1, 219, 133, 21, 237, 81, 133, 33, + 21, 255, 104, 133, 33, 21, 71, 133, 33, 21, 241, 209, 133, 33, 21, 79, + 133, 33, 21, 228, 238, 133, 33, 21, 249, 22, 133, 33, 21, 255, 55, 133, + 33, 21, 236, 202, 133, 33, 21, 254, 144, 133, 21, 228, 182, 133, 1, 240, + 181, 133, 1, 247, 105, 133, 1, 227, 102, 133, 1, 234, 72, 133, 1, 248, + 139, 133, 26, 227, 80, 133, 26, 127, 133, 26, 111, 133, 26, 166, 133, 26, + 177, 133, 26, 176, 133, 26, 187, 133, 26, 203, 133, 26, 195, 133, 26, + 202, 133, 229, 246, 133, 255, 81, 133, 241, 132, 133, 228, 245, 133, 249, + 0, 236, 206, 112, 21, 252, 159, 112, 21, 254, 236, 112, 21, 228, 177, + 112, 1, 67, 112, 1, 255, 104, 112, 1, 71, 112, 1, 241, 209, 112, 1, 79, + 112, 1, 228, 238, 112, 1, 165, 144, 112, 1, 165, 162, 112, 33, 252, 160, + 72, 112, 1, 72, 112, 1, 255, 55, 112, 33, 252, 160, 73, 112, 1, 73, 112, + 1, 254, 144, 112, 1, 201, 112, 1, 240, 194, 112, 1, 247, 208, 112, 1, + 247, 115, 112, 1, 237, 242, 112, 1, 252, 176, 112, 1, 252, 96, 112, 1, + 241, 107, 112, 1, 241, 90, 112, 1, 237, 57, 112, 1, 229, 130, 112, 1, + 229, 120, 112, 1, 251, 41, 112, 1, 251, 26, 112, 1, 237, 150, 112, 1, + 230, 182, 112, 1, 230, 87, 112, 1, 251, 102, 112, 1, 250, 208, 112, 1, + 238, 91, 112, 1, 236, 142, 112, 1, 236, 33, 112, 1, 253, 166, 112, 1, + 253, 46, 112, 1, 222, 112, 1, 216, 112, 1, 234, 236, 112, 1, 240, 41, + 112, 1, 239, 172, 112, 1, 228, 233, 112, 1, 232, 147, 112, 1, 231, 163, + 112, 1, 234, 8, 112, 1, 219, 112, 21, 237, 81, 112, 21, 254, 134, 112, + 33, 21, 255, 104, 112, 33, 21, 71, 112, 33, 21, 241, 209, 112, 33, 21, + 79, 112, 33, 21, 228, 238, 112, 33, 21, 165, 144, 112, 33, 21, 165, 234, + 73, 112, 33, 21, 252, 160, 72, 112, 33, 21, 72, 112, 33, 21, 255, 55, + 112, 33, 21, 252, 160, 73, 112, 33, 21, 73, 112, 33, 21, 254, 144, 112, + 21, 228, 182, 112, 236, 218, 112, 1, 165, 234, 73, 112, 1, 165, 239, 173, + 112, 33, 21, 165, 162, 112, 33, 21, 165, 239, 173, 112, 26, 227, 80, 112, + 26, 127, 112, 26, 111, 112, 26, 166, 112, 26, 177, 112, 26, 176, 112, 26, + 187, 112, 26, 203, 112, 26, 195, 112, 26, 202, 112, 234, 30, 52, 118, 21, + 252, 159, 118, 21, 254, 236, 118, 21, 228, 177, 118, 1, 67, 118, 1, 255, + 104, 118, 1, 71, 118, 1, 241, 209, 118, 1, 79, 118, 1, 228, 238, 118, 1, + 165, 144, 118, 1, 165, 162, 118, 1, 72, 118, 1, 255, 55, 118, 1, 73, 118, + 1, 254, 144, 118, 1, 201, 118, 1, 240, 194, 118, 1, 247, 208, 118, 1, + 247, 115, 118, 1, 237, 242, 118, 1, 252, 176, 118, 1, 252, 96, 118, 1, + 241, 107, 118, 1, 241, 90, 118, 1, 237, 57, 118, 1, 229, 130, 118, 1, + 229, 120, 118, 1, 251, 41, 118, 1, 251, 26, 118, 1, 237, 150, 118, 1, + 230, 182, 118, 1, 230, 87, 118, 1, 251, 102, 118, 1, 250, 208, 118, 1, + 238, 91, 118, 1, 236, 142, 118, 1, 236, 33, 118, 1, 253, 166, 118, 1, + 253, 46, 118, 1, 222, 118, 1, 216, 118, 1, 234, 236, 118, 1, 240, 41, + 118, 1, 239, 172, 118, 1, 228, 233, 118, 1, 232, 147, 118, 1, 231, 163, + 118, 1, 234, 8, 118, 1, 219, 118, 21, 237, 81, 118, 21, 254, 134, 118, + 33, 21, 255, 104, 118, 33, 21, 71, 118, 33, 21, 241, 209, 118, 33, 21, + 79, 118, 33, 21, 228, 238, 118, 33, 21, 165, 144, 118, 33, 21, 72, 118, + 33, 21, 255, 55, 118, 33, 21, 73, 118, 33, 21, 254, 144, 118, 21, 228, + 182, 118, 255, 56, 239, 233, 69, 118, 254, 145, 239, 233, 69, 118, 1, + 234, 72, 118, 1, 234, 149, 118, 1, 227, 110, 118, 1, 165, 234, 73, 118, + 1, 165, 239, 173, 118, 26, 227, 80, 118, 26, 127, 118, 26, 111, 118, 26, + 166, 118, 26, 177, 118, 26, 176, 118, 26, 187, 118, 26, 203, 118, 26, + 195, 118, 26, 202, 118, 241, 122, 118, 1, 228, 143, 140, 21, 254, 236, + 140, 21, 228, 177, 140, 1, 67, 140, 1, 255, 104, 140, 1, 71, 140, 1, 241, + 209, 140, 1, 79, 140, 1, 228, 238, 140, 1, 72, 140, 1, 249, 22, 140, 1, + 255, 55, 140, 1, 73, 140, 1, 236, 202, 140, 1, 254, 144, 140, 1, 201, + 140, 1, 237, 242, 140, 1, 252, 176, 140, 1, 241, 107, 140, 1, 237, 57, + 140, 1, 229, 130, 140, 1, 237, 150, 140, 1, 230, 182, 140, 1, 238, 91, + 140, 1, 237, 142, 140, 1, 236, 142, 140, 1, 222, 140, 1, 216, 140, 1, + 234, 236, 140, 1, 234, 72, 140, 1, 240, 41, 140, 1, 239, 172, 140, 1, + 239, 171, 140, 1, 228, 233, 140, 1, 232, 147, 140, 1, 231, 163, 140, 1, + 234, 8, 140, 1, 219, 140, 33, 21, 255, 104, 140, 33, 21, 71, 140, 33, 21, + 241, 209, 140, 33, 21, 79, 140, 33, 21, 228, 238, 140, 33, 21, 72, 140, + 33, 21, 249, 22, 140, 33, 21, 255, 55, 140, 33, 21, 73, 140, 33, 21, 236, + 202, 140, 33, 21, 254, 144, 140, 21, 228, 182, 140, 254, 145, 239, 233, + 69, 140, 26, 227, 80, 140, 26, 127, 140, 26, 111, 140, 26, 166, 140, 26, + 177, 140, 26, 176, 140, 26, 187, 140, 26, 203, 140, 26, 195, 140, 26, + 202, 140, 61, 230, 112, 140, 61, 236, 210, 246, 31, 140, 61, 236, 210, + 230, 32, 140, 251, 45, 52, 140, 238, 163, 52, 140, 227, 209, 52, 140, + 250, 255, 52, 140, 251, 159, 52, 140, 254, 168, 60, 52, 140, 234, 30, 52, + 140, 61, 52, 124, 21, 252, 159, 124, 21, 254, 236, 124, 21, 228, 177, + 124, 1, 67, 124, 1, 255, 104, 124, 1, 71, 124, 1, 241, 209, 124, 1, 79, + 124, 1, 228, 238, 124, 1, 165, 144, 124, 1, 165, 162, 124, 1, 72, 124, 1, + 249, 22, 124, 1, 255, 55, 124, 1, 73, 124, 1, 236, 202, 124, 1, 254, 144, + 124, 1, 201, 124, 1, 240, 194, 124, 1, 247, 208, 124, 1, 247, 115, 124, + 1, 237, 242, 124, 1, 252, 176, 124, 1, 252, 96, 124, 1, 241, 107, 124, 1, + 241, 90, 124, 1, 237, 57, 124, 1, 229, 130, 124, 1, 229, 120, 124, 1, + 251, 41, 124, 1, 251, 26, 124, 1, 237, 150, 124, 1, 230, 182, 124, 1, + 230, 87, 124, 1, 251, 102, 124, 1, 250, 208, 124, 1, 238, 91, 124, 1, + 236, 142, 124, 1, 236, 33, 124, 1, 253, 166, 124, 1, 253, 46, 124, 1, + 222, 124, 1, 216, 124, 1, 234, 236, 124, 1, 234, 72, 124, 1, 240, 41, + 124, 1, 239, 172, 124, 1, 228, 233, 124, 1, 232, 147, 124, 1, 231, 163, + 124, 1, 234, 8, 124, 1, 219, 124, 33, 21, 255, 104, 124, 33, 21, 71, 124, + 33, 21, 241, 209, 124, 33, 21, 79, 124, 33, 21, 228, 238, 124, 33, 21, + 165, 144, 124, 33, 21, 165, 234, 73, 124, 33, 21, 72, 124, 33, 21, 249, + 22, 124, 33, 21, 255, 55, 124, 33, 21, 73, 124, 33, 21, 236, 202, 124, + 33, 21, 254, 144, 124, 21, 228, 182, 124, 239, 233, 69, 124, 255, 56, + 239, 233, 69, 124, 1, 165, 234, 73, 124, 1, 165, 239, 173, 124, 26, 227, + 80, 124, 26, 127, 124, 26, 111, 124, 26, 166, 124, 26, 177, 124, 26, 176, + 124, 26, 187, 124, 26, 203, 124, 26, 195, 124, 26, 202, 115, 21, 254, + 236, 115, 21, 228, 177, 115, 1, 67, 115, 1, 255, 104, 115, 1, 71, 115, 1, + 241, 209, 115, 1, 79, 115, 1, 228, 238, 115, 1, 165, 144, 115, 1, 165, + 162, 115, 1, 72, 115, 1, 249, 22, 115, 1, 255, 55, 115, 1, 73, 115, 1, + 236, 202, 115, 1, 254, 144, 115, 1, 201, 115, 1, 240, 194, 115, 1, 247, + 208, 115, 1, 247, 115, 115, 1, 237, 242, 115, 1, 252, 176, 115, 1, 252, + 96, 115, 1, 241, 107, 115, 1, 241, 90, 115, 1, 237, 57, 115, 1, 229, 130, + 115, 1, 229, 120, 115, 1, 251, 41, 115, 1, 251, 26, 115, 1, 237, 150, + 115, 1, 230, 182, 115, 1, 230, 87, 115, 1, 251, 102, 115, 1, 250, 208, + 115, 1, 238, 91, 115, 1, 236, 142, 115, 1, 236, 33, 115, 1, 253, 166, + 115, 1, 253, 46, 115, 1, 222, 115, 1, 216, 115, 1, 234, 236, 115, 1, 234, + 72, 115, 1, 240, 41, 115, 1, 239, 172, 115, 1, 228, 233, 115, 1, 232, + 147, 115, 1, 231, 163, 115, 1, 234, 8, 115, 1, 219, 115, 21, 237, 81, + 115, 21, 254, 134, 115, 33, 21, 255, 104, 115, 33, 21, 71, 115, 33, 21, + 241, 209, 115, 33, 21, 79, 115, 33, 21, 228, 238, 115, 33, 21, 165, 144, + 115, 33, 21, 165, 234, 73, 115, 33, 21, 72, 115, 33, 21, 249, 22, 115, + 33, 21, 255, 55, 115, 33, 21, 73, 115, 33, 21, 236, 202, 115, 33, 21, + 254, 144, 115, 21, 228, 182, 115, 239, 233, 69, 115, 255, 56, 239, 233, + 69, 115, 1, 248, 139, 115, 1, 165, 234, 73, 115, 1, 165, 239, 173, 115, + 26, 227, 80, 115, 26, 127, 115, 26, 111, 115, 26, 166, 115, 26, 177, 115, + 26, 176, 115, 26, 187, 115, 26, 203, 115, 26, 195, 115, 26, 202, 130, 21, + 254, 236, 130, 21, 228, 177, 130, 1, 67, 130, 1, 255, 104, 130, 1, 71, + 130, 1, 241, 209, 130, 1, 79, 130, 1, 228, 238, 130, 1, 165, 144, 130, 1, + 165, 162, 130, 1, 72, 130, 1, 249, 22, 130, 1, 255, 55, 130, 1, 73, 130, + 1, 236, 202, 130, 1, 254, 144, 130, 1, 201, 130, 1, 240, 194, 130, 1, + 247, 208, 130, 1, 247, 115, 130, 1, 237, 242, 130, 1, 252, 176, 130, 1, + 252, 96, 130, 1, 241, 107, 130, 1, 241, 90, 130, 1, 237, 57, 130, 1, 229, + 130, 130, 1, 229, 120, 130, 1, 251, 41, 130, 1, 251, 26, 130, 1, 237, + 150, 130, 1, 230, 182, 130, 1, 230, 87, 130, 1, 251, 102, 130, 1, 250, + 208, 130, 1, 238, 91, 130, 1, 236, 142, 130, 1, 236, 33, 130, 1, 253, + 166, 130, 1, 253, 46, 130, 1, 222, 130, 1, 216, 130, 1, 234, 236, 130, 1, + 234, 72, 130, 1, 240, 41, 130, 1, 239, 172, 130, 1, 239, 171, 130, 1, + 228, 233, 130, 1, 232, 147, 130, 1, 231, 163, 130, 1, 234, 8, 130, 1, + 219, 130, 33, 21, 255, 104, 130, 33, 21, 71, 130, 33, 21, 241, 209, 130, + 33, 21, 79, 130, 33, 21, 228, 238, 130, 33, 21, 165, 144, 130, 33, 21, + 72, 130, 33, 21, 249, 22, 130, 33, 21, 255, 55, 130, 33, 21, 73, 130, 33, + 21, 236, 202, 130, 33, 21, 254, 144, 130, 21, 228, 182, 130, 254, 145, + 239, 233, 69, 130, 1, 165, 234, 73, 130, 1, 165, 239, 173, 130, 26, 227, + 80, 130, 26, 127, 130, 26, 111, 130, 26, 166, 130, 26, 177, 130, 26, 176, + 130, 26, 187, 130, 26, 203, 130, 26, 195, 130, 26, 202, 123, 21, 254, + 235, 123, 21, 228, 176, 123, 1, 254, 126, 123, 1, 255, 99, 123, 1, 255, + 69, 123, 1, 255, 73, 123, 1, 241, 113, 123, 1, 241, 208, 123, 1, 228, + 235, 123, 1, 228, 237, 123, 1, 241, 130, 123, 1, 241, 131, 123, 1, 241, + 204, 123, 1, 241, 206, 123, 1, 248, 146, 123, 1, 249, 19, 123, 1, 255, + 45, 123, 1, 236, 146, 123, 1, 236, 198, 123, 1, 254, 135, 123, 1, 255, + 22, 240, 223, 123, 1, 239, 98, 240, 223, 123, 1, 255, 22, 247, 179, 123, + 1, 239, 98, 247, 179, 123, 1, 240, 251, 238, 86, 123, 1, 233, 233, 247, + 179, 123, 1, 255, 22, 252, 137, 123, 1, 239, 98, 252, 137, 123, 1, 255, + 22, 241, 99, 123, 1, 239, 98, 241, 99, 123, 1, 230, 178, 238, 86, 123, 1, + 230, 178, 233, 232, 238, 87, 123, 1, 233, 233, 241, 99, 123, 1, 255, 22, + 229, 128, 123, 1, 239, 98, 229, 128, 123, 1, 255, 22, 251, 32, 123, 1, + 239, 98, 251, 32, 123, 1, 238, 115, 238, 60, 123, 1, 233, 233, 251, 32, + 123, 1, 255, 22, 230, 138, 123, 1, 239, 98, 230, 138, 123, 1, 255, 22, + 251, 44, 123, 1, 239, 98, 251, 44, 123, 1, 251, 69, 238, 60, 123, 1, 233, + 233, 251, 44, 123, 1, 255, 22, 236, 84, 123, 1, 239, 98, 236, 84, 123, 1, + 255, 22, 253, 126, 123, 1, 239, 98, 253, 126, 123, 1, 239, 46, 123, 1, + 255, 13, 253, 126, 123, 1, 227, 215, 123, 1, 234, 208, 123, 1, 251, 69, + 240, 4, 123, 1, 228, 214, 123, 1, 230, 178, 233, 223, 123, 1, 238, 115, + 233, 223, 123, 1, 251, 69, 233, 223, 123, 1, 246, 214, 123, 1, 238, 115, + 240, 4, 123, 1, 248, 109, 123, 21, 255, 42, 123, 33, 21, 255, 72, 123, + 33, 21, 240, 202, 255, 74, 123, 33, 21, 250, 174, 255, 74, 123, 33, 21, + 240, 202, 241, 128, 123, 33, 21, 250, 174, 241, 128, 123, 33, 21, 240, + 202, 236, 140, 123, 33, 21, 250, 174, 236, 140, 123, 33, 21, 247, 204, + 123, 33, 21, 240, 121, 123, 33, 21, 250, 174, 240, 121, 123, 33, 21, 240, + 123, 250, 239, 123, 33, 21, 240, 122, 246, 250, 255, 72, 123, 33, 21, + 240, 122, 246, 250, 250, 174, 255, 72, 123, 33, 21, 240, 122, 246, 250, + 247, 178, 123, 33, 21, 247, 178, 123, 33, 21, 250, 174, 247, 204, 123, + 33, 21, 250, 174, 247, 178, 123, 235, 122, 240, 91, 107, 99, 240, 128, + 241, 2, 107, 99, 240, 176, 240, 191, 107, 99, 240, 176, 240, 171, 107, + 99, 240, 176, 240, 170, 107, 99, 240, 176, 240, 173, 107, 99, 240, 176, + 234, 219, 107, 99, 237, 223, 237, 215, 107, 99, 252, 48, 252, 88, 107, + 99, 252, 48, 252, 55, 107, 99, 252, 48, 252, 87, 107, 99, 231, 217, 231, + 216, 107, 99, 252, 48, 252, 45, 107, 99, 227, 168, 227, 175, 107, 99, + 250, 117, 252, 93, 107, 99, 153, 236, 92, 107, 99, 230, 39, 230, 80, 107, + 99, 230, 39, 238, 75, 107, 99, 230, 39, 236, 11, 107, 99, 237, 139, 238, + 2, 107, 99, 250, 117, 250, 240, 107, 99, 153, 230, 155, 107, 99, 230, 39, + 230, 21, 107, 99, 230, 39, 230, 84, 107, 99, 230, 39, 230, 36, 107, 99, + 237, 139, 237, 83, 107, 99, 253, 5, 253, 154, 107, 99, 235, 208, 235, + 221, 107, 99, 236, 18, 236, 13, 107, 99, 248, 22, 248, 139, 107, 99, 236, + 18, 236, 31, 107, 99, 248, 22, 248, 121, 107, 99, 236, 18, 233, 240, 107, + 99, 238, 176, 222, 107, 99, 227, 168, 227, 239, 107, 99, 234, 92, 234, + 42, 107, 99, 234, 43, 107, 99, 239, 168, 239, 187, 107, 99, 239, 135, + 107, 99, 228, 83, 228, 139, 107, 99, 231, 217, 233, 249, 107, 99, 231, + 217, 234, 26, 107, 99, 231, 217, 231, 61, 107, 99, 246, 68, 246, 155, + 107, 99, 239, 168, 252, 33, 107, 99, 117, 255, 2, 107, 99, 246, 68, 237, + 134, 107, 99, 236, 131, 107, 99, 233, 230, 67, 107, 99, 239, 95, 246, + 233, 107, 99, 233, 230, 255, 104, 107, 99, 233, 230, 255, 15, 107, 99, + 233, 230, 71, 107, 99, 233, 230, 241, 209, 107, 99, 233, 230, 229, 32, + 107, 99, 233, 230, 229, 31, 107, 99, 233, 230, 79, 107, 99, 233, 230, + 228, 238, 107, 99, 236, 20, 107, 251, 133, 12, 253, 155, 107, 99, 233, + 230, 72, 107, 99, 233, 230, 255, 75, 107, 99, 233, 230, 73, 107, 99, 233, + 230, 255, 56, 239, 91, 107, 99, 233, 230, 255, 56, 239, 92, 107, 99, 240, + 27, 107, 99, 239, 88, 107, 99, 239, 89, 107, 99, 239, 95, 248, 255, 107, + 99, 239, 95, 230, 38, 107, 99, 239, 95, 229, 185, 107, 99, 239, 95, 252, + 79, 107, 99, 230, 78, 107, 99, 237, 189, 107, 99, 227, 234, 107, 99, 248, + 18, 107, 26, 227, 80, 107, 26, 127, 107, 26, 111, 107, 26, 166, 107, 26, 177, 107, 26, 176, 107, 26, 187, 107, 26, 203, 107, 26, 195, 107, 26, - 202, 107, 99, 233, 113, 107, 99, 239, 108, 152, 1, 253, 190, 152, 1, 253, - 249, 243, 35, 152, 1, 253, 249, 248, 120, 152, 1, 248, 172, 152, 1, 253, - 224, 152, 1, 255, 35, 248, 120, 152, 1, 248, 133, 152, 1, 253, 225, 152, - 1, 87, 152, 1, 253, 240, 243, 35, 152, 1, 253, 240, 248, 120, 152, 1, - 253, 173, 152, 1, 254, 1, 152, 1, 253, 208, 152, 1, 254, 27, 243, 35, - 152, 1, 255, 41, 248, 120, 152, 1, 254, 27, 248, 120, 152, 1, 255, 41, - 243, 35, 152, 1, 253, 181, 152, 1, 253, 162, 152, 1, 255, 43, 243, 215, - 152, 1, 255, 43, 246, 54, 152, 1, 253, 177, 152, 1, 255, 35, 243, 35, - 152, 1, 255, 32, 243, 35, 152, 1, 73, 152, 1, 255, 32, 248, 120, 152, - 235, 69, 152, 33, 21, 67, 152, 33, 21, 253, 205, 248, 162, 152, 33, 21, - 253, 140, 152, 33, 21, 254, 32, 152, 33, 21, 71, 152, 33, 21, 253, 142, - 152, 33, 21, 255, 14, 152, 33, 21, 254, 77, 152, 33, 21, 79, 152, 33, 21, - 253, 148, 152, 33, 21, 253, 205, 251, 159, 152, 235, 143, 21, 253, 216, - 152, 235, 143, 21, 248, 133, 152, 33, 21, 72, 152, 33, 21, 254, 89, 152, - 33, 21, 73, 152, 33, 21, 254, 33, 152, 33, 21, 253, 149, 152, 255, 59, - 253, 134, 152, 188, 253, 205, 254, 90, 152, 188, 253, 205, 248, 97, 152, - 188, 253, 205, 253, 212, 152, 188, 253, 205, 239, 18, 152, 232, 118, 69, - 152, 234, 227, 152, 26, 242, 217, 152, 26, 127, 152, 26, 111, 152, 26, - 166, 152, 26, 177, 152, 26, 176, 152, 26, 187, 152, 26, 203, 152, 26, - 195, 152, 26, 202, 152, 255, 32, 253, 173, 152, 255, 32, 253, 181, 47, 4, - 254, 43, 47, 158, 248, 129, 253, 221, 253, 226, 236, 133, 67, 47, 158, - 248, 129, 253, 221, 253, 226, 254, 79, 249, 155, 250, 112, 222, 47, 158, - 248, 129, 253, 221, 253, 226, 254, 79, 248, 129, 243, 49, 222, 47, 158, - 54, 253, 221, 253, 226, 251, 224, 222, 47, 158, 238, 171, 253, 221, 253, - 226, 252, 173, 222, 47, 158, 243, 25, 253, 221, 253, 226, 249, 137, 249, - 161, 222, 47, 158, 253, 221, 253, 226, 243, 49, 249, 161, 222, 47, 158, - 247, 65, 243, 23, 47, 158, 244, 230, 253, 221, 248, 167, 47, 158, 250, - 127, 249, 162, 253, 221, 248, 167, 47, 158, 231, 143, 240, 249, 47, 158, - 235, 202, 243, 49, 241, 40, 47, 158, 243, 23, 47, 158, 248, 234, 243, 23, - 47, 158, 243, 49, 243, 23, 47, 158, 248, 234, 243, 49, 243, 23, 47, 158, - 254, 235, 250, 159, 242, 126, 243, 23, 47, 158, 249, 154, 251, 29, 243, - 23, 47, 158, 243, 25, 243, 140, 243, 72, 255, 81, 183, 248, 100, 47, 158, - 248, 129, 240, 249, 47, 237, 22, 21, 250, 158, 240, 70, 47, 237, 22, 21, - 251, 192, 240, 70, 47, 232, 89, 21, 252, 175, 251, 12, 244, 67, 240, 70, - 47, 232, 89, 21, 241, 3, 253, 129, 47, 232, 89, 21, 247, 67, 239, 230, - 47, 21, 248, 101, 248, 151, 243, 179, 47, 21, 248, 101, 248, 151, 240, - 183, 47, 21, 248, 101, 248, 151, 243, 187, 47, 21, 248, 101, 254, 66, - 243, 179, 47, 21, 248, 101, 254, 66, 240, 183, 47, 21, 248, 101, 248, - 151, 248, 101, 251, 252, 47, 26, 242, 217, 47, 26, 127, 47, 26, 111, 47, - 26, 166, 47, 26, 177, 47, 26, 176, 47, 26, 187, 47, 26, 203, 47, 26, 195, - 47, 26, 202, 47, 26, 137, 127, 47, 26, 137, 111, 47, 26, 137, 166, 47, - 26, 137, 177, 47, 26, 137, 176, 47, 26, 137, 187, 47, 26, 137, 203, 47, - 26, 137, 195, 47, 26, 137, 202, 47, 26, 137, 242, 217, 47, 158, 244, 228, - 240, 70, 47, 158, 249, 119, 243, 153, 254, 116, 253, 108, 47, 158, 243, - 25, 243, 140, 243, 72, 248, 199, 254, 112, 248, 100, 47, 158, 249, 119, - 243, 153, 252, 174, 240, 70, 47, 158, 253, 223, 248, 167, 47, 158, 254, - 129, 241, 4, 47, 158, 254, 95, 243, 72, 243, 189, 47, 158, 254, 95, 243, - 72, 243, 188, 47, 158, 254, 80, 243, 206, 243, 189, 47, 158, 254, 80, - 243, 206, 243, 188, 47, 21, 255, 8, 240, 250, 47, 21, 254, 198, 240, 250, - 47, 1, 201, 47, 1, 248, 61, 47, 1, 253, 139, 47, 1, 248, 77, 47, 1, 248, - 50, 47, 1, 253, 152, 47, 1, 248, 57, 47, 1, 253, 146, 47, 1, 248, 78, 47, - 1, 248, 71, 47, 1, 242, 247, 47, 1, 248, 75, 47, 1, 242, 249, 47, 1, 248, - 82, 47, 1, 253, 126, 47, 1, 248, 55, 47, 1, 253, 133, 47, 1, 248, 76, 47, - 1, 253, 131, 47, 1, 253, 129, 47, 1, 248, 65, 47, 1, 253, 141, 47, 1, - 248, 81, 47, 1, 222, 47, 1, 248, 90, 47, 1, 243, 130, 47, 1, 248, 153, - 47, 1, 243, 165, 47, 1, 253, 138, 47, 1, 248, 99, 47, 1, 253, 163, 47, 1, - 254, 78, 47, 1, 216, 47, 1, 253, 130, 47, 1, 253, 134, 47, 1, 248, 46, - 47, 1, 248, 66, 47, 1, 253, 132, 47, 1, 219, 47, 1, 67, 47, 1, 243, 210, - 47, 1, 234, 28, 253, 130, 47, 33, 21, 253, 140, 47, 33, 21, 71, 47, 33, - 21, 253, 142, 47, 33, 21, 79, 47, 33, 21, 253, 148, 47, 33, 21, 165, 144, - 47, 33, 21, 165, 253, 182, 47, 33, 21, 165, 162, 47, 33, 21, 165, 253, - 191, 47, 33, 21, 72, 47, 33, 21, 253, 164, 47, 33, 21, 73, 47, 33, 21, - 253, 156, 47, 21, 252, 140, 255, 91, 254, 212, 253, 160, 47, 21, 249, - 155, 244, 212, 47, 33, 21, 224, 71, 47, 33, 21, 224, 253, 142, 47, 21, - 254, 116, 255, 12, 254, 210, 253, 133, 47, 21, 254, 239, 246, 39, 47, - 158, 237, 168, 47, 158, 239, 157, 47, 21, 254, 192, 240, 70, 47, 21, 248, - 122, 240, 70, 47, 21, 254, 191, 254, 129, 248, 100, 47, 21, 251, 223, - 248, 100, 47, 21, 254, 94, 254, 148, 237, 34, 47, 21, 254, 94, 254, 200, - 237, 34, 47, 213, 1, 201, 47, 213, 1, 248, 61, 47, 213, 1, 253, 139, 47, - 213, 1, 248, 77, 47, 213, 1, 248, 50, 47, 213, 1, 253, 152, 47, 213, 1, - 248, 57, 47, 213, 1, 253, 146, 47, 213, 1, 248, 78, 47, 213, 1, 248, 71, - 47, 213, 1, 242, 247, 47, 213, 1, 248, 75, 47, 213, 1, 242, 249, 47, 213, - 1, 248, 82, 47, 213, 1, 253, 126, 47, 213, 1, 248, 55, 47, 213, 1, 253, - 133, 47, 213, 1, 248, 76, 47, 213, 1, 253, 131, 47, 213, 1, 253, 129, 47, - 213, 1, 248, 65, 47, 213, 1, 253, 141, 47, 213, 1, 248, 81, 47, 213, 1, - 222, 47, 213, 1, 248, 90, 47, 213, 1, 243, 130, 47, 213, 1, 248, 153, 47, - 213, 1, 243, 165, 47, 213, 1, 253, 138, 47, 213, 1, 248, 99, 47, 213, 1, - 253, 163, 47, 213, 1, 254, 78, 47, 213, 1, 216, 47, 213, 1, 253, 130, 47, - 213, 1, 253, 134, 47, 213, 1, 248, 46, 47, 213, 1, 248, 66, 47, 213, 1, - 253, 132, 47, 213, 1, 219, 47, 213, 1, 67, 47, 213, 1, 243, 210, 47, 213, - 1, 234, 28, 253, 138, 47, 213, 1, 234, 28, 216, 47, 213, 1, 234, 28, 253, - 130, 47, 255, 60, 255, 64, 248, 61, 47, 255, 60, 255, 64, 254, 183, 248, - 199, 254, 112, 248, 100, 47, 232, 82, 21, 96, 243, 147, 47, 232, 82, 21, - 136, 243, 147, 47, 232, 82, 21, 250, 144, 247, 138, 47, 232, 82, 21, 252, - 170, 241, 2, 47, 12, 250, 206, 253, 243, 47, 12, 254, 124, 252, 139, 47, - 12, 246, 237, 245, 97, 47, 12, 254, 124, 254, 236, 249, 154, 245, 127, - 47, 12, 249, 137, 253, 129, 47, 12, 253, 192, 253, 243, 47, 12, 253, 192, - 255, 47, 248, 234, 238, 127, 47, 12, 253, 192, 255, 47, 251, 30, 238, - 127, 47, 12, 253, 192, 255, 47, 248, 199, 238, 127, 47, 21, 248, 101, - 254, 66, 243, 187, 47, 158, 244, 229, 249, 162, 255, 57, 253, 226, 240, - 216, 47, 158, 246, 89, 253, 221, 255, 57, 253, 226, 240, 216, 131, 1, - 201, 131, 1, 248, 61, 131, 1, 253, 139, 131, 1, 248, 77, 131, 1, 248, 50, - 131, 1, 253, 152, 131, 1, 248, 57, 131, 1, 253, 146, 131, 1, 248, 89, - 131, 1, 248, 78, 131, 1, 246, 175, 131, 1, 248, 71, 131, 1, 242, 247, - 131, 1, 248, 75, 131, 1, 242, 249, 131, 1, 248, 82, 131, 1, 253, 126, - 131, 1, 248, 55, 131, 1, 253, 133, 131, 1, 248, 76, 131, 1, 253, 131, - 131, 1, 253, 129, 131, 1, 248, 65, 131, 1, 253, 141, 131, 1, 248, 81, - 131, 1, 222, 131, 1, 216, 131, 1, 253, 130, 131, 1, 253, 134, 131, 1, - 253, 138, 131, 1, 253, 132, 131, 1, 219, 131, 1, 248, 94, 131, 1, 67, - 131, 1, 71, 131, 1, 253, 142, 131, 1, 79, 131, 1, 253, 148, 131, 1, 72, - 131, 1, 73, 131, 1, 253, 151, 131, 33, 21, 253, 140, 131, 33, 21, 71, - 131, 33, 21, 253, 142, 131, 33, 21, 79, 131, 33, 21, 253, 148, 131, 33, - 21, 72, 131, 33, 21, 253, 149, 131, 21, 235, 61, 131, 21, 53, 46, 131, - 21, 236, 173, 131, 21, 238, 72, 131, 26, 242, 217, 131, 26, 127, 131, 26, - 111, 131, 26, 166, 131, 26, 177, 131, 26, 176, 131, 26, 187, 131, 26, - 203, 131, 26, 195, 131, 26, 202, 131, 21, 240, 101, 236, 210, 131, 21, - 236, 210, 131, 12, 236, 52, 131, 12, 234, 102, 131, 12, 229, 63, 131, 12, - 236, 30, 131, 1, 248, 46, 131, 1, 248, 66, 131, 1, 165, 144, 131, 1, 165, - 253, 182, 131, 1, 165, 162, 131, 1, 165, 253, 191, 131, 33, 21, 165, 144, - 131, 33, 21, 165, 253, 182, 131, 33, 21, 165, 162, 131, 33, 21, 165, 253, - 191, 75, 5, 1, 254, 19, 75, 5, 1, 248, 195, 75, 5, 1, 248, 158, 75, 5, 1, - 248, 205, 75, 5, 1, 253, 202, 75, 5, 1, 249, 11, 75, 5, 1, 249, 25, 75, - 5, 1, 248, 253, 75, 5, 1, 253, 247, 75, 5, 1, 248, 162, 75, 5, 1, 248, - 224, 75, 5, 1, 248, 131, 75, 5, 1, 248, 171, 75, 5, 1, 254, 9, 75, 5, 1, - 248, 236, 75, 5, 1, 243, 138, 75, 5, 1, 248, 243, 75, 5, 1, 248, 134, 75, - 5, 1, 248, 254, 75, 5, 1, 254, 75, 75, 5, 1, 243, 115, 75, 5, 1, 243, - 103, 75, 5, 1, 243, 95, 75, 5, 1, 248, 242, 75, 5, 1, 243, 33, 75, 5, 1, - 243, 88, 75, 5, 1, 248, 100, 75, 5, 1, 248, 217, 75, 5, 1, 248, 201, 75, - 5, 1, 243, 87, 75, 5, 1, 249, 16, 75, 5, 1, 243, 101, 75, 5, 1, 248, 212, - 75, 5, 1, 253, 168, 75, 5, 1, 248, 160, 75, 5, 1, 253, 170, 75, 5, 1, - 248, 213, 75, 5, 1, 248, 215, 75, 1, 254, 19, 75, 1, 248, 195, 75, 1, - 248, 158, 75, 1, 248, 205, 75, 1, 253, 202, 75, 1, 249, 11, 75, 1, 249, - 25, 75, 1, 248, 253, 75, 1, 253, 247, 75, 1, 248, 162, 75, 1, 248, 224, - 75, 1, 248, 131, 75, 1, 248, 171, 75, 1, 254, 9, 75, 1, 248, 236, 75, 1, - 243, 138, 75, 1, 248, 243, 75, 1, 248, 134, 75, 1, 248, 254, 75, 1, 254, - 75, 75, 1, 243, 115, 75, 1, 243, 103, 75, 1, 243, 95, 75, 1, 248, 242, - 75, 1, 243, 33, 75, 1, 243, 88, 75, 1, 248, 100, 75, 1, 248, 217, 75, 1, - 248, 201, 75, 1, 243, 87, 75, 1, 249, 16, 75, 1, 243, 101, 75, 1, 248, - 212, 75, 1, 253, 168, 75, 1, 248, 160, 75, 1, 253, 170, 75, 1, 248, 213, - 75, 1, 248, 215, 75, 1, 253, 245, 75, 1, 255, 9, 75, 1, 241, 94, 75, 1, - 205, 248, 158, 75, 1, 248, 105, 75, 235, 91, 234, 6, 49, 1, 75, 248, 171, - 23, 102, 238, 99, 23, 102, 232, 87, 23, 102, 240, 80, 23, 102, 238, 102, - 23, 102, 232, 101, 23, 102, 240, 85, 23, 102, 240, 78, 23, 102, 240, 83, - 23, 102, 233, 79, 23, 102, 243, 34, 23, 102, 234, 32, 23, 102, 240, 75, - 23, 102, 240, 71, 23, 102, 233, 77, 23, 102, 236, 195, 23, 102, 236, 198, - 23, 102, 236, 205, 23, 102, 236, 201, 23, 102, 240, 74, 23, 102, 231, - 108, 23, 102, 233, 105, 23, 102, 231, 97, 23, 102, 232, 187, 23, 102, - 231, 56, 23, 102, 232, 108, 23, 102, 233, 106, 23, 102, 232, 85, 23, 102, - 231, 71, 23, 102, 232, 92, 23, 102, 231, 40, 23, 102, 231, 109, 23, 102, - 232, 195, 23, 102, 231, 110, 23, 102, 233, 66, 23, 102, 226, 243, 23, - 102, 226, 244, 23, 102, 227, 4, 23, 102, 229, 52, 23, 102, 227, 3, 23, - 102, 232, 106, 23, 102, 231, 75, 23, 102, 231, 52, 23, 102, 231, 51, 23, - 102, 231, 41, 23, 102, 226, 235, 23, 102, 232, 99, 23, 102, 233, 102, 23, - 102, 232, 100, 23, 102, 233, 103, 23, 102, 233, 245, 23, 102, 233, 76, - 23, 102, 226, 253, 23, 102, 231, 30, 23, 102, 233, 244, 23, 102, 233, - 101, 23, 102, 232, 55, 23, 102, 232, 56, 23, 102, 232, 58, 23, 102, 232, - 57, 23, 102, 233, 243, 23, 102, 231, 120, 23, 102, 226, 247, 23, 102, - 227, 13, 23, 102, 226, 232, 23, 102, 236, 234, 23, 102, 231, 106, 23, - 102, 231, 142, 23, 102, 232, 175, 23, 102, 232, 176, 23, 102, 233, 208, - 23, 102, 231, 68, 23, 102, 233, 78, 23, 102, 232, 174, 23, 102, 231, 66, - 23, 102, 231, 70, 23, 102, 231, 69, 23, 102, 235, 115, 23, 102, 232, 119, - 23, 102, 231, 62, 23, 102, 226, 238, 23, 102, 227, 1, 23, 102, 226, 229, - 23, 102, 227, 14, 23, 102, 231, 61, 23, 102, 227, 15, 23, 102, 226, 237, - 23, 102, 231, 50, 23, 102, 227, 9, 23, 102, 233, 104, 23, 102, 232, 102, - 23, 102, 238, 114, 23, 146, 238, 114, 23, 146, 67, 23, 146, 253, 178, 23, - 146, 216, 23, 146, 249, 18, 23, 146, 254, 59, 23, 146, 72, 23, 146, 249, - 22, 23, 146, 253, 254, 23, 146, 73, 23, 146, 253, 138, 23, 146, 249, 12, - 23, 146, 253, 193, 23, 146, 253, 162, 23, 146, 79, 23, 146, 249, 14, 23, - 146, 253, 170, 23, 146, 253, 187, 23, 146, 253, 161, 23, 146, 254, 61, - 23, 146, 253, 189, 23, 146, 71, 23, 146, 249, 229, 23, 146, 249, 230, 23, - 146, 247, 211, 23, 146, 242, 189, 23, 146, 245, 83, 23, 146, 245, 84, 23, - 146, 241, 96, 23, 146, 242, 195, 23, 146, 242, 196, 23, 146, 246, 230, - 23, 146, 252, 52, 23, 146, 246, 231, 23, 146, 252, 53, 23, 146, 252, 54, - 23, 146, 240, 255, 23, 146, 238, 233, 23, 146, 239, 251, 23, 146, 247, - 231, 23, 146, 244, 58, 23, 146, 252, 247, 23, 146, 247, 180, 23, 146, - 238, 36, 23, 146, 247, 181, 23, 146, 252, 248, 23, 146, 247, 234, 23, - 146, 242, 199, 23, 146, 247, 235, 23, 146, 238, 234, 23, 146, 241, 0, 23, - 146, 247, 236, 23, 146, 244, 60, 23, 146, 245, 86, 23, 146, 241, 99, 23, - 146, 247, 226, 23, 146, 251, 97, 23, 146, 245, 223, 23, 146, 251, 98, 23, - 146, 251, 99, 23, 146, 245, 222, 23, 146, 237, 175, 23, 146, 240, 156, - 23, 146, 235, 169, 23, 146, 237, 65, 23, 146, 237, 64, 23, 146, 233, 246, - 23, 114, 238, 99, 23, 114, 232, 87, 23, 114, 232, 91, 23, 114, 240, 80, - 23, 114, 232, 93, 23, 114, 232, 94, 23, 114, 238, 102, 23, 114, 240, 85, - 23, 114, 231, 98, 23, 114, 232, 96, 23, 114, 232, 97, 23, 114, 233, 74, - 23, 114, 231, 43, 23, 114, 231, 42, 23, 114, 232, 85, 23, 114, 240, 78, - 23, 114, 240, 83, 23, 114, 233, 66, 23, 114, 243, 34, 23, 114, 234, 32, - 23, 114, 240, 75, 23, 114, 240, 71, 23, 114, 236, 195, 23, 114, 236, 198, - 23, 114, 236, 205, 23, 114, 236, 201, 23, 114, 240, 74, 23, 114, 231, - 145, 23, 114, 226, 239, 23, 114, 231, 108, 23, 114, 231, 97, 23, 114, - 233, 90, 23, 114, 231, 47, 23, 114, 231, 74, 23, 114, 231, 56, 23, 114, - 232, 61, 23, 114, 226, 245, 23, 114, 232, 108, 23, 114, 231, 111, 23, - 114, 226, 241, 23, 114, 233, 106, 23, 114, 226, 240, 23, 114, 227, 5, 23, - 114, 226, 255, 23, 114, 226, 251, 23, 114, 226, 234, 23, 114, 229, 55, - 23, 114, 231, 54, 23, 114, 231, 76, 23, 114, 226, 246, 23, 114, 231, 147, - 23, 114, 232, 183, 23, 114, 232, 92, 23, 114, 233, 86, 23, 114, 229, 50, - 23, 114, 231, 46, 23, 114, 231, 73, 23, 114, 232, 182, 23, 114, 231, 40, - 23, 114, 232, 196, 23, 114, 231, 51, 23, 114, 232, 194, 23, 114, 231, 41, - 23, 114, 232, 99, 23, 114, 232, 100, 23, 114, 233, 103, 23, 114, 233, 76, - 23, 114, 236, 234, 23, 114, 231, 106, 23, 114, 226, 248, 23, 114, 233, - 78, 23, 114, 231, 67, 23, 114, 235, 115, 23, 114, 231, 58, 23, 114, 227, - 0, 23, 114, 231, 50, 23, 114, 227, 9, 23, 114, 232, 170, 23, 114, 232, - 172, 23, 114, 232, 169, 23, 114, 232, 171, 23, 114, 232, 102, 22, 4, 219, - 22, 4, 253, 236, 22, 4, 253, 214, 22, 4, 248, 114, 22, 4, 249, 80, 22, 4, - 253, 168, 22, 4, 253, 184, 22, 4, 251, 76, 22, 4, 253, 134, 22, 4, 254, - 8, 22, 4, 253, 251, 22, 4, 249, 101, 22, 4, 249, 102, 22, 4, 253, 250, - 22, 4, 253, 216, 22, 4, 248, 227, 22, 4, 251, 56, 22, 4, 251, 60, 22, 4, - 251, 58, 22, 4, 243, 194, 22, 4, 245, 143, 22, 4, 251, 57, 22, 4, 251, - 59, 22, 4, 245, 144, 22, 4, 222, 22, 4, 253, 154, 22, 4, 253, 180, 22, 4, - 249, 110, 22, 4, 249, 111, 22, 4, 253, 206, 22, 4, 253, 181, 22, 4, 248, - 169, 22, 4, 252, 202, 22, 4, 252, 206, 22, 4, 252, 204, 22, 4, 247, 131, - 22, 4, 247, 132, 22, 4, 252, 203, 22, 4, 252, 205, 22, 4, 247, 133, 22, - 4, 253, 130, 22, 4, 253, 185, 22, 4, 253, 209, 22, 4, 248, 182, 22, 4, - 249, 153, 22, 4, 253, 194, 22, 4, 253, 160, 22, 4, 252, 157, 22, 4, 253, - 132, 22, 4, 253, 211, 22, 4, 253, 198, 22, 4, 249, 158, 22, 4, 248, 184, - 22, 4, 253, 210, 22, 4, 253, 186, 22, 4, 248, 252, 22, 4, 248, 46, 22, 4, - 248, 248, 22, 4, 248, 185, 22, 4, 244, 7, 22, 4, 244, 9, 22, 4, 248, 118, - 22, 4, 248, 110, 22, 4, 243, 121, 22, 4, 253, 217, 22, 4, 254, 29, 22, 4, - 254, 28, 22, 4, 248, 241, 22, 4, 252, 88, 22, 4, 254, 70, 22, 4, 254, 45, - 22, 4, 252, 98, 22, 4, 252, 112, 22, 4, 252, 114, 22, 4, 247, 21, 22, 4, - 247, 22, 22, 4, 252, 113, 22, 4, 252, 89, 22, 4, 252, 93, 22, 4, 252, 91, - 22, 4, 247, 7, 22, 4, 247, 8, 22, 4, 252, 90, 22, 4, 252, 92, 22, 4, 247, - 9, 22, 4, 247, 11, 22, 4, 242, 72, 22, 4, 242, 73, 22, 4, 247, 10, 22, 4, - 253, 141, 22, 4, 253, 243, 22, 4, 254, 34, 22, 4, 249, 30, 22, 4, 248, - 197, 22, 4, 253, 242, 22, 4, 254, 1, 22, 4, 249, 36, 22, 4, 253, 171, 22, - 4, 254, 49, 22, 4, 254, 48, 22, 4, 253, 6, 22, 4, 249, 10, 22, 4, 254, - 12, 22, 4, 254, 13, 22, 4, 253, 24, 22, 4, 253, 126, 22, 4, 253, 196, 22, - 4, 253, 212, 22, 4, 249, 172, 22, 4, 248, 255, 22, 4, 253, 195, 22, 4, - 87, 22, 4, 249, 7, 22, 4, 253, 152, 22, 4, 254, 84, 22, 4, 254, 55, 22, - 4, 249, 37, 22, 4, 250, 154, 22, 4, 254, 54, 22, 4, 253, 224, 22, 4, 248, - 203, 22, 4, 253, 253, 22, 4, 255, 6, 22, 4, 253, 188, 22, 4, 253, 41, 22, - 4, 253, 42, 22, 4, 254, 132, 22, 4, 254, 133, 22, 4, 253, 47, 22, 4, 253, - 53, 22, 4, 253, 55, 22, 4, 247, 206, 22, 4, 247, 207, 22, 4, 253, 54, 22, - 4, 253, 131, 22, 4, 253, 150, 22, 4, 253, 166, 22, 4, 248, 231, 22, 4, - 249, 118, 22, 4, 253, 197, 22, 4, 253, 173, 22, 4, 248, 176, 22, 4, 248, - 78, 22, 4, 249, 125, 22, 4, 248, 178, 22, 4, 246, 198, 22, 4, 246, 200, - 22, 4, 252, 46, 22, 4, 248, 133, 22, 4, 246, 212, 22, 4, 238, 62, 67, 22, - 4, 238, 62, 79, 22, 4, 238, 62, 71, 22, 4, 238, 62, 253, 140, 22, 4, 238, - 62, 253, 164, 22, 4, 238, 62, 72, 22, 4, 238, 62, 73, 22, 4, 238, 62, - 253, 138, 22, 4, 201, 22, 4, 253, 203, 22, 4, 253, 215, 22, 4, 249, 90, - 22, 4, 251, 141, 22, 4, 253, 172, 22, 4, 253, 190, 22, 4, 251, 157, 22, - 4, 248, 221, 22, 4, 248, 223, 22, 4, 243, 65, 22, 4, 246, 25, 22, 4, 248, - 222, 22, 4, 251, 170, 22, 4, 251, 174, 22, 4, 251, 172, 22, 4, 246, 26, - 22, 4, 246, 27, 22, 4, 251, 171, 22, 4, 251, 173, 22, 4, 246, 28, 22, 4, - 246, 30, 22, 4, 241, 207, 22, 4, 241, 208, 22, 4, 246, 29, 22, 4, 253, - 138, 22, 4, 254, 14, 22, 4, 253, 187, 22, 4, 248, 190, 22, 4, 249, 199, - 22, 4, 253, 170, 22, 4, 253, 177, 22, 4, 253, 34, 22, 4, 234, 12, 67, 22, - 4, 234, 12, 79, 22, 4, 234, 12, 71, 22, 4, 234, 12, 253, 140, 22, 4, 234, - 12, 253, 164, 22, 4, 234, 12, 72, 22, 4, 234, 12, 73, 22, 4, 253, 163, - 22, 4, 254, 18, 22, 4, 254, 17, 22, 4, 249, 216, 22, 4, 248, 194, 22, 4, - 253, 228, 22, 4, 253, 222, 22, 4, 253, 117, 22, 4, 248, 99, 22, 4, 249, - 219, 22, 4, 249, 217, 22, 4, 247, 245, 22, 4, 243, 139, 22, 4, 248, 123, - 22, 4, 249, 218, 22, 4, 248, 4, 22, 4, 216, 22, 4, 253, 161, 22, 4, 253, - 189, 22, 4, 248, 191, 22, 4, 248, 192, 22, 4, 253, 254, 22, 4, 253, 162, - 22, 4, 253, 84, 22, 4, 253, 133, 22, 4, 253, 232, 22, 4, 253, 201, 22, 4, - 250, 177, 22, 4, 248, 149, 22, 4, 253, 200, 22, 4, 253, 225, 22, 4, 250, - 214, 22, 4, 248, 75, 22, 4, 249, 52, 22, 4, 249, 51, 22, 4, 245, 36, 22, - 4, 245, 41, 22, 4, 249, 50, 22, 4, 248, 204, 22, 4, 245, 57, 22, 4, 253, - 146, 22, 4, 254, 25, 22, 4, 254, 7, 22, 4, 251, 110, 22, 4, 248, 161, 22, - 4, 254, 24, 22, 4, 253, 248, 22, 4, 251, 131, 22, 4, 253, 139, 22, 4, - 253, 235, 22, 4, 254, 6, 22, 4, 248, 211, 22, 4, 249, 68, 22, 4, 254, 5, - 22, 4, 253, 234, 22, 4, 251, 25, 22, 4, 251, 36, 22, 4, 251, 38, 22, 4, - 245, 134, 22, 4, 245, 135, 22, 4, 251, 37, 22, 4, 249, 70, 22, 4, 249, - 74, 22, 4, 249, 72, 22, 4, 245, 99, 22, 4, 245, 103, 22, 4, 249, 71, 22, - 4, 249, 73, 22, 4, 241, 134, 22, 4, 248, 55, 22, 4, 249, 177, 22, 4, 248, - 121, 22, 4, 243, 76, 22, 4, 243, 77, 22, 4, 248, 111, 22, 4, 248, 97, 22, - 4, 247, 147, 22, 4, 248, 57, 22, 4, 248, 200, 22, 4, 248, 67, 22, 4, 244, - 252, 22, 4, 243, 54, 22, 4, 248, 88, 22, 4, 248, 125, 22, 4, 245, 13, 22, - 4, 248, 65, 22, 4, 252, 64, 22, 4, 248, 68, 22, 4, 246, 243, 22, 4, 246, - 245, 22, 4, 249, 136, 22, 4, 248, 238, 22, 4, 246, 247, 22, 4, 248, 90, - 22, 4, 249, 5, 22, 4, 248, 140, 22, 4, 247, 160, 22, 4, 244, 39, 22, 4, - 248, 112, 22, 4, 249, 4, 22, 4, 247, 162, 22, 4, 252, 242, 22, 4, 252, - 246, 22, 4, 252, 244, 22, 4, 247, 177, 22, 4, 247, 178, 22, 4, 252, 243, - 22, 4, 252, 245, 22, 4, 247, 179, 22, 4, 253, 179, 22, 4, 254, 93, 22, 4, - 253, 245, 22, 4, 249, 60, 22, 4, 249, 61, 22, 4, 254, 62, 22, 4, 254, 63, - 22, 4, 249, 66, 22, 4, 253, 129, 22, 4, 253, 239, 22, 4, 253, 147, 22, 4, - 249, 133, 22, 4, 248, 180, 22, 4, 253, 175, 22, 4, 253, 208, 22, 4, 248, - 181, 22, 4, 252, 158, 22, 4, 251, 248, 22, 4, 251, 1, 22, 50, 234, 194, - 69, 22, 238, 213, 69, 22, 235, 42, 22, 248, 37, 208, 22, 240, 27, 22, - 234, 14, 22, 240, 24, 22, 239, 166, 240, 24, 22, 236, 156, 69, 22, 235, - 91, 234, 6, 22, 26, 127, 22, 26, 111, 22, 26, 166, 22, 26, 177, 22, 26, - 176, 22, 26, 187, 22, 26, 203, 22, 26, 195, 22, 26, 202, 22, 61, 248, 53, - 22, 61, 238, 77, 22, 61, 238, 101, 22, 61, 240, 136, 22, 61, 240, 50, 22, - 61, 240, 234, 22, 61, 237, 38, 22, 61, 238, 182, 22, 61, 238, 147, 22, - 61, 236, 149, 22, 61, 253, 219, 235, 49, 22, 4, 235, 94, 248, 169, 22, 4, - 248, 230, 22, 4, 246, 101, 22, 4, 248, 229, 22, 4, 235, 94, 249, 36, 22, - 4, 250, 136, 22, 4, 244, 237, 22, 4, 250, 135, 22, 4, 235, 94, 249, 66, - 22, 4, 251, 0, 22, 4, 245, 95, 22, 4, 250, 255, 22, 4, 235, 94, 248, 181, - 22, 4, 248, 240, 22, 4, 247, 2, 22, 4, 248, 239, 22, 243, 10, 158, 242, - 198, 22, 243, 10, 158, 241, 83, 22, 243, 10, 158, 238, 212, 22, 243, 10, - 158, 242, 215, 238, 212, 22, 243, 10, 158, 241, 84, 22, 243, 10, 158, - 241, 199, 22, 243, 10, 158, 239, 24, 22, 243, 10, 158, 241, 149, 22, 243, - 10, 158, 232, 130, 22, 243, 10, 158, 246, 22, 109, 1, 67, 109, 1, 72, - 109, 1, 71, 109, 1, 73, 109, 1, 79, 109, 1, 179, 109, 1, 253, 139, 109, - 1, 201, 109, 1, 254, 5, 109, 1, 254, 6, 109, 1, 253, 234, 109, 1, 253, - 235, 109, 1, 254, 169, 109, 1, 219, 109, 1, 253, 168, 109, 1, 253, 214, - 109, 1, 253, 184, 109, 1, 253, 236, 109, 1, 254, 98, 109, 1, 253, 134, - 109, 1, 253, 250, 109, 1, 253, 251, 109, 1, 253, 216, 109, 1, 254, 8, - 109, 1, 254, 196, 109, 1, 222, 109, 1, 253, 206, 109, 1, 253, 180, 109, - 1, 253, 181, 109, 1, 253, 154, 109, 1, 253, 131, 109, 1, 249, 83, 109, 1, - 251, 253, 109, 1, 253, 197, 109, 1, 253, 166, 109, 1, 253, 173, 109, 1, - 253, 150, 109, 1, 254, 115, 109, 1, 252, 103, 109, 1, 252, 104, 109, 1, - 252, 105, 109, 1, 249, 149, 109, 1, 249, 150, 109, 1, 252, 110, 109, 1, - 253, 132, 109, 1, 193, 109, 1, 253, 210, 109, 1, 253, 198, 109, 1, 253, - 186, 109, 1, 253, 211, 109, 1, 254, 127, 109, 1, 253, 133, 109, 1, 253, - 126, 109, 1, 253, 200, 109, 1, 253, 195, 109, 1, 253, 201, 109, 1, 253, - 212, 109, 1, 253, 225, 109, 1, 253, 232, 109, 1, 254, 158, 109, 1, 249, - 55, 109, 1, 249, 179, 109, 1, 249, 180, 109, 1, 249, 181, 109, 1, 249, - 182, 109, 1, 249, 183, 109, 1, 252, 225, 109, 1, 248, 90, 109, 1, 248, - 112, 109, 1, 248, 140, 109, 1, 249, 4, 109, 1, 249, 5, 109, 1, 252, 230, - 109, 1, 253, 138, 109, 1, 253, 170, 109, 1, 253, 187, 109, 1, 253, 177, - 109, 1, 254, 14, 109, 1, 255, 4, 109, 1, 216, 109, 1, 253, 254, 109, 1, - 253, 189, 109, 1, 253, 162, 109, 1, 253, 161, 109, 1, 255, 10, 14, 15, - 72, 14, 15, 249, 231, 14, 15, 71, 14, 15, 253, 142, 14, 15, 73, 14, 15, - 253, 156, 14, 15, 240, 44, 253, 156, 14, 15, 55, 253, 164, 14, 15, 55, - 71, 14, 15, 67, 14, 15, 253, 140, 14, 15, 253, 170, 14, 15, 106, 253, - 170, 14, 15, 253, 187, 14, 15, 106, 253, 187, 14, 15, 249, 200, 14, 15, - 106, 249, 200, 14, 15, 253, 177, 14, 15, 106, 253, 177, 14, 15, 249, 15, - 14, 15, 106, 249, 15, 14, 15, 238, 66, 249, 15, 14, 15, 253, 138, 14, 15, - 106, 253, 138, 14, 15, 248, 190, 14, 15, 106, 248, 190, 14, 15, 238, 66, - 248, 190, 14, 15, 253, 149, 14, 15, 240, 44, 255, 16, 14, 15, 238, 62, - 208, 14, 15, 30, 135, 14, 15, 30, 191, 14, 15, 30, 240, 17, 137, 242, - 233, 14, 15, 30, 253, 159, 137, 242, 233, 14, 15, 30, 38, 137, 242, 233, - 14, 15, 30, 242, 233, 14, 15, 30, 45, 135, 14, 15, 30, 45, 242, 215, 59, - 237, 45, 14, 15, 30, 240, 1, 248, 40, 14, 15, 30, 242, 215, 163, 108, 14, - 15, 30, 243, 12, 14, 15, 30, 92, 242, 234, 14, 15, 253, 202, 14, 15, 253, - 247, 14, 15, 254, 9, 14, 15, 254, 19, 14, 15, 253, 175, 14, 15, 246, 236, - 14, 15, 253, 147, 14, 15, 249, 138, 14, 15, 253, 208, 14, 15, 249, 140, - 14, 15, 240, 44, 249, 140, 14, 15, 55, 249, 80, 14, 15, 55, 253, 214, 14, - 15, 253, 129, 14, 15, 249, 133, 14, 15, 248, 239, 14, 15, 106, 248, 239, - 14, 15, 248, 240, 14, 15, 106, 248, 240, 14, 15, 243, 247, 14, 15, 106, - 243, 247, 14, 15, 249, 143, 14, 15, 106, 249, 143, 14, 15, 243, 248, 14, - 15, 106, 243, 248, 14, 15, 248, 181, 14, 15, 106, 248, 181, 14, 15, 243, - 118, 14, 15, 106, 243, 118, 14, 15, 240, 44, 243, 118, 14, 15, 223, 14, - 15, 106, 223, 14, 15, 55, 192, 14, 15, 253, 195, 14, 15, 247, 135, 14, - 15, 253, 212, 14, 15, 252, 221, 14, 15, 87, 14, 15, 249, 2, 14, 15, 240, - 44, 249, 2, 14, 15, 55, 248, 149, 14, 15, 55, 253, 201, 14, 15, 253, 126, - 14, 15, 249, 172, 14, 15, 249, 8, 14, 15, 106, 249, 8, 14, 15, 249, 189, - 14, 15, 106, 249, 189, 14, 15, 244, 42, 14, 15, 106, 244, 42, 14, 15, - 111, 14, 15, 106, 111, 14, 15, 244, 43, 14, 15, 106, 244, 43, 14, 15, - 249, 7, 14, 15, 106, 249, 7, 14, 15, 243, 132, 14, 15, 106, 243, 132, 14, - 15, 238, 66, 243, 132, 14, 15, 214, 14, 15, 249, 186, 14, 15, 249, 187, - 14, 15, 249, 6, 14, 15, 248, 71, 14, 15, 253, 172, 14, 15, 246, 4, 14, - 15, 253, 215, 14, 15, 251, 150, 14, 15, 253, 190, 14, 15, 249, 98, 14, - 15, 240, 44, 249, 98, 14, 15, 201, 14, 15, 249, 90, 14, 15, 248, 222, 14, - 15, 106, 248, 222, 14, 15, 248, 223, 14, 15, 106, 248, 223, 14, 15, 243, - 211, 14, 15, 106, 243, 211, 14, 15, 249, 100, 14, 15, 106, 249, 100, 14, - 15, 243, 212, 14, 15, 106, 243, 212, 14, 15, 248, 221, 14, 15, 106, 248, - 221, 14, 15, 243, 65, 14, 15, 106, 243, 65, 14, 15, 238, 66, 243, 65, 14, - 15, 255, 15, 14, 15, 254, 108, 14, 15, 232, 86, 248, 218, 14, 15, 232, - 86, 251, 149, 14, 15, 232, 86, 251, 158, 14, 15, 232, 86, 251, 136, 14, - 15, 254, 54, 14, 15, 244, 239, 14, 15, 254, 55, 14, 15, 250, 162, 14, 15, - 253, 224, 14, 15, 249, 42, 14, 15, 240, 44, 249, 42, 14, 15, 253, 152, - 14, 15, 249, 37, 14, 15, 249, 44, 14, 15, 106, 249, 44, 14, 15, 249, 45, - 14, 15, 106, 249, 45, 14, 15, 243, 159, 14, 15, 106, 243, 159, 14, 15, - 249, 46, 14, 15, 106, 249, 46, 14, 15, 243, 160, 14, 15, 106, 243, 160, - 14, 15, 248, 203, 14, 15, 106, 248, 203, 14, 15, 243, 91, 14, 15, 106, - 243, 91, 14, 15, 238, 66, 243, 91, 14, 15, 255, 18, 14, 15, 240, 36, 254, - 46, 14, 15, 253, 206, 14, 15, 246, 61, 14, 15, 253, 180, 14, 15, 251, - 232, 14, 15, 253, 181, 14, 15, 249, 112, 14, 15, 240, 44, 249, 112, 14, - 15, 222, 14, 15, 249, 110, 14, 15, 248, 229, 14, 15, 106, 248, 229, 14, - 15, 248, 230, 14, 15, 106, 248, 230, 14, 15, 243, 228, 14, 15, 106, 243, - 228, 14, 15, 249, 117, 14, 15, 106, 249, 117, 14, 15, 243, 229, 14, 15, - 106, 243, 229, 14, 15, 248, 169, 14, 15, 106, 248, 169, 14, 15, 243, 109, - 14, 15, 106, 243, 109, 14, 15, 238, 66, 243, 109, 14, 15, 173, 14, 15, - 106, 173, 14, 15, 254, 203, 14, 15, 234, 47, 173, 14, 15, 240, 36, 173, - 14, 15, 253, 197, 14, 15, 246, 102, 14, 15, 253, 166, 14, 15, 252, 22, - 14, 15, 253, 173, 14, 15, 249, 121, 14, 15, 240, 44, 249, 121, 14, 15, - 253, 131, 14, 15, 248, 231, 14, 15, 249, 124, 14, 15, 106, 249, 124, 14, - 15, 248, 176, 14, 15, 106, 248, 176, 14, 15, 243, 110, 14, 15, 106, 243, - 110, 14, 15, 238, 66, 243, 110, 14, 15, 197, 14, 15, 55, 254, 26, 14, 15, - 254, 214, 14, 15, 253, 250, 14, 15, 246, 33, 14, 15, 253, 251, 14, 15, - 251, 196, 14, 15, 253, 216, 14, 15, 248, 226, 14, 15, 240, 44, 248, 226, - 14, 15, 253, 134, 14, 15, 249, 101, 14, 15, 249, 106, 14, 15, 106, 249, - 106, 14, 15, 249, 107, 14, 15, 106, 249, 107, 14, 15, 243, 220, 14, 15, - 106, 243, 220, 14, 15, 249, 108, 14, 15, 106, 249, 108, 14, 15, 243, 221, - 14, 15, 106, 243, 221, 14, 15, 248, 227, 14, 15, 106, 248, 227, 14, 15, - 243, 219, 14, 15, 106, 243, 219, 14, 15, 162, 14, 15, 106, 162, 14, 15, - 113, 162, 14, 15, 253, 210, 14, 15, 247, 60, 14, 15, 253, 198, 14, 15, - 252, 177, 14, 15, 253, 186, 14, 15, 249, 166, 14, 15, 240, 44, 249, 166, - 14, 15, 253, 132, 14, 15, 249, 158, 14, 15, 249, 169, 14, 15, 106, 249, - 169, 14, 15, 249, 170, 14, 15, 106, 249, 170, 14, 15, 244, 26, 14, 15, - 106, 244, 26, 14, 15, 249, 171, 14, 15, 106, 249, 171, 14, 15, 244, 27, - 14, 15, 106, 244, 27, 14, 15, 248, 252, 14, 15, 106, 248, 252, 14, 15, - 243, 125, 14, 15, 106, 243, 125, 14, 15, 238, 66, 243, 125, 14, 15, 193, - 14, 15, 234, 47, 193, 14, 15, 254, 128, 14, 15, 235, 57, 193, 14, 15, - 234, 225, 254, 238, 14, 15, 238, 66, 252, 181, 14, 15, 238, 66, 252, 164, - 14, 15, 238, 66, 247, 98, 14, 15, 238, 66, 247, 124, 14, 15, 238, 66, - 247, 93, 14, 15, 238, 66, 247, 66, 14, 15, 248, 118, 14, 15, 248, 185, - 14, 15, 247, 73, 14, 15, 248, 110, 14, 15, 247, 76, 14, 15, 248, 46, 14, - 15, 244, 7, 14, 15, 244, 16, 14, 15, 106, 244, 16, 14, 15, 244, 17, 14, - 15, 106, 244, 17, 14, 15, 240, 230, 14, 15, 106, 240, 230, 14, 15, 244, - 18, 14, 15, 106, 244, 18, 14, 15, 240, 231, 14, 15, 106, 240, 231, 14, - 15, 243, 121, 14, 15, 106, 243, 121, 14, 15, 240, 229, 14, 15, 106, 240, - 229, 14, 15, 254, 72, 14, 15, 253, 254, 14, 15, 247, 212, 14, 15, 253, - 189, 14, 15, 253, 81, 14, 15, 253, 162, 14, 15, 249, 210, 14, 15, 240, - 44, 249, 210, 14, 15, 216, 14, 15, 248, 191, 14, 15, 249, 213, 14, 15, - 106, 249, 213, 14, 15, 249, 214, 14, 15, 106, 249, 214, 14, 15, 244, 61, - 14, 15, 106, 244, 61, 14, 15, 249, 215, 14, 15, 106, 249, 215, 14, 15, - 244, 62, 14, 15, 106, 244, 62, 14, 15, 249, 212, 14, 15, 106, 249, 212, - 14, 15, 243, 137, 14, 15, 106, 243, 137, 14, 15, 238, 66, 243, 137, 14, - 15, 255, 14, 14, 15, 234, 98, 255, 14, 14, 15, 106, 255, 14, 14, 15, 240, - 36, 253, 189, 14, 15, 253, 194, 14, 15, 242, 74, 253, 194, 14, 15, 106, - 253, 250, 14, 15, 247, 26, 14, 15, 253, 209, 14, 15, 252, 137, 14, 15, - 253, 160, 14, 15, 252, 143, 14, 15, 106, 253, 216, 14, 15, 253, 130, 14, - 15, 248, 182, 14, 15, 106, 253, 134, 14, 15, 244, 2, 14, 15, 106, 244, 2, - 14, 15, 144, 14, 15, 106, 144, 14, 15, 113, 144, 14, 15, 254, 62, 14, 15, - 245, 88, 14, 15, 253, 245, 14, 15, 250, 243, 14, 15, 254, 63, 14, 15, - 250, 249, 14, 15, 253, 179, 14, 15, 249, 60, 14, 15, 243, 177, 14, 15, - 106, 243, 177, 14, 15, 255, 19, 14, 15, 248, 111, 14, 15, 240, 141, 248, - 111, 14, 15, 248, 121, 14, 15, 240, 141, 248, 121, 14, 15, 243, 128, 14, - 15, 240, 141, 243, 128, 14, 15, 248, 97, 14, 15, 244, 30, 14, 15, 248, - 55, 14, 15, 243, 76, 14, 15, 240, 244, 14, 15, 106, 240, 244, 14, 15, - 254, 46, 14, 15, 247, 166, 14, 15, 247, 167, 14, 15, 243, 131, 14, 15, - 242, 247, 14, 15, 252, 231, 14, 15, 252, 239, 14, 15, 252, 240, 14, 15, - 252, 241, 14, 15, 252, 238, 14, 15, 238, 86, 253, 168, 14, 15, 238, 86, - 253, 214, 14, 15, 238, 86, 251, 61, 14, 15, 238, 86, 253, 184, 14, 15, - 238, 86, 251, 78, 14, 15, 238, 86, 219, 14, 15, 238, 86, 248, 114, 14, - 15, 238, 86, 192, 14, 15, 239, 148, 192, 14, 15, 254, 172, 14, 15, 247, - 5, 14, 15, 254, 28, 14, 15, 249, 147, 14, 15, 254, 45, 14, 15, 252, 100, - 14, 15, 253, 217, 14, 15, 248, 241, 14, 15, 255, 20, 14, 15, 244, 34, 14, - 15, 244, 35, 14, 15, 244, 36, 14, 15, 244, 33, 14, 15, 106, 253, 194, 14, - 15, 106, 253, 209, 14, 15, 106, 253, 160, 14, 15, 106, 253, 130, 14, 15, - 242, 5, 14, 15, 248, 232, 14, 15, 246, 147, 14, 15, 248, 172, 14, 15, - 246, 149, 14, 15, 248, 50, 14, 15, 246, 139, 14, 15, 254, 26, 14, 15, - 252, 30, 14, 15, 240, 36, 248, 118, 14, 15, 240, 36, 248, 185, 14, 15, - 240, 36, 248, 110, 14, 15, 240, 36, 248, 46, 14, 15, 234, 24, 248, 111, - 14, 15, 234, 24, 248, 121, 14, 15, 234, 24, 248, 97, 14, 15, 234, 24, - 248, 55, 14, 15, 234, 24, 254, 46, 14, 15, 249, 103, 14, 15, 246, 46, 14, - 15, 249, 104, 14, 15, 246, 47, 14, 15, 248, 225, 14, 15, 246, 44, 14, 15, - 254, 193, 14, 15, 238, 88, 248, 111, 14, 15, 238, 88, 248, 121, 14, 15, - 238, 88, 243, 128, 14, 15, 238, 88, 248, 97, 14, 15, 238, 88, 244, 30, - 14, 15, 238, 88, 248, 55, 14, 15, 238, 88, 243, 76, 14, 15, 238, 88, 254, - 46, 14, 15, 238, 241, 217, 14, 15, 235, 57, 72, 14, 15, 235, 57, 71, 14, - 15, 235, 57, 73, 14, 15, 235, 57, 67, 14, 15, 235, 57, 253, 170, 14, 15, - 235, 57, 253, 187, 14, 15, 235, 57, 253, 177, 14, 15, 235, 57, 253, 138, - 14, 15, 235, 57, 253, 197, 14, 15, 235, 57, 253, 166, 14, 15, 235, 57, - 253, 173, 14, 15, 235, 57, 253, 131, 14, 15, 235, 57, 253, 172, 14, 15, - 235, 57, 253, 215, 14, 15, 235, 57, 253, 190, 14, 15, 235, 57, 201, 14, - 15, 240, 36, 253, 168, 14, 15, 240, 36, 253, 214, 14, 15, 240, 36, 253, - 184, 14, 15, 240, 36, 219, 14, 15, 55, 251, 19, 14, 15, 55, 249, 75, 14, - 15, 55, 248, 127, 14, 15, 55, 245, 119, 14, 15, 55, 251, 18, 14, 15, 55, - 248, 77, 14, 15, 55, 253, 185, 14, 15, 55, 253, 160, 14, 15, 55, 253, - 194, 14, 15, 55, 249, 153, 14, 15, 55, 253, 209, 14, 15, 55, 253, 130, - 14, 15, 55, 254, 14, 14, 15, 55, 253, 177, 14, 15, 55, 253, 170, 14, 15, - 55, 249, 199, 14, 15, 55, 253, 187, 14, 15, 55, 253, 138, 14, 15, 55, - 251, 88, 14, 15, 55, 251, 87, 14, 15, 55, 251, 85, 14, 15, 55, 245, 208, - 14, 15, 55, 251, 86, 14, 15, 55, 251, 84, 14, 15, 55, 249, 177, 14, 15, - 55, 248, 97, 14, 15, 55, 248, 111, 14, 15, 55, 243, 77, 14, 15, 55, 248, - 121, 14, 15, 55, 248, 55, 14, 15, 55, 252, 232, 14, 15, 55, 249, 6, 14, - 15, 55, 249, 186, 14, 15, 55, 247, 164, 14, 15, 55, 249, 187, 14, 15, 55, - 248, 71, 14, 15, 55, 253, 239, 14, 15, 55, 253, 208, 14, 15, 55, 253, - 175, 14, 15, 55, 248, 180, 14, 15, 55, 253, 147, 14, 15, 55, 253, 129, - 14, 15, 55, 223, 14, 15, 55, 253, 235, 14, 15, 55, 253, 234, 14, 15, 55, - 254, 5, 14, 15, 55, 249, 68, 14, 15, 55, 254, 6, 14, 15, 55, 253, 139, - 14, 15, 55, 251, 146, 14, 15, 55, 248, 220, 14, 15, 55, 249, 94, 14, 15, - 55, 246, 11, 14, 15, 55, 248, 219, 14, 15, 55, 248, 61, 14, 15, 55, 251, - 156, 14, 15, 55, 251, 155, 14, 15, 55, 251, 153, 14, 15, 55, 246, 17, 14, - 15, 55, 251, 154, 14, 15, 55, 249, 97, 14, 15, 55, 254, 107, 14, 15, 55, - 253, 150, 14, 15, 55, 253, 173, 14, 15, 55, 253, 197, 14, 15, 55, 249, - 118, 14, 15, 55, 253, 166, 14, 15, 55, 253, 131, 14, 15, 55, 253, 154, - 14, 15, 55, 253, 181, 14, 15, 55, 253, 206, 14, 15, 55, 249, 111, 14, 15, - 55, 253, 180, 14, 15, 55, 222, 14, 15, 55, 253, 161, 14, 15, 55, 253, - 162, 14, 15, 55, 253, 254, 14, 15, 55, 248, 192, 14, 15, 55, 253, 189, - 14, 15, 55, 216, 14, 15, 55, 254, 25, 14, 15, 240, 36, 254, 25, 14, 15, - 55, 253, 248, 14, 15, 55, 254, 24, 14, 15, 55, 248, 161, 14, 15, 55, 254, - 7, 14, 15, 240, 36, 254, 7, 14, 15, 55, 253, 146, 14, 15, 55, 249, 88, - 14, 15, 55, 249, 87, 14, 15, 55, 251, 121, 14, 15, 55, 245, 238, 14, 15, - 55, 249, 86, 14, 15, 55, 251, 120, 14, 15, 55, 254, 8, 14, 15, 55, 253, - 216, 14, 15, 55, 253, 250, 14, 15, 55, 249, 102, 14, 15, 55, 253, 251, - 14, 15, 55, 253, 134, 14, 15, 55, 250, 201, 14, 15, 55, 250, 200, 14, 15, - 55, 250, 198, 14, 15, 55, 245, 70, 14, 15, 55, 250, 199, 14, 15, 55, 249, - 55, 14, 15, 55, 251, 194, 14, 15, 55, 249, 104, 14, 15, 55, 251, 193, 14, - 15, 55, 246, 45, 14, 15, 55, 249, 103, 14, 15, 55, 248, 225, 14, 15, 55, - 247, 155, 14, 15, 55, 244, 36, 14, 15, 55, 244, 34, 14, 15, 55, 242, 155, - 14, 15, 55, 244, 35, 14, 15, 55, 244, 33, 14, 15, 55, 249, 183, 14, 15, - 55, 249, 182, 14, 15, 55, 249, 180, 14, 15, 55, 247, 154, 14, 15, 55, - 249, 181, 14, 15, 55, 249, 179, 14, 15, 55, 254, 18, 14, 15, 55, 253, - 222, 14, 15, 55, 253, 228, 14, 15, 55, 248, 194, 14, 15, 55, 254, 17, 14, - 15, 55, 253, 163, 14, 15, 55, 255, 17, 14, 15, 55, 54, 255, 17, 14, 15, - 55, 250, 220, 14, 15, 55, 250, 219, 14, 15, 55, 248, 126, 14, 15, 55, - 245, 78, 14, 15, 55, 250, 218, 14, 15, 55, 248, 153, 14, 15, 55, 253, - 211, 14, 15, 55, 253, 186, 14, 15, 55, 253, 210, 14, 15, 55, 248, 184, - 14, 15, 55, 253, 198, 14, 15, 55, 253, 132, 14, 15, 55, 248, 248, 14, 15, - 55, 248, 110, 14, 15, 55, 248, 118, 14, 15, 55, 244, 9, 14, 15, 55, 248, - 185, 14, 15, 55, 248, 46, 14, 15, 55, 254, 72, 14, 15, 55, 249, 5, 14, - 15, 55, 249, 4, 14, 15, 55, 248, 112, 14, 15, 55, 244, 39, 14, 15, 55, - 248, 140, 14, 15, 55, 248, 90, 14, 15, 55, 248, 200, 14, 15, 55, 248, - 125, 14, 15, 55, 248, 88, 14, 15, 55, 243, 54, 14, 15, 55, 248, 67, 14, - 15, 55, 248, 57, 14, 15, 55, 247, 172, 14, 15, 55, 247, 171, 14, 15, 55, - 247, 169, 14, 15, 55, 242, 160, 14, 15, 55, 247, 170, 14, 15, 55, 247, - 168, 14, 15, 254, 83, 52, 14, 15, 248, 37, 208, 14, 15, 249, 146, 14, 15, - 246, 140, 14, 15, 246, 173, 14, 15, 242, 20, 14, 15, 246, 174, 14, 15, - 242, 21, 14, 15, 246, 172, 14, 15, 242, 19, 242, 221, 247, 96, 69, 242, - 221, 1, 241, 29, 242, 221, 1, 246, 55, 242, 221, 1, 241, 104, 242, 221, - 1, 247, 62, 242, 221, 1, 246, 156, 242, 221, 1, 247, 182, 242, 221, 1, - 245, 33, 242, 221, 1, 242, 153, 242, 221, 1, 245, 26, 242, 221, 1, 241, - 48, 242, 221, 1, 246, 94, 242, 221, 1, 245, 126, 242, 221, 1, 237, 220, - 242, 221, 1, 239, 205, 242, 221, 1, 247, 52, 242, 221, 1, 244, 72, 242, - 221, 1, 249, 130, 242, 221, 1, 254, 253, 242, 221, 1, 237, 144, 242, 221, - 1, 237, 182, 242, 221, 1, 237, 143, 242, 221, 1, 253, 227, 242, 221, 1, - 236, 134, 242, 221, 1, 245, 225, 242, 221, 1, 232, 163, 242, 221, 1, 242, - 54, 242, 221, 238, 184, 69, 242, 221, 224, 238, 184, 69, 119, 1, 250, - 238, 250, 240, 255, 74, 255, 19, 119, 1, 179, 119, 1, 253, 4, 255, 95, - 79, 119, 1, 254, 135, 119, 1, 255, 14, 119, 1, 255, 16, 119, 1, 238, 28, - 247, 146, 240, 149, 119, 1, 248, 109, 119, 1, 244, 82, 67, 119, 1, 255, - 86, 73, 119, 1, 255, 67, 67, 119, 1, 244, 69, 119, 1, 231, 23, 73, 119, - 1, 231, 77, 73, 119, 1, 73, 119, 1, 253, 193, 119, 1, 254, 9, 119, 1, - 247, 27, 254, 71, 252, 132, 144, 119, 1, 241, 195, 119, 1, 250, 155, 119, - 1, 251, 139, 255, 15, 119, 1, 210, 119, 1, 248, 108, 119, 1, 251, 13, - 251, 41, 210, 119, 1, 251, 9, 119, 1, 247, 198, 253, 40, 255, 16, 119, 1, - 241, 145, 192, 119, 1, 245, 138, 192, 119, 1, 226, 249, 192, 119, 1, 227, - 6, 192, 119, 1, 241, 253, 254, 218, 252, 0, 197, 119, 1, 231, 29, 197, - 119, 1, 236, 7, 119, 1, 251, 108, 255, 77, 254, 178, 71, 119, 1, 72, 119, - 1, 245, 234, 221, 119, 1, 251, 14, 119, 1, 231, 72, 253, 178, 119, 1, - 232, 54, 67, 119, 1, 251, 109, 250, 226, 119, 1, 242, 57, 242, 56, 223, - 119, 1, 244, 76, 241, 97, 119, 1, 242, 122, 193, 119, 1, 247, 89, 231, - 24, 193, 119, 1, 231, 78, 193, 119, 1, 255, 18, 119, 1, 255, 17, 119, 1, - 247, 153, 254, 249, 254, 251, 214, 119, 1, 231, 79, 214, 119, 1, 209, - 119, 1, 237, 76, 244, 218, 239, 10, 217, 119, 1, 226, 252, 217, 119, 1, - 236, 8, 119, 1, 239, 152, 119, 1, 245, 80, 255, 72, 72, 119, 1, 241, 227, - 254, 111, 173, 119, 1, 229, 49, 173, 119, 1, 231, 28, 173, 119, 1, 241, - 213, 251, 181, 251, 204, 162, 119, 1, 236, 6, 119, 1, 239, 98, 119, 1, - 251, 104, 119, 1, 245, 31, 250, 179, 209, 119, 1, 239, 155, 245, 85, 73, - 119, 1, 248, 206, 119, 1, 251, 106, 119, 1, 237, 98, 119, 1, 244, 240, - 119, 1, 241, 47, 119, 1, 247, 120, 119, 1, 231, 25, 119, 1, 231, 80, 119, - 1, 231, 141, 119, 1, 255, 20, 119, 1, 206, 119, 240, 12, 232, 75, 119, - 237, 215, 232, 75, 119, 243, 38, 232, 75, 119, 241, 16, 91, 119, 238, 34, - 91, 119, 237, 75, 91, 238, 63, 1, 67, 238, 63, 1, 71, 238, 63, 1, 79, - 238, 63, 1, 201, 238, 63, 1, 253, 139, 238, 63, 1, 248, 50, 238, 63, 1, - 253, 126, 238, 63, 1, 253, 133, 238, 63, 1, 253, 131, 238, 63, 1, 253, - 129, 238, 63, 1, 253, 141, 238, 63, 1, 222, 238, 63, 1, 216, 238, 63, 1, - 253, 134, 238, 63, 1, 253, 138, 238, 63, 1, 253, 132, 238, 63, 1, 219, - 238, 63, 33, 21, 71, 238, 63, 33, 21, 79, 238, 63, 21, 238, 72, 238, 60, - 1, 67, 238, 60, 1, 71, 238, 60, 1, 79, 238, 60, 1, 201, 238, 60, 1, 253, - 139, 238, 60, 1, 248, 50, 238, 60, 1, 253, 126, 238, 60, 1, 253, 133, - 238, 60, 1, 253, 131, 238, 60, 1, 253, 129, 238, 60, 1, 253, 141, 238, - 60, 1, 222, 238, 60, 1, 216, 238, 60, 1, 253, 130, 238, 60, 1, 253, 134, - 238, 60, 1, 253, 138, 238, 60, 1, 253, 132, 238, 60, 1, 219, 238, 60, 33, - 21, 71, 238, 60, 33, 21, 79, 238, 60, 21, 236, 70, 234, 63, 240, 12, 232, - 75, 234, 63, 45, 232, 75, 242, 231, 1, 67, 242, 231, 1, 71, 242, 231, 1, - 79, 242, 231, 1, 201, 242, 231, 1, 253, 139, 242, 231, 1, 248, 50, 242, - 231, 1, 253, 126, 242, 231, 1, 253, 133, 242, 231, 1, 253, 131, 242, 231, - 1, 253, 129, 242, 231, 1, 253, 141, 242, 231, 1, 222, 242, 231, 1, 216, - 242, 231, 1, 253, 130, 242, 231, 1, 253, 134, 242, 231, 1, 253, 138, 242, - 231, 1, 253, 132, 242, 231, 1, 219, 242, 231, 33, 21, 71, 242, 231, 33, - 21, 79, 236, 157, 1, 67, 236, 157, 1, 71, 236, 157, 1, 79, 236, 157, 1, - 201, 236, 157, 1, 253, 139, 236, 157, 1, 248, 50, 236, 157, 1, 253, 126, - 236, 157, 1, 253, 133, 236, 157, 1, 253, 131, 236, 157, 1, 253, 129, 236, - 157, 1, 253, 141, 236, 157, 1, 222, 236, 157, 1, 216, 236, 157, 1, 253, - 134, 236, 157, 1, 253, 138, 236, 157, 1, 253, 132, 236, 157, 33, 21, 71, - 236, 157, 33, 21, 79, 63, 1, 201, 63, 1, 248, 61, 63, 1, 253, 190, 63, 1, - 248, 220, 63, 1, 248, 172, 63, 1, 253, 152, 63, 1, 248, 57, 63, 1, 253, - 224, 63, 1, 248, 125, 63, 1, 248, 133, 63, 1, 253, 133, 63, 1, 242, 247, - 63, 1, 253, 225, 63, 1, 243, 131, 63, 1, 252, 31, 63, 1, 253, 126, 63, 1, - 248, 55, 63, 1, 87, 63, 1, 248, 97, 63, 1, 253, 173, 63, 1, 253, 141, 63, - 1, 248, 65, 63, 1, 253, 208, 63, 1, 248, 238, 63, 1, 253, 181, 63, 1, - 253, 162, 63, 1, 253, 160, 63, 1, 253, 216, 63, 1, 254, 13, 63, 1, 248, - 46, 63, 1, 248, 250, 63, 1, 253, 132, 63, 1, 219, 63, 1, 253, 134, 63, 1, - 253, 217, 63, 233, 52, 33, 252, 86, 63, 233, 52, 33, 248, 241, 63, 233, - 52, 33, 254, 28, 63, 233, 52, 33, 249, 147, 63, 233, 52, 33, 254, 29, 63, - 233, 52, 33, 252, 106, 63, 233, 52, 33, 249, 150, 63, 233, 52, 33, 247, - 20, 63, 233, 52, 33, 254, 125, 63, 233, 52, 33, 252, 163, 63, 233, 52, - 33, 254, 110, 63, 233, 52, 33, 251, 217, 63, 233, 52, 33, 254, 70, 63, - 233, 52, 33, 249, 146, 63, 233, 52, 33, 254, 123, 249, 9, 127, 63, 233, - 52, 33, 254, 123, 249, 9, 111, 63, 233, 52, 33, 252, 87, 63, 33, 237, 13, - 254, 142, 63, 33, 237, 13, 253, 140, 63, 33, 21, 253, 140, 63, 33, 21, - 71, 63, 33, 21, 253, 142, 63, 33, 21, 255, 14, 63, 33, 21, 254, 77, 63, - 33, 21, 79, 63, 33, 21, 253, 148, 63, 33, 21, 254, 74, 63, 33, 21, 253, - 193, 63, 33, 21, 216, 63, 33, 21, 253, 237, 63, 33, 21, 72, 63, 33, 21, - 253, 178, 63, 33, 21, 253, 149, 63, 33, 21, 253, 156, 63, 33, 21, 253, - 151, 63, 21, 237, 221, 63, 21, 237, 248, 63, 21, 231, 84, 63, 21, 232, - 184, 63, 21, 238, 32, 63, 21, 239, 3, 63, 21, 242, 86, 63, 21, 233, 43, - 63, 21, 237, 186, 63, 21, 241, 7, 63, 21, 242, 96, 239, 179, 63, 21, 239, - 243, 63, 21, 241, 62, 63, 21, 233, 121, 63, 21, 246, 10, 63, 21, 233, - 120, 63, 21, 241, 42, 254, 69, 246, 24, 63, 21, 253, 204, 249, 2, 63, 21, - 239, 8, 63, 21, 242, 59, 246, 93, 63, 21, 237, 191, 63, 236, 181, 12, - 247, 31, 63, 21, 231, 59, 63, 21, 235, 176, 63, 26, 242, 217, 63, 26, - 127, 63, 26, 111, 63, 26, 166, 63, 26, 177, 63, 26, 176, 63, 26, 187, 63, - 26, 203, 63, 26, 195, 63, 26, 202, 63, 12, 253, 204, 243, 4, 252, 184, - 63, 12, 253, 204, 243, 4, 246, 99, 63, 12, 253, 204, 243, 4, 249, 138, - 63, 12, 253, 204, 243, 4, 250, 113, 63, 12, 253, 204, 243, 4, 244, 233, - 63, 12, 253, 204, 243, 4, 246, 253, 63, 12, 253, 204, 243, 4, 234, 239, - 63, 12, 253, 204, 243, 4, 236, 79, 63, 12, 253, 204, 243, 4, 236, 78, 63, - 12, 253, 204, 243, 4, 234, 238, 58, 241, 31, 58, 235, 69, 58, 240, 27, - 58, 248, 37, 208, 58, 240, 24, 58, 248, 58, 243, 5, 58, 248, 47, 248, - 186, 238, 93, 58, 248, 54, 4, 237, 78, 238, 95, 58, 240, 14, 240, 27, 58, - 240, 14, 248, 37, 208, 58, 239, 144, 58, 248, 210, 34, 236, 239, 127, 58, - 248, 210, 34, 236, 239, 111, 58, 248, 210, 34, 236, 239, 166, 58, 33, - 234, 6, 58, 26, 242, 217, 58, 26, 127, 58, 26, 111, 58, 26, 166, 58, 26, - 177, 58, 26, 176, 58, 26, 187, 58, 26, 203, 58, 26, 195, 58, 26, 202, 58, - 1, 67, 58, 1, 72, 58, 1, 71, 58, 1, 73, 58, 1, 79, 58, 1, 253, 193, 58, - 1, 253, 252, 58, 1, 253, 164, 58, 1, 253, 131, 58, 1, 248, 124, 58, 1, - 253, 141, 58, 1, 253, 129, 58, 1, 253, 217, 58, 1, 253, 139, 58, 1, 222, - 58, 1, 253, 134, 58, 1, 253, 132, 58, 1, 248, 46, 58, 1, 253, 126, 58, 1, - 253, 133, 58, 1, 248, 57, 58, 1, 253, 146, 58, 1, 216, 58, 1, 253, 130, - 58, 1, 253, 138, 58, 1, 253, 179, 58, 1, 201, 58, 1, 248, 61, 58, 1, 248, - 90, 58, 1, 253, 163, 58, 1, 248, 114, 58, 1, 253, 113, 58, 1, 248, 225, - 58, 1, 249, 217, 58, 1, 248, 67, 58, 1, 248, 47, 183, 33, 52, 58, 1, 248, - 47, 72, 58, 1, 248, 47, 71, 58, 1, 248, 47, 73, 58, 1, 248, 47, 79, 58, - 1, 248, 47, 253, 193, 58, 1, 248, 47, 253, 252, 58, 1, 248, 47, 248, 124, - 58, 1, 248, 47, 253, 141, 58, 1, 248, 47, 253, 129, 58, 1, 248, 47, 253, - 217, 58, 1, 248, 47, 253, 139, 58, 1, 248, 47, 222, 58, 1, 248, 47, 253, - 126, 58, 1, 248, 47, 253, 133, 58, 1, 248, 47, 248, 57, 58, 1, 248, 47, - 253, 146, 58, 1, 248, 47, 248, 90, 58, 1, 248, 47, 216, 58, 1, 248, 47, - 253, 138, 58, 1, 248, 47, 201, 58, 1, 248, 47, 248, 211, 58, 1, 248, 47, - 248, 114, 58, 1, 248, 47, 251, 115, 58, 1, 248, 47, 252, 20, 58, 1, 248, - 47, 248, 153, 58, 1, 248, 54, 72, 58, 1, 248, 54, 71, 58, 1, 248, 54, - 254, 102, 58, 1, 248, 54, 253, 252, 58, 1, 248, 54, 79, 58, 1, 248, 54, - 248, 124, 58, 1, 248, 54, 201, 58, 1, 248, 54, 253, 139, 58, 1, 248, 54, - 219, 58, 1, 248, 54, 253, 129, 58, 1, 248, 54, 248, 46, 58, 1, 248, 54, - 253, 126, 58, 1, 248, 54, 253, 133, 58, 1, 248, 54, 253, 146, 58, 1, 248, - 54, 253, 179, 58, 1, 248, 54, 248, 211, 58, 1, 248, 54, 248, 114, 58, 1, - 248, 54, 248, 90, 58, 1, 248, 54, 253, 163, 58, 1, 248, 54, 248, 182, 58, - 1, 248, 54, 248, 57, 58, 1, 248, 54, 248, 99, 58, 1, 240, 14, 71, 58, 1, - 240, 14, 201, 58, 1, 240, 14, 253, 130, 58, 1, 240, 14, 253, 179, 58, 1, - 240, 14, 248, 99, 58, 1, 253, 128, 248, 36, 237, 62, 127, 58, 1, 253, - 128, 248, 36, 239, 244, 127, 58, 1, 253, 128, 248, 36, 239, 36, 58, 1, - 253, 128, 248, 36, 237, 50, 58, 1, 253, 128, 248, 36, 236, 145, 237, 50, - 58, 1, 253, 128, 248, 36, 238, 163, 58, 1, 253, 128, 248, 36, 204, 238, - 163, 58, 1, 253, 128, 248, 36, 67, 58, 1, 253, 128, 248, 36, 71, 58, 1, - 253, 128, 248, 36, 201, 58, 1, 253, 128, 248, 36, 248, 50, 58, 1, 253, - 128, 248, 36, 253, 152, 58, 1, 253, 128, 248, 36, 248, 71, 58, 1, 253, - 128, 248, 36, 242, 247, 58, 1, 253, 128, 248, 36, 248, 75, 58, 1, 253, - 128, 248, 36, 248, 82, 58, 1, 253, 128, 248, 36, 253, 126, 58, 1, 253, - 128, 248, 36, 253, 133, 58, 1, 253, 128, 248, 36, 253, 129, 58, 1, 253, - 128, 248, 36, 248, 65, 58, 1, 253, 128, 248, 36, 248, 66, 58, 1, 253, - 128, 248, 36, 248, 99, 58, 1, 253, 128, 248, 36, 253, 163, 58, 1, 253, - 128, 248, 36, 254, 0, 58, 1, 248, 47, 253, 128, 248, 36, 253, 126, 58, 1, - 248, 47, 253, 128, 248, 36, 248, 99, 58, 1, 240, 14, 253, 128, 248, 36, - 248, 77, 58, 1, 240, 14, 253, 128, 248, 36, 248, 50, 58, 1, 240, 14, 253, - 128, 248, 36, 253, 152, 58, 1, 240, 14, 253, 128, 248, 36, 248, 89, 58, - 1, 240, 14, 253, 128, 248, 36, 248, 71, 58, 1, 240, 14, 253, 128, 248, - 36, 242, 249, 58, 1, 240, 14, 253, 128, 248, 36, 253, 126, 58, 1, 240, - 14, 253, 128, 248, 36, 248, 76, 58, 1, 240, 14, 253, 128, 248, 36, 248, - 66, 58, 1, 240, 14, 253, 128, 248, 36, 250, 174, 58, 1, 240, 14, 253, - 128, 248, 36, 248, 99, 58, 1, 240, 14, 253, 128, 248, 36, 253, 163, 58, - 1, 253, 128, 248, 36, 137, 79, 58, 1, 253, 128, 248, 36, 137, 216, 58, 1, - 240, 14, 253, 128, 248, 36, 248, 81, 58, 1, 253, 128, 248, 36, 237, 101, - 149, 232, 65, 239, 117, 149, 1, 201, 149, 1, 248, 61, 149, 1, 253, 139, - 149, 1, 248, 77, 149, 1, 248, 50, 149, 1, 253, 152, 149, 1, 248, 57, 149, - 1, 253, 146, 149, 1, 248, 89, 149, 1, 249, 203, 149, 1, 253, 126, 149, 1, - 248, 55, 149, 1, 253, 133, 149, 1, 248, 76, 149, 1, 253, 131, 149, 1, - 253, 129, 149, 1, 248, 65, 149, 1, 253, 141, 149, 1, 248, 81, 149, 1, - 222, 149, 1, 216, 149, 1, 253, 130, 149, 1, 253, 134, 149, 1, 253, 138, - 149, 1, 248, 46, 149, 1, 248, 66, 149, 1, 253, 132, 149, 1, 219, 149, 33, - 21, 67, 149, 33, 21, 71, 149, 33, 21, 79, 149, 33, 21, 253, 164, 149, 33, - 21, 253, 149, 149, 33, 21, 253, 156, 149, 33, 21, 253, 151, 149, 33, 21, - 72, 149, 33, 21, 73, 149, 213, 1, 216, 149, 213, 1, 253, 130, 149, 213, - 1, 253, 138, 149, 3, 1, 201, 149, 3, 1, 248, 50, 149, 3, 1, 235, 61, 149, - 3, 1, 253, 126, 149, 3, 1, 253, 131, 149, 3, 1, 253, 129, 149, 3, 1, 222, - 149, 3, 1, 253, 130, 149, 3, 1, 253, 134, 149, 21, 234, 226, 149, 21, - 234, 212, 149, 21, 247, 59, 149, 21, 248, 226, 149, 233, 54, 69, 149, - 236, 156, 69, 149, 26, 242, 217, 149, 26, 127, 149, 26, 111, 149, 26, - 166, 149, 26, 177, 149, 26, 176, 149, 26, 187, 149, 26, 203, 149, 26, - 195, 149, 26, 202, 81, 255, 21, 1, 201, 81, 255, 21, 1, 253, 253, 81, - 255, 21, 1, 248, 50, 81, 255, 21, 1, 248, 90, 81, 255, 21, 1, 253, 132, - 81, 255, 21, 1, 216, 81, 255, 21, 1, 253, 126, 81, 255, 21, 1, 248, 55, - 81, 255, 21, 1, 253, 134, 81, 255, 21, 1, 253, 129, 81, 255, 21, 1, 248, - 65, 81, 255, 21, 1, 222, 81, 255, 21, 1, 253, 179, 81, 255, 21, 1, 253, - 171, 81, 255, 21, 1, 219, 81, 255, 21, 1, 253, 217, 81, 255, 21, 1, 248, - 61, 81, 255, 21, 1, 243, 130, 81, 255, 21, 1, 253, 131, 81, 255, 21, 1, - 67, 81, 255, 21, 1, 71, 81, 255, 21, 1, 253, 164, 81, 255, 21, 1, 254, - 36, 81, 255, 21, 1, 79, 81, 255, 21, 1, 253, 156, 81, 255, 21, 1, 73, 81, - 255, 21, 1, 253, 252, 81, 255, 21, 1, 72, 81, 255, 21, 1, 249, 243, 81, - 255, 21, 1, 253, 149, 81, 255, 21, 1, 239, 223, 81, 255, 21, 1, 239, 224, - 81, 255, 21, 1, 239, 225, 81, 255, 21, 1, 239, 226, 81, 255, 21, 1, 239, - 227, 116, 81, 122, 1, 200, 253, 217, 116, 81, 122, 1, 170, 253, 217, 116, - 81, 122, 1, 200, 201, 116, 81, 122, 1, 200, 253, 253, 116, 81, 122, 1, - 200, 248, 50, 116, 81, 122, 1, 170, 201, 116, 81, 122, 1, 170, 253, 253, - 116, 81, 122, 1, 170, 248, 50, 116, 81, 122, 1, 200, 248, 90, 116, 81, - 122, 1, 200, 253, 132, 116, 81, 122, 1, 200, 216, 116, 81, 122, 1, 170, - 248, 90, 116, 81, 122, 1, 170, 253, 132, 116, 81, 122, 1, 170, 216, 116, - 81, 122, 1, 200, 253, 126, 116, 81, 122, 1, 200, 248, 55, 116, 81, 122, - 1, 200, 253, 131, 116, 81, 122, 1, 170, 253, 126, 116, 81, 122, 1, 170, - 248, 55, 116, 81, 122, 1, 170, 253, 131, 116, 81, 122, 1, 200, 253, 129, - 116, 81, 122, 1, 200, 248, 65, 116, 81, 122, 1, 200, 222, 116, 81, 122, - 1, 170, 253, 129, 116, 81, 122, 1, 170, 248, 65, 116, 81, 122, 1, 170, - 222, 116, 81, 122, 1, 200, 253, 179, 116, 81, 122, 1, 200, 253, 171, 116, - 81, 122, 1, 200, 253, 134, 116, 81, 122, 1, 170, 253, 179, 116, 81, 122, - 1, 170, 253, 171, 116, 81, 122, 1, 170, 253, 134, 116, 81, 122, 1, 200, - 219, 116, 81, 122, 1, 200, 253, 133, 116, 81, 122, 1, 200, 253, 141, 116, - 81, 122, 1, 170, 219, 116, 81, 122, 1, 170, 253, 133, 116, 81, 122, 1, - 170, 253, 141, 116, 81, 122, 1, 200, 249, 99, 116, 81, 122, 1, 200, 249, - 201, 116, 81, 122, 1, 170, 249, 99, 116, 81, 122, 1, 170, 249, 201, 116, - 81, 122, 33, 21, 33, 234, 255, 116, 81, 122, 33, 21, 253, 140, 116, 81, - 122, 33, 21, 253, 142, 116, 81, 122, 33, 21, 79, 116, 81, 122, 33, 21, - 253, 148, 116, 81, 122, 33, 21, 72, 116, 81, 122, 33, 21, 253, 178, 116, - 81, 122, 33, 21, 73, 116, 81, 122, 33, 21, 254, 117, 116, 81, 122, 33, - 21, 253, 252, 116, 81, 122, 33, 21, 254, 33, 116, 81, 122, 33, 21, 249, - 232, 116, 81, 122, 33, 21, 254, 254, 116, 81, 122, 33, 21, 254, 221, 116, - 81, 122, 33, 21, 252, 56, 116, 81, 122, 33, 21, 252, 250, 116, 81, 122, - 33, 21, 254, 102, 116, 81, 122, 1, 30, 179, 116, 81, 122, 1, 30, 254, 26, - 116, 81, 122, 1, 30, 197, 116, 81, 122, 1, 30, 173, 116, 81, 122, 1, 30, - 255, 15, 116, 81, 122, 1, 30, 209, 116, 81, 122, 1, 30, 217, 116, 81, - 122, 188, 238, 200, 116, 81, 122, 188, 238, 201, 116, 81, 122, 26, 242, - 217, 116, 81, 122, 26, 127, 116, 81, 122, 26, 111, 116, 81, 122, 26, 166, - 116, 81, 122, 26, 177, 116, 81, 122, 26, 176, 116, 81, 122, 26, 187, 116, - 81, 122, 26, 203, 116, 81, 122, 26, 195, 116, 81, 122, 26, 202, 116, 81, - 122, 21, 251, 180, 116, 81, 122, 21, 246, 36, 63, 12, 233, 223, 63, 12, - 249, 116, 242, 246, 63, 12, 254, 69, 242, 246, 63, 12, 254, 81, 242, 246, - 63, 12, 249, 34, 242, 246, 63, 12, 249, 141, 242, 246, 63, 12, 235, 137, - 242, 246, 63, 12, 237, 32, 242, 246, 63, 12, 237, 31, 242, 246, 63, 12, - 235, 136, 242, 246, 63, 12, 254, 86, 242, 246, 63, 12, 237, 3, 242, 246, - 63, 12, 238, 175, 242, 246, 63, 12, 238, 174, 242, 246, 63, 12, 237, 2, - 242, 246, 63, 12, 237, 4, 242, 246, 63, 12, 235, 38, 63, 12, 249, 116, - 248, 80, 63, 12, 254, 69, 248, 80, 63, 12, 254, 81, 248, 80, 63, 12, 249, - 34, 248, 80, 63, 12, 249, 141, 248, 80, 63, 12, 235, 137, 248, 80, 63, - 12, 237, 32, 248, 80, 63, 12, 237, 31, 248, 80, 63, 12, 235, 136, 248, - 80, 63, 12, 254, 86, 248, 80, 63, 12, 237, 3, 248, 80, 63, 12, 238, 175, - 248, 80, 63, 12, 238, 174, 248, 80, 63, 12, 237, 2, 248, 80, 63, 12, 237, - 4, 248, 80, 236, 148, 1, 201, 236, 148, 1, 253, 139, 236, 148, 1, 248, - 50, 236, 148, 1, 246, 148, 236, 148, 1, 253, 129, 236, 148, 1, 253, 141, - 236, 148, 1, 222, 236, 148, 1, 249, 115, 236, 148, 1, 253, 126, 236, 148, - 1, 253, 133, 236, 148, 1, 253, 131, 236, 148, 1, 249, 123, 236, 148, 1, - 253, 152, 236, 148, 1, 253, 146, 236, 148, 1, 248, 78, 236, 148, 1, 246, - 199, 236, 148, 1, 216, 236, 148, 1, 253, 130, 236, 148, 1, 253, 134, 236, - 148, 1, 253, 171, 236, 148, 1, 253, 132, 236, 148, 1, 67, 236, 148, 1, - 219, 236, 148, 33, 21, 71, 236, 148, 33, 21, 79, 236, 148, 33, 21, 72, - 236, 148, 33, 21, 73, 236, 148, 33, 21, 253, 178, 236, 148, 237, 231, - 236, 148, 253, 165, 147, 236, 210, 8, 1, 3, 5, 67, 8, 1, 3, 5, 253, 178, - 8, 3, 1, 205, 253, 178, 8, 1, 3, 5, 240, 60, 217, 8, 1, 3, 5, 255, 18, 8, - 1, 3, 5, 209, 8, 1, 3, 5, 248, 109, 8, 1, 3, 5, 72, 8, 3, 1, 205, 248, - 35, 72, 8, 3, 1, 205, 71, 8, 1, 3, 5, 221, 8, 1, 3, 5, 255, 15, 8, 1, 3, - 5, 255, 100, 2, 108, 8, 1, 3, 5, 173, 8, 1, 3, 5, 224, 197, 8, 1, 3, 5, - 73, 8, 1, 3, 5, 248, 35, 73, 8, 3, 1, 236, 190, 73, 8, 3, 1, 236, 190, - 248, 35, 73, 8, 3, 1, 236, 190, 117, 2, 108, 8, 3, 1, 205, 253, 193, 8, - 1, 3, 5, 254, 10, 8, 3, 1, 253, 159, 137, 73, 8, 3, 1, 240, 17, 137, 73, - 8, 1, 3, 5, 223, 8, 1, 3, 5, 224, 144, 8, 1, 3, 5, 205, 144, 8, 1, 3, 5, - 214, 8, 1, 3, 5, 79, 8, 3, 1, 236, 190, 79, 8, 3, 1, 236, 190, 233, 132, - 79, 8, 3, 1, 236, 190, 205, 173, 8, 1, 3, 5, 179, 8, 1, 3, 5, 255, 16, 8, - 1, 3, 5, 255, 17, 8, 1, 3, 5, 248, 155, 8, 1, 240, 59, 236, 49, 238, 10, - 8, 1, 248, 105, 17, 1, 3, 5, 240, 10, 17, 1, 3, 5, 240, 33, 17, 1, 3, 5, - 253, 147, 17, 1, 3, 5, 248, 73, 17, 1, 3, 5, 248, 69, 32, 1, 3, 5, 254, - 3, 49, 1, 5, 67, 49, 1, 5, 253, 178, 49, 1, 5, 217, 49, 1, 5, 240, 60, - 217, 49, 1, 5, 209, 49, 1, 5, 72, 49, 1, 5, 224, 72, 49, 1, 5, 210, 49, - 1, 5, 192, 49, 1, 5, 71, 49, 1, 5, 221, 49, 1, 5, 255, 15, 49, 1, 5, 162, - 49, 1, 5, 173, 49, 1, 5, 197, 49, 1, 5, 224, 197, 49, 1, 5, 73, 49, 1, 5, - 254, 10, 49, 1, 5, 223, 49, 1, 5, 144, 49, 1, 5, 214, 49, 1, 5, 79, 49, - 1, 5, 255, 16, 49, 1, 3, 67, 49, 1, 3, 205, 67, 49, 1, 3, 240, 22, 49, 1, - 3, 205, 253, 178, 49, 1, 3, 217, 49, 1, 3, 209, 49, 1, 3, 72, 49, 1, 3, - 240, 86, 49, 1, 3, 248, 35, 72, 49, 1, 3, 205, 248, 35, 72, 49, 1, 3, - 210, 49, 1, 3, 205, 71, 49, 1, 3, 255, 15, 49, 1, 3, 173, 49, 1, 3, 248, - 108, 49, 1, 3, 73, 49, 1, 3, 248, 35, 73, 49, 1, 3, 253, 159, 137, 73, - 49, 1, 3, 240, 17, 137, 73, 49, 1, 3, 223, 49, 1, 3, 214, 49, 1, 3, 79, - 49, 1, 3, 236, 190, 79, 49, 1, 3, 205, 173, 49, 1, 3, 179, 49, 1, 3, 248, - 105, 49, 1, 3, 242, 242, 49, 1, 3, 17, 240, 10, 49, 1, 3, 240, 28, 49, 1, - 3, 17, 248, 68, 49, 1, 3, 248, 67, 8, 235, 48, 3, 1, 71, 8, 235, 48, 3, - 1, 144, 8, 235, 48, 3, 1, 79, 8, 235, 48, 3, 1, 179, 17, 235, 48, 3, 1, - 242, 242, 17, 235, 48, 3, 1, 240, 10, 17, 235, 48, 3, 1, 248, 73, 17, - 235, 48, 3, 1, 248, 68, 17, 235, 48, 3, 1, 248, 67, 8, 3, 1, 253, 252, 8, - 3, 1, 41, 2, 240, 1, 169, 8, 3, 1, 255, 103, 2, 240, 1, 169, 8, 3, 1, - 255, 112, 2, 240, 1, 169, 8, 3, 1, 255, 108, 2, 240, 1, 169, 8, 3, 1, - 255, 98, 2, 240, 1, 169, 8, 3, 1, 255, 114, 2, 240, 1, 169, 8, 3, 1, 255, - 101, 2, 240, 1, 169, 8, 3, 1, 255, 101, 2, 237, 11, 19, 240, 1, 169, 8, - 3, 1, 255, 99, 2, 240, 1, 169, 8, 3, 1, 255, 102, 2, 240, 1, 169, 8, 3, - 1, 255, 97, 2, 240, 1, 169, 8, 3, 1, 205, 210, 49, 1, 32, 253, 202, 8, 3, - 1, 239, 101, 210, 8, 3, 1, 255, 93, 2, 231, 82, 8, 3, 5, 1, 220, 2, 108, - 8, 3, 1, 248, 42, 2, 108, 8, 3, 1, 255, 114, 2, 108, 8, 3, 5, 1, 132, 2, - 108, 8, 3, 1, 238, 53, 2, 108, 8, 3, 1, 41, 2, 238, 65, 90, 8, 3, 1, 255, - 103, 2, 238, 65, 90, 8, 3, 1, 255, 112, 2, 238, 65, 90, 8, 3, 1, 255, - 104, 2, 238, 65, 90, 8, 3, 1, 255, 109, 2, 238, 65, 90, 8, 3, 1, 255, - 100, 2, 238, 65, 90, 8, 3, 1, 255, 108, 2, 238, 65, 90, 8, 3, 1, 255, 98, - 2, 238, 65, 90, 8, 3, 1, 255, 114, 2, 238, 65, 90, 8, 3, 1, 255, 101, 2, - 238, 65, 90, 8, 3, 1, 255, 99, 2, 238, 65, 90, 8, 3, 1, 254, 38, 2, 238, - 65, 90, 8, 3, 1, 255, 110, 2, 238, 65, 90, 8, 3, 1, 255, 113, 2, 238, 65, - 90, 8, 3, 1, 255, 97, 2, 238, 65, 90, 8, 3, 1, 134, 2, 235, 54, 90, 8, 3, - 1, 194, 2, 235, 54, 90, 8, 3, 1, 255, 103, 2, 248, 45, 19, 242, 226, 8, - 3, 1, 157, 2, 235, 54, 90, 8, 3, 1, 248, 35, 157, 2, 235, 54, 90, 8, 3, - 1, 224, 248, 35, 157, 2, 235, 54, 90, 8, 3, 1, 243, 73, 2, 235, 54, 90, - 8, 3, 1, 220, 2, 235, 54, 90, 8, 3, 1, 248, 35, 117, 2, 235, 54, 90, 8, - 3, 1, 254, 38, 2, 235, 54, 90, 8, 3, 1, 132, 2, 235, 54, 90, 8, 3, 1, - 253, 244, 2, 235, 54, 90, 49, 1, 3, 205, 240, 22, 49, 1, 3, 255, 18, 49, - 1, 3, 255, 105, 2, 242, 253, 49, 1, 3, 248, 109, 49, 1, 3, 224, 248, 35, - 72, 49, 1, 3, 255, 19, 49, 1, 3, 238, 70, 255, 115, 2, 108, 49, 1, 3, 84, - 210, 49, 1, 3, 205, 192, 49, 1, 3, 220, 2, 108, 49, 1, 3, 242, 237, 49, - 1, 3, 5, 71, 49, 1, 3, 5, 220, 2, 108, 49, 1, 3, 255, 115, 2, 231, 101, - 49, 1, 3, 255, 100, 2, 235, 54, 90, 49, 1, 3, 255, 100, 2, 238, 65, 90, - 49, 1, 3, 5, 162, 49, 1, 3, 255, 108, 2, 90, 49, 1, 3, 205, 255, 108, 2, - 183, 248, 117, 49, 1, 3, 255, 98, 2, 40, 90, 49, 1, 3, 255, 98, 2, 235, - 54, 90, 49, 1, 3, 5, 197, 49, 1, 3, 240, 60, 73, 49, 1, 3, 248, 68, 49, - 1, 3, 255, 99, 2, 90, 49, 1, 3, 248, 93, 49, 1, 3, 255, 102, 2, 238, 65, - 90, 49, 1, 3, 132, 125, 49, 1, 3, 236, 160, 49, 1, 3, 5, 79, 49, 1, 3, - 255, 110, 2, 90, 49, 1, 3, 205, 179, 49, 1, 3, 255, 17, 49, 1, 3, 255, - 97, 2, 235, 54, 90, 49, 1, 3, 255, 97, 2, 242, 253, 49, 1, 3, 248, 155, - 49, 1, 3, 240, 38, 50, 240, 4, 242, 245, 238, 54, 50, 240, 4, 242, 241, - 238, 54, 50, 247, 95, 46, 50, 235, 6, 69, 8, 5, 1, 134, 2, 248, 51, 46, - 8, 3, 1, 134, 2, 248, 51, 46, 8, 5, 1, 41, 2, 53, 48, 8, 3, 1, 41, 2, 53, - 48, 8, 5, 1, 41, 2, 53, 46, 8, 3, 1, 41, 2, 53, 46, 8, 5, 1, 41, 2, 248, - 41, 46, 8, 3, 1, 41, 2, 248, 41, 46, 8, 5, 1, 255, 105, 2, 238, 109, 19, - 135, 8, 3, 1, 255, 105, 2, 238, 109, 19, 135, 8, 5, 1, 255, 103, 2, 53, - 48, 8, 3, 1, 255, 103, 2, 53, 48, 8, 5, 1, 255, 103, 2, 53, 46, 8, 3, 1, - 255, 103, 2, 53, 46, 8, 5, 1, 255, 103, 2, 248, 41, 46, 8, 3, 1, 255, - 103, 2, 248, 41, 46, 8, 5, 1, 255, 103, 2, 236, 151, 8, 3, 1, 255, 103, - 2, 236, 151, 8, 5, 1, 255, 103, 2, 190, 46, 8, 3, 1, 255, 103, 2, 190, - 46, 8, 5, 1, 157, 2, 240, 42, 19, 191, 8, 3, 1, 157, 2, 240, 42, 19, 191, - 8, 5, 1, 157, 2, 240, 42, 19, 135, 8, 3, 1, 157, 2, 240, 42, 19, 135, 8, - 5, 1, 157, 2, 190, 46, 8, 3, 1, 157, 2, 190, 46, 8, 5, 1, 157, 2, 242, - 219, 46, 8, 3, 1, 157, 2, 242, 219, 46, 8, 5, 1, 157, 2, 238, 109, 19, - 239, 255, 8, 3, 1, 157, 2, 238, 109, 19, 239, 255, 8, 5, 1, 255, 112, 2, - 53, 48, 8, 3, 1, 255, 112, 2, 53, 48, 8, 5, 1, 255, 104, 2, 196, 8, 3, 1, - 255, 104, 2, 196, 8, 5, 1, 255, 106, 2, 53, 48, 8, 3, 1, 255, 106, 2, 53, - 48, 8, 5, 1, 255, 106, 2, 53, 46, 8, 3, 1, 255, 106, 2, 53, 46, 8, 5, 1, - 255, 106, 2, 175, 8, 3, 1, 255, 106, 2, 175, 8, 5, 1, 255, 106, 2, 236, - 151, 8, 3, 1, 255, 106, 2, 236, 151, 8, 5, 1, 255, 106, 2, 242, 243, 46, - 8, 3, 1, 255, 106, 2, 242, 243, 46, 8, 5, 1, 220, 2, 242, 219, 46, 8, 3, - 1, 220, 2, 242, 219, 46, 8, 5, 1, 220, 2, 235, 56, 19, 135, 8, 3, 1, 220, - 2, 235, 56, 19, 135, 8, 5, 1, 255, 109, 2, 135, 8, 3, 1, 255, 109, 2, - 135, 8, 5, 1, 255, 109, 2, 53, 46, 8, 3, 1, 255, 109, 2, 53, 46, 8, 5, 1, - 255, 109, 2, 248, 41, 46, 8, 3, 1, 255, 109, 2, 248, 41, 46, 8, 5, 1, - 255, 100, 2, 53, 46, 8, 3, 1, 255, 100, 2, 53, 46, 8, 5, 1, 255, 100, 2, - 53, 242, 230, 19, 196, 8, 3, 1, 255, 100, 2, 53, 242, 230, 19, 196, 8, 5, - 1, 255, 100, 2, 248, 41, 46, 8, 3, 1, 255, 100, 2, 248, 41, 46, 8, 5, 1, - 255, 100, 2, 190, 46, 8, 3, 1, 255, 100, 2, 190, 46, 8, 5, 1, 255, 108, - 2, 135, 8, 3, 1, 255, 108, 2, 135, 8, 5, 1, 255, 108, 2, 53, 48, 8, 3, 1, - 255, 108, 2, 53, 48, 8, 5, 1, 255, 108, 2, 53, 46, 8, 3, 1, 255, 108, 2, - 53, 46, 8, 5, 1, 255, 98, 2, 53, 48, 8, 3, 1, 255, 98, 2, 53, 48, 8, 5, - 1, 255, 98, 2, 53, 46, 8, 3, 1, 255, 98, 2, 53, 46, 8, 5, 1, 255, 98, 2, - 248, 41, 46, 8, 3, 1, 255, 98, 2, 248, 41, 46, 8, 5, 1, 255, 98, 2, 190, - 46, 8, 3, 1, 255, 98, 2, 190, 46, 8, 5, 1, 117, 2, 242, 219, 19, 135, 8, - 3, 1, 117, 2, 242, 219, 19, 135, 8, 5, 1, 117, 2, 242, 219, 19, 175, 8, - 3, 1, 117, 2, 242, 219, 19, 175, 8, 5, 1, 117, 2, 240, 42, 19, 191, 8, 3, - 1, 117, 2, 240, 42, 19, 191, 8, 5, 1, 117, 2, 240, 42, 19, 135, 8, 3, 1, - 117, 2, 240, 42, 19, 135, 8, 5, 1, 255, 114, 2, 135, 8, 3, 1, 255, 114, - 2, 135, 8, 5, 1, 255, 114, 2, 53, 48, 8, 3, 1, 255, 114, 2, 53, 48, 8, 5, - 1, 255, 101, 2, 53, 48, 8, 3, 1, 255, 101, 2, 53, 48, 8, 5, 1, 255, 101, - 2, 53, 46, 8, 3, 1, 255, 101, 2, 53, 46, 8, 5, 1, 255, 101, 2, 53, 242, - 230, 19, 196, 8, 3, 1, 255, 101, 2, 53, 242, 230, 19, 196, 8, 5, 1, 255, - 101, 2, 248, 41, 46, 8, 3, 1, 255, 101, 2, 248, 41, 46, 8, 5, 1, 255, 99, - 2, 53, 48, 8, 3, 1, 255, 99, 2, 53, 48, 8, 5, 1, 255, 99, 2, 53, 46, 8, - 3, 1, 255, 99, 2, 53, 46, 8, 5, 1, 255, 99, 2, 242, 241, 19, 53, 48, 8, - 3, 1, 255, 99, 2, 242, 241, 19, 53, 48, 8, 5, 1, 255, 99, 2, 243, 86, 19, - 53, 48, 8, 3, 1, 255, 99, 2, 243, 86, 19, 53, 48, 8, 5, 1, 255, 99, 2, - 53, 242, 230, 19, 53, 48, 8, 3, 1, 255, 99, 2, 53, 242, 230, 19, 53, 48, - 8, 5, 1, 255, 102, 2, 53, 48, 8, 3, 1, 255, 102, 2, 53, 48, 8, 5, 1, 255, - 102, 2, 53, 46, 8, 3, 1, 255, 102, 2, 53, 46, 8, 5, 1, 255, 102, 2, 248, - 41, 46, 8, 3, 1, 255, 102, 2, 248, 41, 46, 8, 5, 1, 255, 102, 2, 190, 46, - 8, 3, 1, 255, 102, 2, 190, 46, 8, 5, 1, 132, 2, 235, 56, 46, 8, 3, 1, - 132, 2, 235, 56, 46, 8, 5, 1, 132, 2, 242, 219, 46, 8, 3, 1, 132, 2, 242, - 219, 46, 8, 5, 1, 132, 2, 190, 46, 8, 3, 1, 132, 2, 190, 46, 8, 5, 1, - 132, 2, 242, 219, 19, 135, 8, 3, 1, 132, 2, 242, 219, 19, 135, 8, 5, 1, - 132, 2, 240, 42, 19, 175, 8, 3, 1, 132, 2, 240, 42, 19, 175, 8, 5, 1, - 255, 110, 2, 169, 8, 3, 1, 255, 110, 2, 169, 8, 5, 1, 255, 110, 2, 53, - 46, 8, 3, 1, 255, 110, 2, 53, 46, 8, 5, 1, 255, 111, 2, 191, 8, 3, 1, - 255, 111, 2, 191, 8, 5, 1, 255, 111, 2, 135, 8, 3, 1, 255, 111, 2, 135, - 8, 5, 1, 255, 111, 2, 175, 8, 3, 1, 255, 111, 2, 175, 8, 5, 1, 255, 111, - 2, 53, 48, 8, 3, 1, 255, 111, 2, 53, 48, 8, 5, 1, 255, 111, 2, 53, 46, 8, - 3, 1, 255, 111, 2, 53, 46, 8, 5, 1, 255, 113, 2, 53, 48, 8, 3, 1, 255, - 113, 2, 53, 48, 8, 5, 1, 255, 113, 2, 175, 8, 3, 1, 255, 113, 2, 175, 8, - 5, 1, 255, 107, 2, 53, 48, 8, 3, 1, 255, 107, 2, 53, 48, 8, 5, 1, 255, - 97, 2, 233, 48, 8, 3, 1, 255, 97, 2, 233, 48, 8, 5, 1, 255, 97, 2, 53, - 46, 8, 3, 1, 255, 97, 2, 53, 46, 8, 5, 1, 255, 97, 2, 248, 41, 46, 8, 3, - 1, 255, 97, 2, 248, 41, 46, 8, 3, 1, 255, 106, 2, 248, 41, 46, 8, 3, 1, - 255, 102, 2, 175, 8, 3, 1, 255, 111, 2, 248, 51, 48, 8, 3, 1, 255, 107, - 2, 248, 51, 48, 8, 3, 1, 134, 2, 38, 137, 242, 233, 8, 3, 1, 183, 255, - 99, 2, 53, 48, 8, 5, 1, 134, 2, 53, 46, 8, 3, 1, 134, 2, 53, 46, 8, 5, 1, - 134, 2, 248, 45, 48, 8, 3, 1, 134, 2, 248, 45, 48, 8, 5, 1, 134, 2, 190, - 19, 135, 8, 3, 1, 134, 2, 190, 19, 135, 8, 5, 1, 134, 2, 190, 19, 191, 8, - 3, 1, 134, 2, 190, 19, 191, 8, 5, 1, 134, 2, 190, 19, 248, 45, 48, 8, 3, - 1, 134, 2, 190, 19, 248, 45, 48, 8, 5, 1, 134, 2, 190, 19, 169, 8, 3, 1, - 134, 2, 190, 19, 169, 8, 5, 1, 134, 2, 190, 19, 53, 46, 8, 3, 1, 134, 2, - 190, 19, 53, 46, 8, 5, 1, 134, 2, 242, 243, 19, 135, 8, 3, 1, 134, 2, - 242, 243, 19, 135, 8, 5, 1, 134, 2, 242, 243, 19, 191, 8, 3, 1, 134, 2, - 242, 243, 19, 191, 8, 5, 1, 134, 2, 242, 243, 19, 248, 45, 48, 8, 3, 1, - 134, 2, 242, 243, 19, 248, 45, 48, 8, 5, 1, 134, 2, 242, 243, 19, 169, 8, - 3, 1, 134, 2, 242, 243, 19, 169, 8, 5, 1, 134, 2, 242, 243, 19, 53, 46, - 8, 3, 1, 134, 2, 242, 243, 19, 53, 46, 8, 5, 1, 157, 2, 53, 46, 8, 3, 1, - 157, 2, 53, 46, 8, 5, 1, 157, 2, 248, 45, 48, 8, 3, 1, 157, 2, 248, 45, - 48, 8, 5, 1, 157, 2, 169, 8, 3, 1, 157, 2, 169, 8, 5, 1, 157, 2, 190, 19, - 135, 8, 3, 1, 157, 2, 190, 19, 135, 8, 5, 1, 157, 2, 190, 19, 191, 8, 3, - 1, 157, 2, 190, 19, 191, 8, 5, 1, 157, 2, 190, 19, 248, 45, 48, 8, 3, 1, - 157, 2, 190, 19, 248, 45, 48, 8, 5, 1, 157, 2, 190, 19, 169, 8, 3, 1, - 157, 2, 190, 19, 169, 8, 5, 1, 157, 2, 190, 19, 53, 46, 8, 3, 1, 157, 2, - 190, 19, 53, 46, 8, 5, 1, 220, 2, 248, 45, 48, 8, 3, 1, 220, 2, 248, 45, - 48, 8, 5, 1, 220, 2, 53, 46, 8, 3, 1, 220, 2, 53, 46, 8, 5, 1, 117, 2, - 53, 46, 8, 3, 1, 117, 2, 53, 46, 8, 5, 1, 117, 2, 248, 45, 48, 8, 3, 1, - 117, 2, 248, 45, 48, 8, 5, 1, 117, 2, 190, 19, 135, 8, 3, 1, 117, 2, 190, - 19, 135, 8, 5, 1, 117, 2, 190, 19, 191, 8, 3, 1, 117, 2, 190, 19, 191, 8, - 5, 1, 117, 2, 190, 19, 248, 45, 48, 8, 3, 1, 117, 2, 190, 19, 248, 45, - 48, 8, 5, 1, 117, 2, 190, 19, 169, 8, 3, 1, 117, 2, 190, 19, 169, 8, 5, - 1, 117, 2, 190, 19, 53, 46, 8, 3, 1, 117, 2, 190, 19, 53, 46, 8, 5, 1, - 117, 2, 248, 60, 19, 135, 8, 3, 1, 117, 2, 248, 60, 19, 135, 8, 5, 1, - 117, 2, 248, 60, 19, 191, 8, 3, 1, 117, 2, 248, 60, 19, 191, 8, 5, 1, - 117, 2, 248, 60, 19, 248, 45, 48, 8, 3, 1, 117, 2, 248, 60, 19, 248, 45, - 48, 8, 5, 1, 117, 2, 248, 60, 19, 169, 8, 3, 1, 117, 2, 248, 60, 19, 169, - 8, 5, 1, 117, 2, 248, 60, 19, 53, 46, 8, 3, 1, 117, 2, 248, 60, 19, 53, - 46, 8, 5, 1, 132, 2, 53, 46, 8, 3, 1, 132, 2, 53, 46, 8, 5, 1, 132, 2, - 248, 45, 48, 8, 3, 1, 132, 2, 248, 45, 48, 8, 5, 1, 132, 2, 248, 60, 19, - 135, 8, 3, 1, 132, 2, 248, 60, 19, 135, 8, 5, 1, 132, 2, 248, 60, 19, - 191, 8, 3, 1, 132, 2, 248, 60, 19, 191, 8, 5, 1, 132, 2, 248, 60, 19, - 248, 45, 48, 8, 3, 1, 132, 2, 248, 60, 19, 248, 45, 48, 8, 5, 1, 132, 2, - 248, 60, 19, 169, 8, 3, 1, 132, 2, 248, 60, 19, 169, 8, 5, 1, 132, 2, - 248, 60, 19, 53, 46, 8, 3, 1, 132, 2, 248, 60, 19, 53, 46, 8, 5, 1, 255, - 107, 2, 191, 8, 3, 1, 255, 107, 2, 191, 8, 5, 1, 255, 107, 2, 53, 46, 8, - 3, 1, 255, 107, 2, 53, 46, 8, 5, 1, 255, 107, 2, 248, 45, 48, 8, 3, 1, - 255, 107, 2, 248, 45, 48, 8, 5, 1, 255, 107, 2, 169, 8, 3, 1, 255, 107, - 2, 169, 17, 3, 1, 194, 2, 240, 29, 17, 3, 1, 194, 2, 240, 25, 17, 3, 1, - 194, 2, 159, 19, 215, 17, 3, 1, 194, 2, 148, 19, 215, 17, 3, 1, 194, 2, - 159, 19, 212, 17, 3, 1, 194, 2, 148, 19, 212, 17, 3, 1, 194, 2, 159, 19, - 232, 71, 17, 3, 1, 194, 2, 148, 19, 232, 71, 17, 5, 1, 194, 2, 240, 29, - 17, 5, 1, 194, 2, 240, 25, 17, 5, 1, 194, 2, 159, 19, 215, 17, 5, 1, 194, - 2, 148, 19, 215, 17, 5, 1, 194, 2, 159, 19, 212, 17, 5, 1, 194, 2, 148, - 19, 212, 17, 5, 1, 194, 2, 159, 19, 232, 71, 17, 5, 1, 194, 2, 148, 19, - 232, 71, 17, 3, 1, 238, 57, 2, 240, 29, 17, 3, 1, 238, 57, 2, 240, 25, - 17, 3, 1, 238, 57, 2, 159, 19, 215, 17, 3, 1, 238, 57, 2, 148, 19, 215, - 17, 3, 1, 238, 57, 2, 159, 19, 212, 17, 3, 1, 238, 57, 2, 148, 19, 212, - 17, 5, 1, 238, 57, 2, 240, 29, 17, 5, 1, 238, 57, 2, 240, 25, 17, 5, 1, - 238, 57, 2, 159, 19, 215, 17, 5, 1, 238, 57, 2, 148, 19, 215, 17, 5, 1, - 238, 57, 2, 159, 19, 212, 17, 5, 1, 238, 57, 2, 148, 19, 212, 17, 3, 1, - 253, 123, 2, 240, 29, 17, 3, 1, 253, 123, 2, 240, 25, 17, 3, 1, 253, 123, - 2, 159, 19, 215, 17, 3, 1, 253, 123, 2, 148, 19, 215, 17, 3, 1, 253, 123, - 2, 159, 19, 212, 17, 3, 1, 253, 123, 2, 148, 19, 212, 17, 3, 1, 253, 123, - 2, 159, 19, 232, 71, 17, 3, 1, 253, 123, 2, 148, 19, 232, 71, 17, 5, 1, - 253, 123, 2, 240, 29, 17, 5, 1, 253, 123, 2, 240, 25, 17, 5, 1, 253, 123, - 2, 159, 19, 215, 17, 5, 1, 253, 123, 2, 148, 19, 215, 17, 5, 1, 253, 123, - 2, 159, 19, 212, 17, 5, 1, 253, 123, 2, 148, 19, 212, 17, 5, 1, 253, 123, - 2, 159, 19, 232, 71, 17, 5, 1, 253, 123, 2, 148, 19, 232, 71, 17, 3, 1, - 248, 42, 2, 240, 29, 17, 3, 1, 248, 42, 2, 240, 25, 17, 3, 1, 248, 42, 2, - 159, 19, 215, 17, 3, 1, 248, 42, 2, 148, 19, 215, 17, 3, 1, 248, 42, 2, - 159, 19, 212, 17, 3, 1, 248, 42, 2, 148, 19, 212, 17, 3, 1, 248, 42, 2, - 159, 19, 232, 71, 17, 3, 1, 248, 42, 2, 148, 19, 232, 71, 17, 5, 1, 248, - 42, 2, 240, 29, 17, 5, 1, 248, 42, 2, 240, 25, 17, 5, 1, 248, 42, 2, 159, - 19, 215, 17, 5, 1, 248, 42, 2, 148, 19, 215, 17, 5, 1, 248, 42, 2, 159, - 19, 212, 17, 5, 1, 248, 42, 2, 148, 19, 212, 17, 5, 1, 248, 42, 2, 159, - 19, 232, 71, 17, 5, 1, 248, 42, 2, 148, 19, 232, 71, 17, 3, 1, 238, 64, - 2, 240, 29, 17, 3, 1, 238, 64, 2, 240, 25, 17, 3, 1, 238, 64, 2, 159, 19, - 215, 17, 3, 1, 238, 64, 2, 148, 19, 215, 17, 3, 1, 238, 64, 2, 159, 19, - 212, 17, 3, 1, 238, 64, 2, 148, 19, 212, 17, 5, 1, 238, 64, 2, 240, 29, - 17, 5, 1, 238, 64, 2, 240, 25, 17, 5, 1, 238, 64, 2, 159, 19, 215, 17, 5, - 1, 238, 64, 2, 148, 19, 215, 17, 5, 1, 238, 64, 2, 159, 19, 212, 17, 5, - 1, 238, 64, 2, 148, 19, 212, 17, 3, 1, 238, 53, 2, 240, 29, 17, 3, 1, - 238, 53, 2, 240, 25, 17, 3, 1, 238, 53, 2, 159, 19, 215, 17, 3, 1, 238, - 53, 2, 148, 19, 215, 17, 3, 1, 238, 53, 2, 159, 19, 212, 17, 3, 1, 238, - 53, 2, 148, 19, 212, 17, 3, 1, 238, 53, 2, 159, 19, 232, 71, 17, 3, 1, - 238, 53, 2, 148, 19, 232, 71, 17, 5, 1, 238, 53, 2, 240, 25, 17, 5, 1, - 238, 53, 2, 148, 19, 215, 17, 5, 1, 238, 53, 2, 148, 19, 212, 17, 5, 1, - 238, 53, 2, 148, 19, 232, 71, 17, 3, 1, 211, 2, 240, 29, 17, 3, 1, 211, - 2, 240, 25, 17, 3, 1, 211, 2, 159, 19, 215, 17, 3, 1, 211, 2, 148, 19, - 215, 17, 3, 1, 211, 2, 159, 19, 212, 17, 3, 1, 211, 2, 148, 19, 212, 17, - 3, 1, 211, 2, 159, 19, 232, 71, 17, 3, 1, 211, 2, 148, 19, 232, 71, 17, - 5, 1, 211, 2, 240, 29, 17, 5, 1, 211, 2, 240, 25, 17, 5, 1, 211, 2, 159, - 19, 215, 17, 5, 1, 211, 2, 148, 19, 215, 17, 5, 1, 211, 2, 159, 19, 212, - 17, 5, 1, 211, 2, 148, 19, 212, 17, 5, 1, 211, 2, 159, 19, 232, 71, 17, - 5, 1, 211, 2, 148, 19, 232, 71, 17, 3, 1, 194, 2, 215, 17, 3, 1, 194, 2, - 212, 17, 3, 1, 238, 57, 2, 215, 17, 3, 1, 238, 57, 2, 212, 17, 3, 1, 253, - 123, 2, 215, 17, 3, 1, 253, 123, 2, 212, 17, 3, 1, 248, 42, 2, 215, 17, - 3, 1, 248, 42, 2, 212, 17, 3, 1, 238, 64, 2, 215, 17, 3, 1, 238, 64, 2, - 212, 17, 3, 1, 238, 53, 2, 215, 17, 3, 1, 238, 53, 2, 212, 17, 3, 1, 211, - 2, 215, 17, 3, 1, 211, 2, 212, 17, 3, 1, 194, 2, 159, 19, 231, 35, 17, 3, - 1, 194, 2, 148, 19, 231, 35, 17, 3, 1, 194, 2, 159, 19, 242, 248, 19, - 231, 35, 17, 3, 1, 194, 2, 148, 19, 242, 248, 19, 231, 35, 17, 3, 1, 194, - 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, 194, 2, 148, 19, 248, 79, 19, - 231, 35, 17, 3, 1, 194, 2, 159, 19, 233, 53, 19, 231, 35, 17, 3, 1, 194, - 2, 148, 19, 233, 53, 19, 231, 35, 17, 5, 1, 194, 2, 159, 19, 229, 57, 17, - 5, 1, 194, 2, 148, 19, 229, 57, 17, 5, 1, 194, 2, 159, 19, 242, 248, 19, - 229, 57, 17, 5, 1, 194, 2, 148, 19, 242, 248, 19, 229, 57, 17, 5, 1, 194, - 2, 159, 19, 248, 79, 19, 229, 57, 17, 5, 1, 194, 2, 148, 19, 248, 79, 19, - 229, 57, 17, 5, 1, 194, 2, 159, 19, 233, 53, 19, 229, 57, 17, 5, 1, 194, - 2, 148, 19, 233, 53, 19, 229, 57, 17, 3, 1, 253, 123, 2, 159, 19, 231, - 35, 17, 3, 1, 253, 123, 2, 148, 19, 231, 35, 17, 3, 1, 253, 123, 2, 159, - 19, 242, 248, 19, 231, 35, 17, 3, 1, 253, 123, 2, 148, 19, 242, 248, 19, - 231, 35, 17, 3, 1, 253, 123, 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, - 253, 123, 2, 148, 19, 248, 79, 19, 231, 35, 17, 3, 1, 253, 123, 2, 159, - 19, 233, 53, 19, 231, 35, 17, 3, 1, 253, 123, 2, 148, 19, 233, 53, 19, - 231, 35, 17, 5, 1, 253, 123, 2, 159, 19, 229, 57, 17, 5, 1, 253, 123, 2, - 148, 19, 229, 57, 17, 5, 1, 253, 123, 2, 159, 19, 242, 248, 19, 229, 57, - 17, 5, 1, 253, 123, 2, 148, 19, 242, 248, 19, 229, 57, 17, 5, 1, 253, - 123, 2, 159, 19, 248, 79, 19, 229, 57, 17, 5, 1, 253, 123, 2, 148, 19, - 248, 79, 19, 229, 57, 17, 5, 1, 253, 123, 2, 159, 19, 233, 53, 19, 229, - 57, 17, 5, 1, 253, 123, 2, 148, 19, 233, 53, 19, 229, 57, 17, 3, 1, 211, - 2, 159, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 231, 35, 17, 3, 1, 211, - 2, 159, 19, 242, 248, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 242, 248, - 19, 231, 35, 17, 3, 1, 211, 2, 159, 19, 248, 79, 19, 231, 35, 17, 3, 1, - 211, 2, 148, 19, 248, 79, 19, 231, 35, 17, 3, 1, 211, 2, 159, 19, 233, - 53, 19, 231, 35, 17, 3, 1, 211, 2, 148, 19, 233, 53, 19, 231, 35, 17, 5, - 1, 211, 2, 159, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, 229, 57, 17, 5, - 1, 211, 2, 159, 19, 242, 248, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, - 242, 248, 19, 229, 57, 17, 5, 1, 211, 2, 159, 19, 248, 79, 19, 229, 57, - 17, 5, 1, 211, 2, 148, 19, 248, 79, 19, 229, 57, 17, 5, 1, 211, 2, 159, - 19, 233, 53, 19, 229, 57, 17, 5, 1, 211, 2, 148, 19, 233, 53, 19, 229, - 57, 17, 3, 1, 194, 2, 238, 103, 17, 3, 1, 194, 2, 196, 17, 3, 1, 194, 2, - 242, 248, 19, 231, 35, 17, 3, 1, 194, 2, 231, 35, 17, 3, 1, 194, 2, 248, - 79, 19, 231, 35, 17, 3, 1, 194, 2, 232, 71, 17, 3, 1, 194, 2, 233, 53, - 19, 231, 35, 17, 5, 1, 194, 2, 238, 103, 17, 5, 1, 194, 2, 196, 17, 5, 1, - 194, 2, 215, 17, 5, 1, 194, 2, 212, 17, 5, 1, 194, 2, 229, 57, 17, 236, - 229, 17, 229, 57, 17, 240, 29, 17, 232, 71, 17, 235, 59, 19, 232, 71, 17, - 3, 1, 253, 123, 2, 242, 248, 19, 231, 35, 17, 3, 1, 253, 123, 2, 231, 35, - 17, 3, 1, 253, 123, 2, 248, 79, 19, 231, 35, 17, 3, 1, 253, 123, 2, 232, - 71, 17, 3, 1, 253, 123, 2, 233, 53, 19, 231, 35, 17, 5, 1, 238, 57, 2, - 215, 17, 5, 1, 238, 57, 2, 212, 17, 5, 1, 253, 123, 2, 215, 17, 5, 1, - 253, 123, 2, 212, 17, 5, 1, 253, 123, 2, 229, 57, 17, 159, 19, 215, 17, - 159, 19, 212, 17, 159, 19, 232, 71, 17, 3, 1, 248, 42, 2, 238, 103, 17, - 3, 1, 248, 42, 2, 196, 17, 3, 1, 248, 42, 2, 235, 59, 19, 215, 17, 3, 1, - 248, 42, 2, 235, 59, 19, 212, 17, 3, 1, 248, 42, 2, 232, 71, 17, 3, 1, - 248, 42, 2, 235, 59, 19, 232, 71, 17, 5, 1, 248, 42, 2, 238, 103, 17, 5, - 1, 248, 42, 2, 196, 17, 5, 1, 248, 42, 2, 215, 17, 5, 1, 248, 42, 2, 212, - 17, 148, 19, 215, 17, 148, 19, 212, 17, 148, 19, 232, 71, 17, 3, 1, 238, - 53, 2, 238, 103, 17, 3, 1, 238, 53, 2, 196, 17, 3, 1, 238, 53, 2, 235, - 59, 19, 215, 17, 3, 1, 238, 53, 2, 235, 59, 19, 212, 17, 3, 1, 253, 218, - 2, 240, 29, 17, 3, 1, 253, 218, 2, 240, 25, 17, 3, 1, 238, 53, 2, 232, - 71, 17, 3, 1, 238, 53, 2, 235, 59, 19, 232, 71, 17, 5, 1, 238, 53, 2, - 238, 103, 17, 5, 1, 238, 53, 2, 196, 17, 5, 1, 238, 53, 2, 215, 17, 5, 1, - 238, 53, 2, 212, 17, 5, 1, 253, 218, 2, 240, 25, 17, 235, 59, 19, 215, - 17, 235, 59, 19, 212, 17, 215, 17, 3, 1, 211, 2, 242, 248, 19, 231, 35, - 17, 3, 1, 211, 2, 231, 35, 17, 3, 1, 211, 2, 248, 79, 19, 231, 35, 17, 3, - 1, 211, 2, 232, 71, 17, 3, 1, 211, 2, 233, 53, 19, 231, 35, 17, 5, 1, - 238, 64, 2, 215, 17, 5, 1, 238, 64, 2, 212, 17, 5, 1, 211, 2, 215, 17, 5, - 1, 211, 2, 212, 17, 5, 1, 211, 2, 229, 57, 17, 212, 17, 240, 25, 255, 23, - 243, 43, 255, 28, 243, 43, 255, 23, 240, 15, 255, 28, 240, 15, 233, 42, - 240, 15, 233, 203, 240, 15, 235, 1, 240, 15, 240, 174, 240, 15, 233, 51, - 240, 15, 252, 219, 240, 15, 251, 46, 240, 15, 248, 145, 243, 81, 240, 15, - 248, 145, 243, 81, 233, 219, 248, 145, 243, 81, 238, 140, 231, 96, 69, - 231, 99, 69, 238, 93, 232, 188, 238, 93, 240, 174, 242, 235, 255, 23, - 242, 235, 255, 28, 242, 235, 163, 125, 45, 59, 242, 224, 45, 170, 242, - 224, 40, 240, 12, 235, 51, 69, 38, 240, 12, 235, 51, 69, 240, 12, 243, - 218, 235, 51, 69, 240, 12, 229, 62, 235, 51, 69, 40, 45, 235, 51, 69, 38, - 45, 235, 51, 69, 45, 243, 218, 235, 51, 69, 45, 229, 62, 235, 51, 69, - 238, 173, 45, 238, 173, 238, 69, 234, 43, 238, 69, 253, 125, 53, 238, - 143, 171, 53, 238, 143, 163, 235, 69, 233, 207, 240, 209, 248, 41, 234, - 6, 235, 91, 234, 6, 231, 96, 234, 52, 231, 99, 234, 52, 254, 227, 233, - 134, 233, 202, 231, 96, 235, 131, 231, 99, 235, 131, 241, 252, 236, 233, - 240, 15, 254, 68, 246, 85, 52, 254, 68, 253, 219, 236, 193, 52, 240, 57, - 45, 240, 57, 240, 3, 240, 57, 224, 240, 57, 224, 45, 240, 57, 224, 240, - 3, 240, 57, 240, 130, 240, 12, 231, 87, 185, 235, 51, 69, 240, 12, 231, - 36, 185, 235, 51, 69, 236, 90, 69, 45, 233, 54, 69, 232, 179, 235, 74, - 235, 158, 99, 248, 139, 243, 25, 235, 128, 240, 209, 235, 175, 241, 177, - 238, 69, 236, 155, 240, 37, 40, 31, 238, 52, 2, 240, 214, 38, 31, 238, - 52, 2, 240, 214, 45, 236, 156, 69, 236, 156, 233, 54, 69, 233, 54, 236, - 156, 69, 238, 30, 21, 254, 60, 224, 238, 208, 52, 86, 139, 238, 69, 86, - 77, 238, 69, 170, 235, 52, 224, 234, 14, 245, 24, 253, 176, 171, 235, - 174, 238, 243, 234, 0, 234, 20, 242, 250, 52, 247, 129, 242, 235, 236, - 145, 235, 158, 241, 111, 233, 51, 69, 204, 53, 232, 75, 235, 71, 240, 57, - 248, 58, 53, 232, 75, 248, 48, 53, 232, 75, 171, 53, 232, 75, 248, 58, - 53, 69, 240, 4, 240, 34, 236, 131, 59, 248, 58, 243, 5, 240, 19, 10, 240, - 15, 248, 143, 238, 140, 237, 163, 232, 116, 235, 129, 240, 123, 235, 129, - 234, 6, 238, 190, 235, 152, 235, 145, 236, 243, 235, 152, 235, 145, 238, - 190, 11, 248, 38, 237, 39, 236, 243, 11, 248, 38, 237, 39, 237, 216, 26, - 238, 215, 239, 146, 26, 238, 215, 233, 49, 242, 217, 233, 49, 8, 3, 1, - 71, 233, 49, 177, 233, 49, 176, 233, 49, 187, 233, 49, 203, 233, 49, 195, - 233, 49, 202, 233, 49, 248, 49, 52, 233, 49, 240, 68, 233, 49, 240, 7, - 52, 233, 49, 40, 232, 74, 233, 49, 38, 232, 74, 233, 49, 8, 3, 1, 197, - 235, 48, 242, 217, 235, 48, 127, 235, 48, 111, 235, 48, 166, 235, 48, - 177, 235, 48, 176, 235, 48, 187, 235, 48, 203, 235, 48, 195, 235, 48, - 202, 235, 48, 248, 49, 52, 235, 48, 240, 68, 235, 48, 240, 7, 52, 235, - 48, 40, 232, 74, 235, 48, 38, 232, 74, 8, 235, 48, 3, 1, 67, 8, 235, 48, - 3, 1, 72, 8, 235, 48, 3, 1, 73, 8, 235, 48, 3, 1, 206, 8, 235, 48, 3, 1, - 240, 86, 231, 137, 52, 243, 14, 52, 237, 96, 52, 241, 117, 245, 92, 52, - 251, 199, 52, 251, 234, 52, 246, 103, 52, 242, 58, 52, 243, 44, 52, 254, - 131, 52, 116, 242, 104, 52, 250, 203, 52, 250, 231, 52, 254, 185, 52, - 242, 162, 52, 238, 180, 52, 241, 127, 246, 241, 52, 252, 63, 52, 239, 86, - 52, 238, 254, 52, 239, 94, 52, 250, 153, 52, 50, 40, 186, 48, 50, 38, - 186, 48, 50, 183, 59, 248, 41, 236, 161, 50, 242, 215, 59, 248, 41, 236, - 161, 50, 231, 86, 65, 48, 50, 235, 62, 65, 48, 50, 40, 65, 48, 50, 38, - 65, 48, 50, 248, 51, 236, 161, 50, 235, 62, 248, 51, 236, 161, 50, 231, - 86, 248, 51, 236, 161, 50, 204, 181, 48, 50, 248, 58, 181, 48, 50, 235, - 73, 238, 51, 50, 235, 73, 238, 59, 50, 235, 73, 236, 164, 50, 235, 73, - 218, 234, 25, 50, 40, 38, 65, 48, 50, 235, 73, 239, 182, 50, 235, 73, - 239, 107, 50, 235, 73, 242, 172, 236, 150, 235, 46, 50, 238, 75, 238, 83, - 236, 161, 50, 45, 59, 240, 5, 236, 161, 50, 238, 245, 91, 50, 240, 3, - 236, 136, 50, 248, 98, 240, 109, 48, 50, 139, 65, 236, 161, 50, 183, 45, - 238, 83, 236, 161, 238, 158, 253, 174, 235, 160, 153, 253, 145, 238, 18, - 138, 5, 255, 18, 240, 112, 237, 85, 240, 46, 248, 41, 91, 250, 145, 253, - 174, 250, 142, 252, 251, 245, 87, 235, 118, 238, 3, 240, 112, 233, 200, - 84, 3, 210, 84, 5, 192, 232, 80, 5, 192, 138, 5, 192, 240, 208, 235, 118, - 240, 208, 237, 90, 248, 59, 171, 253, 147, 84, 5, 71, 232, 80, 5, 71, 84, - 5, 162, 84, 3, 162, 255, 100, 41, 253, 144, 91, 138, 5, 197, 242, 27, 52, - 243, 1, 236, 88, 234, 105, 84, 5, 223, 138, 5, 223, 138, 5, 255, 20, 84, - 5, 144, 232, 80, 5, 144, 138, 5, 144, 232, 198, 247, 136, 235, 141, 239, - 189, 69, 235, 113, 52, 247, 157, 158, 52, 236, 138, 138, 5, 255, 17, 246, - 235, 52, 254, 119, 52, 236, 145, 254, 119, 52, 232, 80, 5, 255, 17, 205, - 17, 3, 1, 242, 237, 241, 198, 52, 237, 60, 52, 84, 5, 217, 232, 80, 5, - 255, 18, 236, 14, 91, 84, 3, 72, 84, 5, 72, 84, 5, 255, 19, 205, 5, 255, - 19, 84, 5, 173, 84, 3, 73, 83, 91, 254, 53, 91, 243, 184, 91, 243, 162, - 91, 233, 211, 239, 199, 238, 120, 5, 255, 20, 236, 17, 52, 138, 3, 253, - 147, 138, 3, 240, 10, 138, 5, 240, 10, 138, 5, 253, 147, 138, 242, 238, - 234, 65, 205, 27, 5, 210, 205, 27, 5, 162, 224, 27, 5, 162, 205, 27, 5, - 255, 14, 138, 24, 5, 209, 138, 24, 3, 209, 138, 24, 3, 72, 138, 24, 3, - 71, 138, 24, 3, 221, 237, 244, 242, 224, 205, 234, 17, 254, 68, 52, 240, - 30, 236, 155, 253, 125, 242, 148, 240, 30, 236, 155, 171, 239, 220, 240, - 30, 236, 155, 253, 125, 241, 107, 240, 30, 236, 155, 171, 238, 138, 240, - 30, 236, 155, 204, 238, 138, 240, 30, 236, 155, 248, 58, 238, 138, 240, - 30, 236, 155, 253, 125, 242, 113, 240, 30, 236, 155, 248, 48, 239, 197, - 240, 30, 236, 155, 253, 125, 239, 55, 240, 30, 236, 155, 204, 236, 224, - 240, 30, 236, 155, 248, 48, 236, 224, 240, 30, 236, 155, 243, 31, 236, - 224, 236, 155, 235, 79, 127, 242, 218, 178, 127, 242, 218, 178, 111, 242, - 218, 178, 166, 242, 218, 178, 177, 242, 218, 178, 176, 242, 218, 178, - 187, 242, 218, 178, 203, 242, 218, 178, 195, 242, 218, 178, 202, 242, - 218, 178, 248, 53, 242, 218, 178, 238, 91, 242, 218, 178, 238, 97, 242, - 218, 178, 240, 50, 242, 218, 178, 253, 125, 236, 149, 242, 218, 178, 248, - 48, 236, 149, 242, 218, 178, 253, 125, 235, 49, 3, 242, 218, 178, 127, 3, - 242, 218, 178, 111, 3, 242, 218, 178, 166, 3, 242, 218, 178, 177, 3, 242, - 218, 178, 176, 3, 242, 218, 178, 187, 3, 242, 218, 178, 203, 3, 242, 218, - 178, 195, 3, 242, 218, 178, 202, 3, 242, 218, 178, 248, 53, 3, 242, 218, - 178, 238, 91, 3, 242, 218, 178, 238, 97, 3, 242, 218, 178, 240, 50, 3, - 242, 218, 178, 253, 125, 236, 149, 3, 242, 218, 178, 248, 48, 236, 149, - 3, 242, 218, 178, 253, 125, 235, 49, 242, 218, 178, 253, 125, 236, 193, - 255, 105, 209, 242, 218, 178, 248, 48, 235, 49, 242, 218, 178, 253, 219, - 235, 49, 242, 218, 178, 224, 253, 125, 236, 149, 139, 56, 226, 226, 56, - 77, 56, 235, 45, 56, 40, 38, 56, 88, 92, 56, 242, 223, 248, 56, 56, 242, - 223, 248, 43, 56, 242, 228, 248, 43, 56, 242, 228, 248, 56, 56, 139, 65, - 2, 108, 77, 65, 2, 108, 139, 248, 141, 56, 77, 248, 141, 56, 139, 171, - 240, 115, 56, 226, 226, 171, 240, 115, 56, 77, 171, 240, 115, 56, 235, - 45, 171, 240, 115, 56, 139, 65, 2, 242, 226, 77, 65, 2, 242, 226, 139, - 65, 248, 44, 125, 226, 226, 65, 248, 44, 125, 77, 65, 248, 44, 125, 235, - 45, 65, 248, 44, 125, 88, 92, 65, 2, 244, 192, 139, 65, 2, 90, 77, 65, 2, - 90, 139, 65, 2, 243, 105, 77, 65, 2, 243, 105, 40, 38, 248, 141, 56, 40, - 38, 65, 2, 108, 235, 45, 240, 126, 56, 226, 226, 65, 2, 253, 241, 234, - 18, 226, 226, 65, 2, 253, 241, 233, 63, 235, 45, 65, 2, 253, 241, 234, - 18, 235, 45, 65, 2, 253, 241, 233, 63, 77, 65, 2, 240, 31, 234, 9, 235, - 45, 65, 2, 240, 31, 234, 18, 231, 86, 253, 159, 234, 64, 56, 235, 62, - 253, 159, 234, 64, 56, 242, 223, 248, 56, 65, 153, 183, 125, 139, 65, - 153, 253, 144, 248, 59, 77, 65, 153, 125, 231, 86, 248, 35, 218, 56, 235, - 62, 248, 35, 218, 56, 139, 186, 2, 154, 236, 206, 139, 186, 2, 154, 234, - 9, 226, 226, 186, 2, 154, 233, 63, 226, 226, 186, 2, 154, 234, 18, 77, - 186, 2, 154, 236, 206, 77, 186, 2, 154, 234, 9, 235, 45, 186, 2, 154, - 233, 63, 235, 45, 186, 2, 154, 234, 18, 77, 65, 248, 59, 139, 56, 226, - 226, 65, 139, 147, 235, 45, 56, 139, 65, 248, 59, 77, 56, 139, 240, 117, - 238, 104, 226, 226, 240, 117, 238, 104, 77, 240, 117, 238, 104, 235, 45, - 240, 117, 238, 104, 139, 186, 248, 59, 77, 236, 175, 77, 186, 248, 59, - 139, 236, 175, 139, 45, 65, 2, 108, 40, 38, 45, 65, 2, 108, 77, 45, 65, - 2, 108, 139, 45, 56, 226, 226, 45, 56, 77, 45, 56, 235, 45, 45, 56, 40, - 38, 45, 56, 88, 92, 45, 56, 242, 223, 248, 56, 45, 56, 242, 223, 248, 43, - 45, 56, 242, 228, 248, 43, 45, 56, 242, 228, 248, 56, 45, 56, 139, 240, - 3, 56, 77, 240, 3, 56, 139, 236, 240, 56, 77, 236, 240, 56, 226, 226, 65, - 2, 45, 108, 235, 45, 65, 2, 45, 108, 139, 240, 55, 56, 226, 226, 240, 55, - 56, 77, 240, 55, 56, 235, 45, 240, 55, 56, 139, 65, 153, 125, 77, 65, - 153, 125, 139, 64, 56, 226, 226, 64, 56, 77, 64, 56, 235, 45, 64, 56, - 226, 226, 64, 65, 248, 44, 125, 226, 226, 64, 65, 255, 34, 235, 133, 226, - 226, 64, 65, 255, 34, 237, 28, 2, 163, 125, 226, 226, 64, 65, 255, 34, - 237, 28, 2, 59, 125, 226, 226, 64, 45, 56, 226, 226, 64, 45, 65, 255, 34, - 235, 133, 77, 64, 65, 248, 44, 247, 192, 242, 223, 248, 56, 65, 153, 238, - 67, 242, 228, 248, 43, 65, 153, 238, 67, 88, 92, 64, 56, 38, 65, 2, 3, - 238, 51, 235, 45, 65, 139, 147, 226, 226, 56, 204, 77, 238, 104, 139, 65, - 2, 59, 108, 77, 65, 2, 59, 108, 40, 38, 65, 2, 59, 108, 139, 65, 2, 45, - 59, 108, 77, 65, 2, 45, 59, 108, 40, 38, 65, 2, 45, 59, 108, 139, 233, - 72, 56, 77, 233, 72, 56, 40, 38, 233, 72, 56, 28, 249, 26, 233, 124, 238, - 100, 231, 90, 244, 29, 239, 58, 244, 29, 248, 86, 161, 241, 100, 243, 15, - 249, 160, 234, 205, 240, 79, 238, 68, 253, 174, 161, 255, 68, 238, 68, - 253, 174, 3, 238, 68, 253, 174, 236, 180, 255, 24, 238, 145, 248, 86, - 161, 238, 131, 255, 24, 238, 145, 3, 236, 180, 255, 24, 238, 145, 253, - 165, 147, 242, 66, 242, 238, 236, 170, 242, 238, 234, 50, 242, 238, 234, - 65, 242, 250, 52, 231, 148, 52, 53, 243, 12, 236, 196, 240, 37, 254, 30, - 240, 68, 236, 219, 235, 47, 248, 51, 235, 47, 241, 41, 235, 47, 31, 243, - 119, 250, 169, 243, 119, 240, 137, 243, 119, 232, 199, 87, 235, 101, 38, - 240, 54, 240, 54, 236, 168, 240, 54, 235, 109, 240, 54, 237, 112, 248, - 86, 161, 238, 177, 236, 200, 87, 161, 236, 200, 87, 238, 56, 248, 91, - 238, 56, 253, 227, 231, 88, 240, 58, 235, 60, 45, 235, 60, 240, 3, 235, - 60, 238, 132, 235, 60, 239, 210, 235, 60, 242, 180, 235, 60, 235, 62, - 235, 60, 235, 62, 238, 132, 235, 60, 231, 86, 238, 132, 235, 60, 235, 33, - 237, 74, 242, 78, 233, 96, 53, 240, 68, 239, 57, 236, 31, 233, 96, 233, - 206, 242, 219, 235, 47, 224, 169, 236, 145, 251, 187, 193, 252, 178, 243, - 80, 242, 186, 236, 170, 161, 169, 242, 250, 169, 231, 45, 95, 87, 161, - 231, 45, 95, 87, 231, 89, 95, 87, 231, 89, 253, 230, 161, 236, 244, 95, - 87, 238, 79, 231, 89, 253, 192, 236, 244, 95, 87, 240, 40, 95, 87, 161, - 240, 40, 95, 87, 240, 40, 95, 128, 95, 87, 240, 3, 169, 254, 51, 95, 87, - 234, 5, 87, 231, 105, 234, 5, 87, 234, 111, 236, 248, 234, 92, 253, 145, - 241, 216, 231, 105, 95, 87, 231, 89, 95, 153, 128, 253, 145, 243, 11, - 253, 174, 243, 11, 147, 128, 231, 89, 95, 87, 243, 14, 238, 113, 240, 7, - 240, 24, 248, 51, 255, 22, 95, 87, 248, 51, 95, 87, 233, 128, 87, 234, - 187, 233, 198, 87, 248, 135, 238, 113, 243, 92, 95, 87, 95, 153, 255, 25, - 233, 130, 236, 168, 254, 82, 234, 243, 95, 87, 161, 95, 87, 235, 89, 87, - 161, 235, 89, 87, 238, 17, 234, 5, 87, 235, 44, 128, 95, 87, 232, 68, - 128, 95, 87, 235, 44, 248, 59, 95, 87, 232, 68, 248, 59, 95, 87, 235, 44, - 253, 230, 161, 95, 87, 232, 68, 253, 230, 161, 95, 87, 248, 168, 234, 3, - 248, 168, 231, 85, 236, 248, 161, 234, 5, 87, 161, 234, 3, 161, 231, 85, - 238, 79, 235, 44, 253, 192, 95, 87, 238, 79, 232, 68, 253, 192, 95, 87, - 235, 44, 128, 234, 5, 87, 232, 68, 128, 234, 5, 87, 238, 79, 235, 44, - 253, 192, 234, 5, 87, 238, 79, 232, 68, 253, 192, 234, 5, 87, 235, 44, - 128, 231, 85, 232, 68, 128, 234, 3, 238, 79, 235, 44, 253, 192, 231, 85, - 238, 79, 232, 68, 253, 192, 234, 3, 235, 107, 235, 111, 236, 176, 128, - 95, 87, 236, 178, 128, 95, 87, 236, 176, 128, 234, 5, 87, 236, 178, 128, - 234, 5, 87, 248, 86, 161, 237, 240, 248, 86, 161, 238, 19, 240, 26, 253, - 174, 236, 154, 253, 174, 161, 134, 240, 26, 253, 174, 161, 134, 236, 154, - 253, 174, 240, 26, 147, 128, 95, 87, 236, 154, 147, 128, 95, 87, 238, 79, - 134, 240, 26, 147, 253, 192, 95, 87, 238, 79, 134, 236, 154, 147, 253, - 192, 95, 87, 240, 26, 147, 2, 161, 95, 87, 236, 154, 147, 2, 161, 95, 87, - 236, 62, 237, 24, 231, 26, 237, 24, 240, 58, 31, 243, 11, 253, 174, 31, - 236, 209, 253, 174, 31, 243, 11, 147, 128, 95, 87, 31, 236, 209, 147, - 128, 95, 87, 31, 249, 38, 31, 249, 43, 29, 243, 12, 29, 240, 68, 29, 240, - 123, 29, 236, 196, 240, 37, 29, 53, 235, 47, 29, 248, 51, 235, 47, 29, - 236, 219, 235, 47, 29, 238, 113, 29, 242, 235, 238, 84, 243, 12, 238, 84, - 240, 68, 238, 84, 240, 123, 238, 84, 53, 235, 47, 38, 242, 234, 40, 242, - 234, 92, 242, 234, 88, 242, 234, 234, 94, 239, 139, 244, 38, 239, 78, - 240, 3, 59, 253, 144, 38, 234, 15, 45, 59, 253, 144, 45, 38, 234, 15, - 248, 86, 161, 242, 67, 161, 244, 38, 248, 86, 161, 241, 114, 238, 203, - 45, 59, 253, 144, 45, 38, 234, 15, 236, 176, 244, 44, 235, 92, 236, 178, - 244, 44, 235, 92, 240, 52, 236, 203, 253, 174, 236, 180, 255, 24, 240, - 52, 235, 144, 240, 52, 236, 203, 147, 128, 95, 87, 236, 180, 255, 24, - 240, 52, 236, 203, 128, 95, 87, 236, 209, 253, 174, 243, 11, 253, 174, - 235, 103, 236, 35, 235, 193, 239, 130, 232, 178, 253, 49, 246, 104, 252, - 34, 38, 185, 2, 248, 113, 38, 235, 46, 242, 238, 238, 56, 248, 91, 242, - 238, 238, 56, 253, 227, 242, 238, 231, 88, 242, 238, 240, 58, 238, 76, - 235, 47, 53, 235, 47, 248, 135, 235, 47, 236, 196, 240, 123, 238, 168, - 40, 240, 52, 240, 173, 234, 21, 236, 170, 38, 240, 52, 240, 173, 234, 21, - 236, 170, 40, 234, 21, 236, 170, 38, 234, 21, 236, 170, 224, 242, 219, - 238, 113, 242, 225, 238, 56, 253, 227, 242, 225, 238, 56, 248, 91, 45, - 238, 87, 45, 235, 84, 45, 231, 88, 45, 240, 58, 234, 234, 95, 19, 236, - 200, 87, 235, 44, 2, 248, 40, 232, 68, 2, 248, 40, 249, 194, 248, 168, - 234, 3, 249, 194, 248, 168, 231, 85, 235, 44, 95, 153, 128, 231, 85, 232, - 68, 95, 153, 128, 234, 3, 95, 153, 128, 234, 3, 95, 153, 128, 231, 85, - 95, 153, 128, 235, 107, 95, 153, 128, 235, 111, 248, 86, 161, 239, 165, - 128, 240, 32, 248, 86, 161, 239, 209, 128, 240, 32, 161, 31, 243, 11, - 147, 128, 95, 87, 161, 31, 236, 209, 147, 128, 95, 87, 31, 243, 11, 147, - 128, 161, 95, 87, 31, 236, 209, 147, 128, 161, 95, 87, 235, 44, 253, 230, - 161, 234, 5, 87, 232, 68, 253, 230, 161, 234, 5, 87, 236, 176, 253, 230, - 161, 234, 5, 87, 236, 178, 253, 230, 161, 234, 5, 87, 161, 240, 52, 236, - 203, 253, 174, 248, 86, 161, 238, 131, 255, 24, 240, 52, 235, 144, 161, - 240, 52, 236, 203, 147, 128, 95, 87, 248, 86, 161, 238, 131, 255, 24, - 240, 52, 236, 203, 128, 240, 32, 59, 235, 69, 239, 136, 163, 235, 69, 88, - 38, 236, 159, 235, 69, 92, 38, 236, 159, 235, 69, 238, 68, 147, 2, 183, - 163, 108, 238, 68, 147, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, - 108, 3, 238, 68, 147, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, 108, - 238, 68, 147, 2, 53, 48, 238, 68, 147, 2, 236, 163, 3, 238, 68, 147, 2, - 236, 163, 238, 68, 147, 2, 235, 50, 238, 68, 147, 2, 171, 163, 237, 45, - 236, 180, 2, 183, 163, 108, 236, 180, 2, 59, 253, 144, 255, 31, 253, 165, - 147, 163, 108, 3, 236, 180, 2, 59, 253, 144, 255, 31, 253, 165, 147, 163, - 108, 236, 180, 2, 236, 163, 3, 236, 180, 2, 236, 163, 255, 97, 126, 254, - 52, 233, 217, 237, 105, 52, 237, 149, 56, 241, 168, 88, 234, 7, 92, 234, - 7, 233, 226, 232, 193, 248, 103, 242, 224, 40, 236, 251, 38, 236, 251, - 40, 240, 175, 38, 240, 175, 240, 17, 38, 243, 55, 240, 17, 40, 243, 55, - 253, 159, 38, 243, 55, 253, 159, 40, 243, 55, 224, 161, 52, 31, 236, 231, - 248, 113, 238, 4, 239, 187, 235, 113, 236, 87, 237, 239, 234, 30, 238, - 42, 238, 59, 243, 245, 147, 237, 181, 52, 205, 161, 52, 240, 252, 234, - 39, 253, 159, 40, 238, 67, 253, 159, 38, 238, 67, 240, 17, 40, 238, 67, - 240, 17, 38, 238, 67, 253, 159, 137, 235, 60, 240, 17, 137, 235, 60, 241, - 118, 242, 118, 88, 235, 76, 239, 7, 171, 163, 244, 191, 242, 42, 251, - 145, 243, 169, 153, 253, 145, 225, 255, 113, 255, 22, 134, 236, 89, 248, - 92, 236, 45, 231, 87, 185, 104, 231, 36, 185, 104, 243, 169, 153, 253, - 145, 242, 220, 239, 6, 242, 233, 231, 121, 254, 51, 229, 64, 236, 125, - 247, 156, 239, 175, 235, 205, 239, 154, 239, 31, 242, 141, 242, 116, 232, - 124, 232, 125, 141, 142, 12, 239, 96, 141, 142, 12, 242, 127, 243, 43, - 141, 142, 12, 248, 62, 240, 32, 141, 142, 12, 248, 62, 238, 177, 141, - 142, 12, 248, 62, 236, 164, 141, 142, 12, 248, 62, 248, 115, 141, 142, - 12, 248, 62, 238, 51, 141, 142, 12, 218, 240, 103, 141, 142, 12, 218, - 248, 115, 141, 142, 12, 247, 94, 125, 141, 142, 12, 235, 177, 125, 141, - 142, 12, 248, 62, 240, 37, 141, 142, 12, 248, 62, 234, 25, 141, 142, 12, - 248, 62, 234, 3, 141, 142, 12, 248, 62, 231, 85, 141, 142, 12, 139, 243, - 79, 141, 142, 12, 77, 243, 79, 141, 142, 12, 248, 62, 139, 56, 141, 142, - 12, 248, 62, 77, 56, 141, 142, 12, 218, 234, 25, 141, 142, 12, 92, 248, - 84, 235, 50, 141, 142, 12, 243, 92, 240, 103, 141, 142, 12, 248, 62, 92, - 240, 130, 141, 142, 12, 248, 62, 240, 28, 141, 142, 12, 92, 248, 84, 248, - 115, 141, 142, 12, 226, 226, 243, 79, 141, 142, 12, 248, 62, 226, 226, - 56, 141, 142, 12, 88, 248, 84, 236, 163, 141, 142, 12, 254, 56, 240, 103, - 141, 142, 12, 248, 62, 88, 240, 130, 141, 142, 12, 248, 62, 250, 189, - 141, 142, 12, 88, 248, 84, 248, 115, 141, 142, 12, 235, 45, 243, 79, 141, - 142, 12, 248, 62, 235, 45, 56, 141, 142, 12, 243, 249, 235, 50, 141, 142, - 12, 243, 92, 235, 50, 141, 142, 12, 238, 76, 235, 50, 141, 142, 12, 254, - 104, 235, 50, 141, 142, 12, 218, 235, 50, 141, 142, 12, 88, 248, 247, - 248, 115, 141, 142, 12, 243, 249, 243, 43, 141, 142, 12, 218, 242, 229, - 141, 142, 12, 248, 62, 240, 24, 141, 142, 12, 88, 248, 84, 175, 141, 142, - 12, 254, 56, 175, 141, 142, 12, 248, 135, 175, 141, 142, 12, 254, 104, - 175, 141, 142, 12, 218, 175, 141, 142, 12, 92, 248, 247, 240, 103, 141, - 142, 12, 40, 248, 247, 240, 103, 141, 142, 12, 242, 219, 175, 141, 142, - 12, 232, 68, 175, 141, 142, 12, 242, 244, 125, 141, 142, 12, 254, 56, - 169, 141, 142, 12, 242, 207, 141, 142, 12, 247, 122, 169, 141, 142, 12, - 236, 99, 235, 50, 141, 142, 12, 248, 62, 161, 240, 32, 141, 142, 12, 248, - 62, 236, 85, 141, 142, 12, 92, 243, 25, 169, 141, 142, 12, 88, 243, 25, - 169, 141, 142, 12, 242, 237, 141, 142, 12, 248, 73, 141, 142, 12, 240, - 20, 141, 142, 12, 194, 235, 50, 141, 142, 12, 238, 57, 235, 50, 141, 142, - 12, 248, 42, 235, 50, 141, 142, 12, 211, 235, 50, 141, 142, 12, 240, 22, - 161, 243, 53, 69, 38, 185, 2, 235, 45, 240, 126, 56, 235, 0, 248, 35, - 248, 92, 250, 114, 91, 59, 248, 41, 2, 240, 1, 248, 40, 235, 128, 91, - 234, 104, 235, 157, 91, 231, 128, 235, 157, 91, 237, 8, 91, 233, 126, 91, - 64, 31, 2, 240, 46, 59, 242, 224, 245, 82, 91, 233, 68, 254, 105, 91, - 251, 51, 91, 29, 163, 253, 144, 2, 242, 23, 29, 236, 152, 242, 236, 240, - 129, 218, 2, 236, 64, 56, 252, 252, 91, 234, 224, 91, 234, 201, 91, 226, - 236, 241, 143, 91, 226, 236, 241, 209, 91, 226, 227, 91, 226, 230, 91, - 240, 169, 239, 33, 12, 248, 38, 111, 227, 7, 91, 141, 142, 12, 243, 43, - 238, 176, 235, 95, 254, 105, 91, 237, 242, 243, 240, 252, 16, 243, 240, - 246, 254, 240, 218, 91, 245, 23, 240, 218, 91, 40, 233, 56, 189, 90, 40, - 233, 56, 234, 10, 40, 233, 56, 168, 90, 38, 233, 56, 189, 90, 38, 233, - 56, 234, 10, 38, 233, 56, 168, 90, 40, 31, 238, 52, 189, 238, 67, 40, 31, - 238, 52, 234, 10, 40, 31, 238, 52, 168, 238, 67, 38, 31, 238, 52, 189, - 238, 67, 38, 31, 238, 52, 234, 10, 38, 31, 238, 52, 168, 238, 67, 40, - 242, 225, 238, 52, 189, 90, 40, 242, 225, 238, 52, 240, 1, 240, 119, 40, - 242, 225, 238, 52, 168, 90, 242, 225, 238, 52, 234, 10, 38, 242, 225, - 238, 52, 189, 90, 38, 242, 225, 238, 52, 240, 1, 240, 119, 38, 242, 225, - 238, 52, 168, 90, 236, 167, 234, 10, 163, 248, 41, 234, 10, 189, 40, 128, - 168, 38, 242, 225, 238, 52, 236, 210, 189, 38, 128, 168, 40, 242, 225, - 238, 52, 236, 210, 235, 112, 249, 3, 235, 112, 238, 128, 253, 159, 31, - 104, 240, 17, 31, 104, 240, 17, 31, 238, 52, 248, 59, 253, 159, 31, 104, - 25, 12, 238, 128, 40, 59, 66, 242, 224, 38, 59, 66, 242, 224, 163, 248, - 183, 239, 119, 163, 248, 183, 239, 120, 163, 248, 183, 239, 121, 163, - 248, 183, 239, 122, 235, 58, 12, 136, 59, 19, 253, 159, 225, 235, 58, 12, - 136, 59, 19, 240, 17, 225, 235, 58, 12, 136, 59, 2, 238, 51, 235, 58, 12, - 136, 92, 19, 163, 2, 238, 51, 235, 58, 12, 136, 88, 19, 163, 2, 238, 51, - 235, 58, 12, 136, 59, 2, 235, 46, 235, 58, 12, 136, 92, 19, 163, 2, 235, - 46, 235, 58, 12, 136, 88, 19, 163, 2, 235, 46, 235, 58, 12, 136, 59, 19, - 243, 80, 235, 58, 12, 136, 92, 19, 163, 2, 243, 80, 235, 58, 12, 136, 88, - 19, 163, 2, 243, 80, 235, 58, 12, 136, 92, 19, 233, 50, 235, 58, 12, 136, - 88, 19, 233, 50, 235, 58, 12, 136, 59, 19, 253, 159, 242, 220, 235, 58, - 12, 136, 59, 19, 240, 17, 242, 220, 31, 243, 94, 242, 80, 91, 245, 81, - 91, 59, 248, 41, 234, 10, 236, 183, 239, 255, 236, 183, 183, 248, 59, - 242, 108, 236, 183, 242, 215, 248, 59, 243, 66, 236, 183, 183, 248, 59, - 171, 239, 194, 236, 183, 171, 240, 228, 248, 59, 243, 66, 236, 183, 171, - 240, 228, 239, 103, 236, 183, 237, 49, 236, 183, 234, 82, 236, 183, 234, - 62, 243, 168, 239, 85, 245, 94, 12, 28, 246, 193, 12, 28, 243, 124, 147, - 237, 173, 12, 28, 243, 124, 147, 244, 28, 12, 28, 253, 165, 147, 244, 28, - 12, 28, 253, 165, 147, 232, 62, 12, 28, 237, 150, 12, 28, 232, 103, 12, - 28, 244, 215, 12, 28, 234, 96, 12, 28, 163, 233, 107, 12, 28, 248, 41, - 243, 171, 12, 28, 59, 233, 107, 12, 28, 248, 38, 243, 171, 12, 28, 237, - 84, 238, 211, 12, 28, 244, 11, 248, 235, 12, 28, 244, 11, 253, 247, 12, - 28, 250, 185, 251, 197, 238, 183, 12, 28, 240, 113, 238, 110, 127, 12, - 28, 240, 113, 238, 110, 111, 12, 28, 240, 113, 238, 110, 166, 12, 28, - 240, 113, 238, 110, 177, 12, 28, 236, 146, 232, 103, 12, 28, 233, 250, - 245, 224, 12, 28, 253, 165, 147, 233, 44, 240, 13, 12, 28, 239, 16, 12, - 28, 253, 165, 147, 239, 132, 12, 28, 233, 249, 12, 28, 238, 183, 12, 28, - 250, 244, 234, 6, 12, 28, 245, 128, 234, 6, 12, 28, 242, 79, 234, 6, 12, - 28, 252, 253, 234, 6, 12, 28, 240, 15, 12, 28, 239, 39, 244, 224, 91, - 248, 35, 248, 92, 12, 28, 237, 219, 12, 28, 241, 81, 248, 38, 111, 12, - 28, 235, 5, 248, 38, 111, 253, 207, 90, 253, 207, 241, 50, 253, 207, 243, - 175, 253, 207, 236, 145, 243, 175, 253, 207, 250, 115, 239, 15, 253, 207, - 254, 146, 248, 139, 253, 207, 241, 36, 250, 102, 229, 67, 253, 207, 241, - 9, 147, 240, 162, 253, 207, 242, 235, 253, 207, 237, 97, 238, 158, 239, - 147, 253, 207, 45, 234, 25, 29, 26, 127, 29, 26, 111, 29, 26, 166, 29, - 26, 177, 29, 26, 176, 29, 26, 187, 29, 26, 203, 29, 26, 195, 29, 26, 202, - 29, 61, 248, 53, 29, 61, 238, 91, 29, 61, 238, 97, 29, 61, 235, 85, 29, - 61, 235, 82, 29, 61, 236, 207, 29, 61, 236, 202, 29, 61, 234, 22, 29, 61, - 235, 81, 29, 61, 235, 83, 29, 61, 238, 77, 82, 26, 127, 82, 26, 111, 82, - 26, 166, 82, 26, 177, 82, 26, 176, 82, 26, 187, 82, 26, 203, 82, 26, 195, - 82, 26, 202, 82, 61, 248, 53, 82, 61, 238, 91, 82, 61, 238, 97, 82, 61, - 235, 85, 82, 61, 235, 82, 82, 61, 236, 207, 82, 61, 236, 202, 82, 61, - 234, 22, 82, 61, 235, 81, 82, 61, 235, 83, 82, 61, 238, 77, 26, 253, 125, - 248, 37, 208, 26, 171, 248, 37, 208, 26, 204, 248, 37, 208, 26, 248, 58, - 248, 37, 208, 26, 248, 48, 248, 37, 208, 26, 254, 31, 248, 37, 208, 26, - 243, 31, 248, 37, 208, 26, 242, 254, 248, 37, 208, 26, 248, 173, 248, 37, - 208, 61, 253, 219, 248, 37, 208, 61, 241, 93, 248, 37, 208, 61, 240, 251, - 248, 37, 208, 61, 238, 26, 248, 37, 208, 61, 237, 161, 248, 37, 208, 61, - 239, 70, 248, 37, 208, 61, 238, 216, 248, 37, 208, 61, 236, 100, 248, 37, - 208, 61, 237, 147, 248, 37, 208, 61, 237, 222, 248, 37, 208, 61, 240, 48, - 248, 37, 208, 82, 8, 3, 1, 67, 82, 8, 3, 1, 217, 82, 8, 3, 1, 255, 18, - 82, 8, 3, 1, 209, 82, 8, 3, 1, 72, 82, 8, 3, 1, 255, 19, 82, 8, 3, 1, - 210, 82, 8, 3, 1, 192, 82, 8, 3, 1, 71, 82, 8, 3, 1, 221, 82, 8, 3, 1, - 255, 15, 82, 8, 3, 1, 162, 82, 8, 3, 1, 173, 82, 8, 3, 1, 197, 82, 8, 3, - 1, 73, 82, 8, 3, 1, 223, 82, 8, 3, 1, 255, 20, 82, 8, 3, 1, 144, 82, 8, - 3, 1, 193, 82, 8, 3, 1, 214, 82, 8, 3, 1, 79, 82, 8, 3, 1, 179, 82, 8, 3, - 1, 255, 16, 82, 8, 3, 1, 206, 82, 8, 3, 1, 255, 14, 82, 8, 3, 1, 255, 17, - 29, 8, 5, 1, 67, 29, 8, 5, 1, 217, 29, 8, 5, 1, 255, 18, 29, 8, 5, 1, - 209, 29, 8, 5, 1, 72, 29, 8, 5, 1, 255, 19, 29, 8, 5, 1, 210, 29, 8, 5, - 1, 192, 29, 8, 5, 1, 71, 29, 8, 5, 1, 221, 29, 8, 5, 1, 255, 15, 29, 8, + 202, 107, 99, 255, 1, 107, 99, 240, 174, 152, 1, 240, 127, 152, 1, 240, + 176, 231, 34, 152, 1, 240, 176, 230, 159, 152, 1, 237, 222, 152, 1, 251, + 226, 152, 1, 231, 217, 230, 159, 152, 1, 237, 39, 152, 1, 250, 116, 152, + 1, 87, 152, 1, 230, 39, 231, 34, 152, 1, 230, 39, 230, 159, 152, 1, 237, + 138, 152, 1, 253, 4, 152, 1, 235, 207, 152, 1, 236, 18, 231, 34, 152, 1, + 248, 22, 230, 159, 152, 1, 236, 18, 230, 159, 152, 1, 248, 22, 231, 34, + 152, 1, 238, 175, 152, 1, 227, 167, 152, 1, 239, 168, 239, 187, 152, 1, + 239, 168, 239, 147, 152, 1, 228, 82, 152, 1, 231, 217, 231, 34, 152, 1, + 246, 68, 231, 34, 152, 1, 73, 152, 1, 246, 68, 230, 159, 152, 248, 243, + 152, 33, 21, 67, 152, 33, 21, 239, 95, 240, 254, 152, 33, 21, 255, 104, + 152, 33, 21, 255, 15, 152, 33, 21, 71, 152, 33, 21, 241, 209, 152, 33, + 21, 228, 7, 152, 33, 21, 227, 111, 152, 33, 21, 79, 152, 33, 21, 228, + 238, 152, 33, 21, 239, 95, 240, 119, 152, 232, 172, 21, 239, 167, 152, + 232, 172, 21, 237, 39, 152, 33, 21, 72, 152, 33, 21, 249, 13, 152, 33, + 21, 73, 152, 33, 21, 254, 128, 152, 33, 21, 255, 55, 152, 240, 128, 240, + 41, 152, 188, 239, 95, 248, 255, 152, 188, 239, 95, 230, 38, 152, 188, + 239, 95, 230, 15, 152, 188, 239, 95, 252, 143, 152, 252, 162, 69, 152, + 237, 193, 152, 26, 227, 80, 152, 26, 127, 152, 26, 111, 152, 26, 166, + 152, 26, 177, 152, 26, 176, 152, 26, 187, 152, 26, 203, 152, 26, 195, + 152, 26, 202, 152, 246, 68, 237, 138, 152, 246, 68, 238, 175, 47, 4, 236, + 218, 47, 158, 247, 33, 227, 179, 238, 243, 229, 154, 67, 47, 158, 247, + 33, 227, 179, 238, 243, 255, 109, 234, 95, 253, 93, 222, 47, 158, 247, + 33, 227, 179, 238, 243, 255, 109, 247, 33, 229, 139, 222, 47, 158, 54, + 227, 179, 238, 243, 239, 42, 222, 47, 158, 251, 236, 227, 179, 238, 243, + 232, 151, 222, 47, 158, 252, 151, 227, 179, 238, 243, 236, 12, 232, 145, + 222, 47, 158, 227, 179, 238, 243, 229, 139, 232, 145, 222, 47, 158, 233, + 221, 232, 144, 47, 158, 252, 220, 227, 179, 238, 242, 47, 158, 253, 16, + 232, 98, 227, 179, 238, 242, 47, 158, 241, 146, 229, 138, 47, 158, 250, + 234, 229, 139, 252, 219, 47, 158, 232, 144, 47, 158, 237, 42, 232, 144, + 47, 158, 229, 139, 232, 144, 47, 158, 237, 42, 229, 139, 232, 144, 47, + 158, 234, 110, 252, 70, 231, 173, 232, 144, 47, 158, 234, 152, 247, 52, + 232, 144, 47, 158, 252, 151, 255, 113, 234, 46, 239, 41, 183, 252, 165, + 47, 158, 247, 33, 229, 138, 47, 239, 161, 21, 252, 94, 234, 45, 47, 239, + 161, 21, 239, 218, 234, 45, 47, 254, 156, 21, 232, 149, 247, 176, 255, + 114, 234, 45, 47, 254, 156, 21, 255, 111, 236, 142, 47, 254, 156, 21, + 233, 204, 229, 136, 47, 21, 234, 205, 250, 127, 247, 175, 47, 21, 234, + 205, 250, 127, 247, 74, 47, 21, 234, 205, 250, 127, 247, 34, 47, 21, 234, + 205, 238, 84, 247, 175, 47, 21, 234, 205, 238, 84, 247, 74, 47, 21, 234, + 205, 250, 127, 234, 205, 238, 83, 47, 26, 227, 80, 47, 26, 127, 47, 26, + 111, 47, 26, 166, 47, 26, 177, 47, 26, 176, 47, 26, 187, 47, 26, 203, 47, + 26, 195, 47, 26, 202, 47, 26, 137, 127, 47, 26, 137, 111, 47, 26, 137, + 166, 47, 26, 137, 177, 47, 26, 137, 176, 47, 26, 137, 187, 47, 26, 137, + 203, 47, 26, 137, 195, 47, 26, 137, 202, 47, 26, 137, 227, 80, 47, 158, + 252, 222, 234, 45, 47, 158, 237, 237, 252, 180, 237, 49, 227, 29, 47, + 158, 252, 151, 255, 113, 234, 46, 252, 181, 238, 208, 252, 165, 47, 158, + 237, 237, 252, 180, 232, 150, 234, 45, 47, 158, 252, 76, 238, 242, 47, + 158, 229, 149, 255, 110, 47, 158, 247, 27, 234, 46, 247, 0, 47, 158, 247, + 27, 234, 46, 247, 6, 47, 158, 255, 3, 240, 187, 247, 0, 47, 158, 255, 3, + 240, 187, 247, 6, 47, 21, 227, 228, 229, 137, 47, 21, 239, 72, 229, 137, + 47, 1, 201, 47, 1, 240, 194, 47, 1, 247, 208, 47, 1, 247, 115, 47, 1, + 237, 242, 47, 1, 252, 176, 47, 1, 252, 96, 47, 1, 241, 107, 47, 1, 237, + 57, 47, 1, 229, 130, 47, 1, 229, 120, 47, 1, 251, 41, 47, 1, 251, 26, 47, + 1, 237, 150, 47, 1, 230, 182, 47, 1, 230, 87, 47, 1, 251, 102, 47, 1, + 250, 208, 47, 1, 238, 91, 47, 1, 236, 142, 47, 1, 236, 33, 47, 1, 253, + 166, 47, 1, 253, 46, 47, 1, 222, 47, 1, 229, 148, 47, 1, 229, 141, 47, 1, + 249, 47, 47, 1, 249, 43, 47, 1, 228, 143, 47, 1, 227, 76, 47, 1, 227, + 102, 47, 1, 255, 116, 47, 1, 216, 47, 1, 234, 236, 47, 1, 240, 41, 47, 1, + 232, 147, 47, 1, 231, 163, 47, 1, 234, 8, 47, 1, 219, 47, 1, 67, 47, 1, + 240, 95, 47, 1, 248, 45, 234, 236, 47, 33, 21, 255, 104, 47, 33, 21, 71, + 47, 33, 21, 241, 209, 47, 33, 21, 79, 47, 33, 21, 228, 238, 47, 33, 21, + 165, 144, 47, 33, 21, 165, 234, 73, 47, 33, 21, 165, 162, 47, 33, 21, + 165, 239, 173, 47, 33, 21, 72, 47, 33, 21, 249, 22, 47, 33, 21, 73, 47, + 33, 21, 236, 202, 47, 21, 234, 96, 231, 63, 237, 243, 234, 91, 47, 21, + 234, 95, 253, 92, 47, 33, 21, 224, 71, 47, 33, 21, 224, 241, 209, 47, 21, + 237, 49, 227, 30, 238, 90, 251, 102, 47, 21, 231, 225, 240, 0, 47, 158, + 246, 238, 47, 158, 236, 125, 47, 21, 240, 1, 234, 45, 47, 21, 227, 232, + 234, 45, 47, 21, 240, 2, 229, 149, 252, 165, 47, 21, 239, 43, 252, 165, + 47, 21, 247, 36, 252, 166, 234, 150, 47, 21, 247, 36, 239, 35, 234, 150, + 47, 213, 1, 201, 47, 213, 1, 240, 194, 47, 213, 1, 247, 208, 47, 213, 1, + 247, 115, 47, 213, 1, 237, 242, 47, 213, 1, 252, 176, 47, 213, 1, 252, + 96, 47, 213, 1, 241, 107, 47, 213, 1, 237, 57, 47, 213, 1, 229, 130, 47, + 213, 1, 229, 120, 47, 213, 1, 251, 41, 47, 213, 1, 251, 26, 47, 213, 1, + 237, 150, 47, 213, 1, 230, 182, 47, 213, 1, 230, 87, 47, 213, 1, 251, + 102, 47, 213, 1, 250, 208, 47, 213, 1, 238, 91, 47, 213, 1, 236, 142, 47, + 213, 1, 236, 33, 47, 213, 1, 253, 166, 47, 213, 1, 253, 46, 47, 213, 1, + 222, 47, 213, 1, 229, 148, 47, 213, 1, 229, 141, 47, 213, 1, 249, 47, 47, + 213, 1, 249, 43, 47, 213, 1, 228, 143, 47, 213, 1, 227, 76, 47, 213, 1, + 227, 102, 47, 213, 1, 255, 116, 47, 213, 1, 216, 47, 213, 1, 234, 236, + 47, 213, 1, 240, 41, 47, 213, 1, 232, 147, 47, 213, 1, 231, 163, 47, 213, + 1, 234, 8, 47, 213, 1, 219, 47, 213, 1, 67, 47, 213, 1, 240, 95, 47, 213, + 1, 248, 45, 228, 143, 47, 213, 1, 248, 45, 216, 47, 213, 1, 248, 45, 234, + 236, 47, 240, 93, 234, 44, 240, 194, 47, 240, 93, 234, 44, 240, 195, 252, + 181, 238, 208, 252, 165, 47, 252, 157, 21, 96, 253, 87, 47, 252, 157, 21, + 136, 253, 87, 47, 252, 157, 21, 252, 158, 230, 130, 47, 252, 157, 21, + 233, 220, 255, 115, 47, 12, 249, 78, 252, 217, 47, 12, 234, 204, 234, 97, + 47, 12, 236, 135, 247, 174, 47, 12, 234, 204, 234, 98, 234, 152, 247, 51, + 47, 12, 236, 12, 236, 142, 47, 12, 237, 125, 252, 217, 47, 12, 237, 125, + 252, 218, 237, 42, 255, 112, 47, 12, 237, 125, 252, 218, 247, 35, 255, + 112, 47, 12, 237, 125, 252, 218, 252, 181, 255, 112, 47, 21, 234, 205, + 238, 84, 247, 34, 47, 158, 252, 221, 232, 98, 247, 97, 238, 243, 234, + 151, 47, 158, 238, 177, 227, 179, 247, 97, 238, 243, 234, 151, 131, 1, + 201, 131, 1, 240, 194, 131, 1, 247, 208, 131, 1, 247, 115, 131, 1, 237, + 242, 131, 1, 252, 176, 131, 1, 252, 96, 131, 1, 241, 107, 131, 1, 241, + 90, 131, 1, 237, 57, 131, 1, 237, 140, 131, 1, 229, 130, 131, 1, 229, + 120, 131, 1, 251, 41, 131, 1, 251, 26, 131, 1, 237, 150, 131, 1, 230, + 182, 131, 1, 230, 87, 131, 1, 251, 102, 131, 1, 250, 208, 131, 1, 238, + 91, 131, 1, 236, 142, 131, 1, 236, 33, 131, 1, 253, 166, 131, 1, 253, 46, + 131, 1, 222, 131, 1, 216, 131, 1, 234, 236, 131, 1, 240, 41, 131, 1, 228, + 143, 131, 1, 234, 8, 131, 1, 219, 131, 1, 239, 172, 131, 1, 67, 131, 1, + 71, 131, 1, 241, 209, 131, 1, 79, 131, 1, 228, 238, 131, 1, 72, 131, 1, + 73, 131, 1, 254, 144, 131, 33, 21, 255, 104, 131, 33, 21, 71, 131, 33, + 21, 241, 209, 131, 33, 21, 79, 131, 33, 21, 228, 238, 131, 33, 21, 72, + 131, 33, 21, 255, 55, 131, 21, 254, 236, 131, 21, 53, 46, 131, 21, 228, + 177, 131, 21, 228, 182, 131, 26, 227, 80, 131, 26, 127, 131, 26, 111, + 131, 26, 166, 131, 26, 177, 131, 26, 176, 131, 26, 187, 131, 26, 203, + 131, 26, 195, 131, 26, 202, 131, 21, 239, 179, 233, 195, 131, 21, 233, + 195, 131, 12, 239, 164, 131, 12, 251, 209, 131, 12, 255, 67, 131, 12, + 247, 164, 131, 1, 232, 147, 131, 1, 231, 163, 131, 1, 165, 144, 131, 1, + 165, 234, 73, 131, 1, 165, 162, 131, 1, 165, 239, 173, 131, 33, 21, 165, + 144, 131, 33, 21, 165, 234, 73, 131, 33, 21, 165, 162, 131, 33, 21, 165, + 239, 173, 75, 5, 1, 255, 8, 75, 5, 1, 253, 148, 75, 5, 1, 247, 194, 75, + 5, 1, 250, 105, 75, 5, 1, 248, 234, 75, 5, 1, 228, 184, 75, 5, 1, 227, + 83, 75, 5, 1, 230, 157, 75, 5, 1, 241, 192, 75, 5, 1, 240, 254, 75, 5, 1, + 240, 13, 75, 5, 1, 239, 81, 75, 5, 1, 238, 71, 75, 5, 1, 236, 211, 75, 5, + 1, 236, 120, 75, 5, 1, 227, 72, 75, 5, 1, 234, 227, 75, 5, 1, 233, 237, + 75, 5, 1, 230, 151, 75, 5, 1, 229, 21, 75, 5, 1, 236, 30, 75, 5, 1, 240, + 185, 75, 5, 1, 247, 109, 75, 5, 1, 235, 77, 75, 5, 1, 232, 102, 75, 5, 1, + 252, 57, 75, 5, 1, 252, 165, 75, 5, 1, 241, 80, 75, 5, 1, 252, 7, 75, 5, + 1, 252, 84, 75, 5, 1, 228, 52, 75, 5, 1, 241, 89, 75, 5, 1, 246, 248, 75, + 5, 1, 246, 210, 75, 5, 1, 246, 166, 75, 5, 1, 228, 112, 75, 5, 1, 246, + 227, 75, 5, 1, 246, 65, 75, 1, 255, 8, 75, 1, 253, 148, 75, 1, 247, 194, + 75, 1, 250, 105, 75, 1, 248, 234, 75, 1, 228, 184, 75, 1, 227, 83, 75, 1, + 230, 157, 75, 1, 241, 192, 75, 1, 240, 254, 75, 1, 240, 13, 75, 1, 239, + 81, 75, 1, 238, 71, 75, 1, 236, 211, 75, 1, 236, 120, 75, 1, 227, 72, 75, + 1, 234, 227, 75, 1, 233, 237, 75, 1, 230, 151, 75, 1, 229, 21, 75, 1, + 236, 30, 75, 1, 240, 185, 75, 1, 247, 109, 75, 1, 235, 77, 75, 1, 232, + 102, 75, 1, 252, 57, 75, 1, 252, 165, 75, 1, 241, 80, 75, 1, 252, 7, 75, + 1, 252, 84, 75, 1, 228, 52, 75, 1, 241, 89, 75, 1, 246, 248, 75, 1, 246, + 210, 75, 1, 246, 166, 75, 1, 228, 112, 75, 1, 246, 227, 75, 1, 246, 65, + 75, 1, 248, 81, 75, 1, 227, 169, 75, 1, 248, 244, 75, 1, 205, 247, 194, + 75, 1, 255, 51, 75, 236, 118, 232, 166, 49, 1, 75, 238, 71, 23, 102, 240, + 149, 23, 102, 231, 157, 23, 102, 237, 203, 23, 102, 230, 4, 23, 102, 231, + 152, 23, 102, 234, 140, 23, 102, 238, 218, 23, 102, 235, 255, 23, 102, + 231, 155, 23, 102, 232, 24, 23, 102, 231, 153, 23, 102, 241, 226, 23, + 102, 252, 11, 23, 102, 231, 160, 23, 102, 252, 61, 23, 102, 240, 177, 23, + 102, 230, 55, 23, 102, 236, 23, 23, 102, 246, 164, 23, 102, 237, 200, 23, + 102, 231, 156, 23, 102, 237, 195, 23, 102, 237, 198, 23, 102, 230, 3, 23, + 102, 234, 131, 23, 102, 231, 154, 23, 102, 234, 139, 23, 102, 240, 241, + 23, 102, 238, 213, 23, 102, 240, 244, 23, 102, 235, 251, 23, 102, 235, + 250, 23, 102, 235, 240, 23, 102, 235, 247, 23, 102, 235, 245, 23, 102, + 235, 243, 23, 102, 235, 244, 23, 102, 235, 242, 23, 102, 235, 246, 23, + 102, 235, 253, 23, 102, 235, 254, 23, 102, 235, 241, 23, 102, 235, 249, + 23, 102, 240, 242, 23, 102, 240, 240, 23, 102, 232, 18, 23, 102, 232, 16, + 23, 102, 232, 9, 23, 102, 232, 12, 23, 102, 232, 17, 23, 102, 232, 14, + 23, 102, 232, 13, 23, 102, 232, 11, 23, 102, 232, 20, 23, 102, 232, 22, + 23, 102, 232, 23, 23, 102, 232, 19, 23, 102, 232, 10, 23, 102, 232, 15, + 23, 102, 232, 21, 23, 102, 252, 51, 23, 102, 252, 49, 23, 102, 252, 102, + 23, 102, 252, 100, 23, 102, 236, 123, 23, 102, 241, 222, 23, 102, 241, + 214, 23, 102, 241, 221, 23, 102, 241, 218, 23, 102, 241, 217, 23, 102, + 241, 220, 23, 102, 231, 158, 23, 102, 241, 224, 23, 102, 241, 225, 23, + 102, 241, 215, 23, 102, 241, 219, 23, 102, 227, 196, 23, 102, 252, 10, + 23, 102, 252, 52, 23, 102, 252, 50, 23, 102, 252, 103, 23, 102, 252, 101, + 23, 102, 252, 59, 23, 102, 252, 60, 23, 102, 252, 53, 23, 102, 252, 104, + 23, 102, 236, 22, 23, 102, 240, 243, 23, 102, 231, 159, 23, 102, 227, + 201, 23, 102, 248, 63, 23, 146, 248, 63, 23, 146, 67, 23, 146, 255, 75, + 23, 146, 216, 23, 146, 227, 248, 23, 146, 248, 213, 23, 146, 72, 23, 146, + 227, 204, 23, 146, 227, 211, 23, 146, 73, 23, 146, 228, 143, 23, 146, + 228, 140, 23, 146, 236, 234, 23, 146, 227, 167, 23, 146, 79, 23, 146, + 228, 106, 23, 146, 228, 112, 23, 146, 228, 92, 23, 146, 227, 142, 23, + 146, 248, 171, 23, 146, 227, 186, 23, 146, 71, 23, 146, 255, 108, 23, + 146, 255, 107, 23, 146, 228, 5, 23, 146, 228, 4, 23, 146, 248, 211, 23, + 146, 248, 210, 23, 146, 248, 212, 23, 146, 227, 203, 23, 146, 227, 202, + 23, 146, 236, 253, 23, 146, 236, 254, 23, 146, 236, 250, 23, 146, 236, + 252, 23, 146, 236, 251, 23, 146, 227, 164, 23, 146, 227, 163, 23, 146, + 227, 162, 23, 146, 227, 165, 23, 146, 227, 166, 23, 146, 229, 42, 23, + 146, 229, 41, 23, 146, 229, 40, 23, 146, 229, 38, 23, 146, 229, 39, 23, + 146, 227, 141, 23, 146, 227, 139, 23, 146, 227, 140, 23, 146, 227, 135, + 23, 146, 227, 136, 23, 146, 227, 137, 23, 146, 227, 138, 23, 146, 248, + 169, 23, 146, 248, 170, 23, 146, 227, 185, 23, 146, 245, 235, 23, 146, + 245, 229, 23, 146, 245, 231, 23, 146, 245, 230, 23, 146, 245, 232, 23, + 146, 245, 234, 23, 146, 254, 208, 23, 146, 254, 207, 23, 146, 254, 205, + 23, 146, 254, 206, 23, 146, 231, 161, 23, 114, 240, 149, 23, 114, 231, + 157, 23, 114, 240, 147, 23, 114, 237, 203, 23, 114, 237, 202, 23, 114, + 237, 201, 23, 114, 230, 4, 23, 114, 234, 140, 23, 114, 234, 136, 23, 114, + 234, 134, 23, 114, 234, 128, 23, 114, 234, 125, 23, 114, 234, 123, 23, + 114, 234, 129, 23, 114, 234, 139, 23, 114, 238, 218, 23, 114, 235, 255, + 23, 114, 235, 247, 23, 114, 232, 24, 23, 114, 231, 153, 23, 114, 241, + 226, 23, 114, 252, 11, 23, 114, 252, 61, 23, 114, 240, 177, 23, 114, 230, + 55, 23, 114, 236, 23, 23, 114, 246, 164, 23, 114, 240, 148, 23, 114, 240, + 146, 23, 114, 237, 200, 23, 114, 237, 195, 23, 114, 237, 197, 23, 114, + 237, 199, 23, 114, 237, 196, 23, 114, 230, 3, 23, 114, 230, 2, 23, 114, + 234, 135, 23, 114, 234, 131, 23, 114, 234, 122, 23, 114, 234, 121, 23, + 114, 231, 154, 23, 114, 234, 133, 23, 114, 234, 132, 23, 114, 234, 126, + 23, 114, 234, 127, 23, 114, 234, 138, 23, 114, 234, 124, 23, 114, 234, + 130, 23, 114, 234, 137, 23, 114, 234, 120, 23, 114, 238, 215, 23, 114, + 238, 212, 23, 114, 238, 213, 23, 114, 238, 211, 23, 114, 238, 210, 23, + 114, 238, 214, 23, 114, 238, 217, 23, 114, 238, 216, 23, 114, 240, 244, + 23, 114, 235, 248, 23, 114, 235, 249, 23, 114, 235, 252, 23, 114, 240, + 242, 23, 114, 232, 18, 23, 114, 232, 9, 23, 114, 232, 12, 23, 114, 232, + 14, 23, 114, 236, 123, 23, 114, 241, 222, 23, 114, 241, 216, 23, 114, + 231, 158, 23, 114, 241, 223, 23, 114, 227, 196, 23, 114, 227, 194, 23, + 114, 227, 195, 23, 114, 236, 22, 23, 114, 240, 243, 23, 114, 246, 162, + 23, 114, 246, 160, 23, 114, 246, 163, 23, 114, 246, 161, 23, 114, 227, + 201, 22, 4, 219, 22, 4, 246, 37, 22, 4, 246, 169, 22, 4, 246, 249, 22, 4, + 246, 198, 22, 4, 246, 210, 22, 4, 246, 67, 22, 4, 246, 66, 22, 4, 240, + 41, 22, 4, 239, 135, 22, 4, 239, 209, 22, 4, 240, 40, 22, 4, 239, 250, + 22, 4, 239, 254, 22, 4, 239, 167, 22, 4, 239, 122, 22, 4, 246, 177, 22, + 4, 246, 171, 22, 4, 246, 173, 22, 4, 246, 176, 22, 4, 246, 174, 22, 4, + 246, 175, 22, 4, 246, 172, 22, 4, 246, 170, 22, 4, 222, 22, 4, 238, 141, + 22, 4, 238, 226, 22, 4, 239, 104, 22, 4, 239, 31, 22, 4, 239, 40, 22, 4, + 238, 175, 22, 4, 238, 108, 22, 4, 230, 192, 22, 4, 230, 186, 22, 4, 230, + 188, 22, 4, 230, 191, 22, 4, 230, 189, 22, 4, 230, 190, 22, 4, 230, 187, + 22, 4, 230, 185, 22, 4, 234, 236, 22, 4, 234, 43, 22, 4, 234, 145, 22, 4, + 234, 233, 22, 4, 234, 189, 22, 4, 234, 203, 22, 4, 234, 91, 22, 4, 234, + 22, 22, 4, 234, 8, 22, 4, 231, 62, 22, 4, 232, 51, 22, 4, 234, 6, 22, 4, + 233, 193, 22, 4, 233, 203, 22, 4, 231, 216, 22, 4, 231, 12, 22, 4, 232, + 147, 22, 4, 232, 74, 22, 4, 232, 109, 22, 4, 232, 146, 22, 4, 232, 124, + 22, 4, 232, 126, 22, 4, 232, 101, 22, 4, 232, 64, 22, 4, 235, 92, 22, 4, + 235, 38, 22, 4, 235, 58, 22, 4, 235, 91, 22, 4, 235, 72, 22, 4, 235, 73, + 22, 4, 235, 49, 22, 4, 235, 48, 22, 4, 235, 1, 22, 4, 234, 253, 22, 4, + 235, 0, 22, 4, 234, 254, 22, 4, 234, 255, 22, 4, 235, 70, 22, 4, 235, 64, + 22, 4, 235, 66, 22, 4, 235, 69, 22, 4, 235, 67, 22, 4, 235, 68, 22, 4, + 235, 65, 22, 4, 235, 63, 22, 4, 235, 59, 22, 4, 235, 62, 22, 4, 235, 60, + 22, 4, 235, 61, 22, 4, 253, 166, 22, 4, 252, 217, 22, 4, 253, 43, 22, 4, + 253, 165, 22, 4, 253, 85, 22, 4, 253, 91, 22, 4, 253, 4, 22, 4, 252, 194, + 22, 4, 228, 233, 22, 4, 228, 159, 22, 4, 228, 193, 22, 4, 228, 232, 22, + 4, 228, 208, 22, 4, 228, 212, 22, 4, 228, 173, 22, 4, 228, 152, 22, 4, + 230, 182, 22, 4, 229, 106, 22, 4, 230, 15, 22, 4, 230, 180, 22, 4, 230, + 125, 22, 4, 230, 131, 22, 4, 87, 22, 4, 229, 85, 22, 4, 252, 176, 22, 4, + 251, 144, 22, 4, 252, 16, 22, 4, 252, 175, 22, 4, 252, 114, 22, 4, 252, + 119, 22, 4, 251, 226, 22, 4, 251, 122, 22, 4, 228, 54, 22, 4, 228, 30, + 22, 4, 228, 46, 22, 4, 228, 53, 22, 4, 228, 50, 22, 4, 228, 51, 22, 4, + 228, 37, 22, 4, 228, 36, 22, 4, 228, 26, 22, 4, 228, 22, 22, 4, 228, 25, + 22, 4, 228, 23, 22, 4, 228, 24, 22, 4, 238, 91, 22, 4, 237, 83, 22, 4, + 237, 209, 22, 4, 238, 89, 22, 4, 238, 7, 22, 4, 238, 9, 22, 4, 237, 138, + 22, 4, 237, 60, 22, 4, 237, 57, 22, 4, 237, 34, 22, 4, 237, 48, 22, 4, + 237, 56, 22, 4, 237, 52, 22, 4, 237, 53, 22, 4, 237, 39, 22, 4, 237, 27, + 22, 4, 247, 77, 67, 22, 4, 247, 77, 79, 22, 4, 247, 77, 71, 22, 4, 247, + 77, 255, 104, 22, 4, 247, 77, 249, 22, 22, 4, 247, 77, 72, 22, 4, 247, + 77, 73, 22, 4, 247, 77, 228, 143, 22, 4, 201, 22, 4, 240, 92, 22, 4, 240, + 168, 22, 4, 241, 10, 22, 4, 240, 218, 22, 4, 240, 219, 22, 4, 240, 127, + 22, 4, 240, 126, 22, 4, 240, 74, 22, 4, 240, 70, 22, 4, 240, 73, 22, 4, + 240, 71, 22, 4, 240, 72, 22, 4, 240, 66, 22, 4, 240, 60, 22, 4, 240, 62, + 22, 4, 240, 65, 22, 4, 240, 63, 22, 4, 240, 64, 22, 4, 240, 61, 22, 4, + 240, 59, 22, 4, 240, 55, 22, 4, 240, 58, 22, 4, 240, 56, 22, 4, 240, 57, + 22, 4, 228, 143, 22, 4, 228, 63, 22, 4, 228, 92, 22, 4, 228, 142, 22, 4, + 228, 109, 22, 4, 228, 112, 22, 4, 228, 82, 22, 4, 228, 81, 22, 4, 236, + 29, 67, 22, 4, 236, 29, 79, 22, 4, 236, 29, 71, 22, 4, 236, 29, 255, 104, + 22, 4, 236, 29, 249, 22, 22, 4, 236, 29, 72, 22, 4, 236, 29, 73, 22, 4, + 227, 102, 22, 4, 227, 19, 22, 4, 227, 41, 22, 4, 227, 101, 22, 4, 227, + 85, 22, 4, 227, 86, 22, 4, 227, 27, 22, 4, 227, 10, 22, 4, 227, 76, 22, + 4, 227, 57, 22, 4, 227, 63, 22, 4, 227, 75, 22, 4, 227, 67, 22, 4, 227, + 68, 22, 4, 227, 61, 22, 4, 227, 48, 22, 4, 216, 22, 4, 227, 142, 22, 4, + 227, 186, 22, 4, 228, 3, 22, 4, 227, 208, 22, 4, 227, 211, 22, 4, 227, + 167, 22, 4, 227, 161, 22, 4, 251, 102, 22, 4, 249, 70, 22, 4, 250, 202, + 22, 4, 251, 101, 22, 4, 250, 248, 22, 4, 251, 2, 22, 4, 250, 116, 22, 4, + 249, 56, 22, 4, 251, 41, 22, 4, 251, 12, 22, 4, 251, 24, 22, 4, 251, 40, + 22, 4, 251, 29, 22, 4, 251, 30, 22, 4, 251, 17, 22, 4, 251, 3, 22, 4, + 241, 107, 22, 4, 241, 36, 22, 4, 241, 86, 22, 4, 241, 106, 22, 4, 241, + 97, 22, 4, 241, 98, 22, 4, 241, 48, 22, 4, 241, 20, 22, 4, 247, 208, 22, + 4, 247, 32, 22, 4, 247, 96, 22, 4, 247, 207, 22, 4, 247, 169, 22, 4, 247, + 173, 22, 4, 247, 72, 22, 4, 247, 71, 22, 4, 247, 14, 22, 4, 247, 10, 22, + 4, 247, 13, 22, 4, 247, 11, 22, 4, 247, 12, 22, 4, 247, 150, 22, 4, 247, + 130, 22, 4, 247, 140, 22, 4, 247, 149, 22, 4, 247, 144, 22, 4, 247, 145, + 22, 4, 247, 134, 22, 4, 247, 119, 22, 4, 230, 87, 22, 4, 230, 24, 22, 4, + 230, 57, 22, 4, 230, 86, 22, 4, 230, 75, 22, 4, 230, 76, 22, 4, 230, 38, + 22, 4, 230, 18, 22, 4, 252, 96, 22, 4, 252, 34, 22, 4, 252, 63, 22, 4, + 252, 95, 22, 4, 252, 72, 22, 4, 252, 75, 22, 4, 252, 47, 22, 4, 252, 23, + 22, 4, 236, 33, 22, 4, 236, 14, 22, 4, 236, 25, 22, 4, 236, 32, 22, 4, + 236, 27, 22, 4, 236, 28, 22, 4, 236, 17, 22, 4, 236, 10, 22, 4, 229, 148, + 22, 4, 229, 133, 22, 4, 229, 135, 22, 4, 229, 147, 22, 4, 229, 143, 22, + 4, 229, 144, 22, 4, 229, 134, 22, 4, 229, 131, 22, 4, 229, 50, 22, 4, + 229, 43, 22, 4, 229, 46, 22, 4, 229, 49, 22, 4, 229, 47, 22, 4, 229, 48, + 22, 4, 229, 45, 22, 4, 229, 44, 22, 4, 248, 139, 22, 4, 247, 232, 22, 4, + 248, 81, 22, 4, 248, 138, 22, 4, 248, 102, 22, 4, 248, 107, 22, 4, 248, + 21, 22, 4, 247, 219, 22, 4, 236, 142, 22, 4, 235, 124, 22, 4, 236, 8, 22, + 4, 236, 141, 22, 4, 236, 74, 22, 4, 236, 80, 22, 4, 235, 207, 22, 4, 235, + 108, 22, 4, 234, 18, 22, 4, 238, 99, 22, 4, 247, 213, 22, 50, 247, 168, + 69, 22, 233, 196, 69, 22, 228, 71, 22, 247, 231, 208, 22, 251, 214, 22, + 232, 176, 22, 251, 219, 22, 235, 162, 251, 219, 22, 235, 23, 69, 22, 236, + 118, 232, 166, 22, 26, 127, 22, 26, 111, 22, 26, 166, 22, 26, 177, 22, + 26, 176, 22, 26, 187, 22, 26, 203, 22, 26, 195, 22, 26, 202, 22, 61, 230, + 112, 22, 61, 229, 79, 22, 61, 230, 44, 22, 61, 248, 2, 22, 61, 248, 74, + 22, 61, 231, 251, 22, 61, 232, 154, 22, 61, 249, 3, 22, 61, 237, 184, 22, + 61, 246, 31, 22, 61, 230, 113, 230, 32, 22, 4, 233, 200, 238, 108, 22, 4, + 238, 104, 22, 4, 238, 105, 22, 4, 238, 106, 22, 4, 233, 200, 252, 194, + 22, 4, 252, 191, 22, 4, 252, 192, 22, 4, 252, 193, 22, 4, 233, 200, 247, + 219, 22, 4, 247, 215, 22, 4, 247, 216, 22, 4, 247, 217, 22, 4, 233, 200, + 235, 108, 22, 4, 235, 104, 22, 4, 235, 105, 22, 4, 235, 106, 22, 229, + 219, 158, 227, 170, 22, 229, 219, 158, 250, 221, 22, 229, 219, 158, 234, + 111, 22, 229, 219, 158, 232, 93, 234, 111, 22, 229, 219, 158, 250, 181, + 22, 229, 219, 158, 240, 208, 22, 229, 219, 158, 252, 54, 22, 229, 219, + 158, 246, 168, 22, 229, 219, 158, 250, 220, 22, 229, 219, 158, 240, 84, + 109, 1, 67, 109, 1, 72, 109, 1, 71, 109, 1, 73, 109, 1, 79, 109, 1, 179, + 109, 1, 247, 208, 109, 1, 201, 109, 1, 247, 173, 109, 1, 247, 96, 109, 1, + 247, 72, 109, 1, 247, 32, 109, 1, 247, 15, 109, 1, 219, 109, 1, 246, 210, + 109, 1, 246, 169, 109, 1, 246, 67, 109, 1, 246, 37, 109, 1, 246, 24, 109, + 1, 240, 41, 109, 1, 239, 254, 109, 1, 239, 209, 109, 1, 239, 167, 109, 1, + 239, 135, 109, 1, 239, 123, 109, 1, 222, 109, 1, 239, 40, 109, 1, 238, + 226, 109, 1, 238, 175, 109, 1, 238, 141, 109, 1, 238, 91, 109, 1, 246, + 89, 109, 1, 238, 81, 109, 1, 238, 9, 109, 1, 237, 209, 109, 1, 237, 138, + 109, 1, 237, 83, 109, 1, 237, 62, 109, 1, 235, 37, 109, 1, 235, 25, 109, + 1, 235, 20, 109, 1, 235, 16, 109, 1, 235, 5, 109, 1, 235, 3, 109, 1, 234, + 8, 109, 1, 193, 109, 1, 233, 203, 109, 1, 232, 51, 109, 1, 231, 216, 109, + 1, 231, 62, 109, 1, 231, 14, 109, 1, 251, 102, 109, 1, 230, 182, 109, 1, + 251, 2, 109, 1, 230, 131, 109, 1, 250, 202, 109, 1, 230, 15, 109, 1, 250, + 116, 109, 1, 249, 70, 109, 1, 249, 58, 109, 1, 250, 125, 109, 1, 229, + 237, 109, 1, 229, 236, 109, 1, 229, 228, 109, 1, 229, 227, 109, 1, 229, + 226, 109, 1, 229, 225, 109, 1, 229, 148, 109, 1, 229, 144, 109, 1, 229, + 135, 109, 1, 229, 134, 109, 1, 229, 133, 109, 1, 229, 132, 109, 1, 228, + 143, 109, 1, 228, 112, 109, 1, 228, 92, 109, 1, 228, 82, 109, 1, 228, 63, + 109, 1, 228, 58, 109, 1, 216, 109, 1, 227, 211, 109, 1, 227, 186, 109, 1, + 227, 167, 109, 1, 227, 142, 109, 1, 227, 119, 14, 15, 72, 14, 15, 255, + 102, 14, 15, 71, 14, 15, 241, 209, 14, 15, 73, 14, 15, 236, 202, 14, 15, + 228, 6, 236, 202, 14, 15, 55, 249, 22, 14, 15, 55, 71, 14, 15, 67, 14, + 15, 255, 104, 14, 15, 228, 112, 14, 15, 106, 228, 112, 14, 15, 228, 92, + 14, 15, 106, 228, 92, 14, 15, 228, 87, 14, 15, 106, 228, 87, 14, 15, 228, + 82, 14, 15, 106, 228, 82, 14, 15, 228, 77, 14, 15, 106, 228, 77, 14, 15, + 238, 68, 228, 77, 14, 15, 228, 143, 14, 15, 106, 228, 143, 14, 15, 228, + 142, 14, 15, 106, 228, 142, 14, 15, 238, 68, 228, 142, 14, 15, 255, 55, + 14, 15, 228, 6, 228, 144, 14, 15, 247, 77, 208, 14, 15, 30, 135, 14, 15, + 30, 191, 14, 15, 30, 252, 250, 137, 234, 107, 14, 15, 30, 229, 208, 137, + 234, 107, 14, 15, 30, 38, 137, 234, 107, 14, 15, 30, 234, 107, 14, 15, + 30, 45, 135, 14, 15, 30, 45, 232, 93, 59, 231, 66, 14, 15, 30, 238, 223, + 250, 100, 14, 15, 30, 232, 93, 163, 108, 14, 15, 30, 235, 213, 14, 15, + 30, 92, 230, 174, 14, 15, 248, 234, 14, 15, 241, 192, 14, 15, 236, 211, + 14, 15, 255, 8, 14, 15, 236, 80, 14, 15, 236, 139, 14, 15, 236, 8, 14, + 15, 235, 236, 14, 15, 235, 207, 14, 15, 235, 192, 14, 15, 228, 6, 235, + 192, 14, 15, 55, 246, 198, 14, 15, 55, 246, 169, 14, 15, 236, 142, 14, + 15, 236, 141, 14, 15, 235, 106, 14, 15, 106, 235, 106, 14, 15, 235, 104, + 14, 15, 106, 235, 104, 14, 15, 235, 103, 14, 15, 106, 235, 103, 14, 15, + 235, 102, 14, 15, 106, 235, 102, 14, 15, 235, 101, 14, 15, 106, 235, 101, + 14, 15, 235, 108, 14, 15, 106, 235, 108, 14, 15, 235, 107, 14, 15, 106, + 235, 107, 14, 15, 228, 6, 235, 107, 14, 15, 223, 14, 15, 106, 223, 14, + 15, 55, 192, 14, 15, 230, 131, 14, 15, 230, 179, 14, 15, 230, 15, 14, 15, + 230, 6, 14, 15, 87, 14, 15, 229, 210, 14, 15, 228, 6, 229, 210, 14, 15, + 55, 250, 248, 14, 15, 55, 250, 202, 14, 15, 230, 182, 14, 15, 230, 180, + 14, 15, 229, 83, 14, 15, 106, 229, 83, 14, 15, 229, 68, 14, 15, 106, 229, + 68, 14, 15, 229, 67, 14, 15, 106, 229, 67, 14, 15, 111, 14, 15, 106, 111, + 14, 15, 229, 64, 14, 15, 106, 229, 64, 14, 15, 229, 85, 14, 15, 106, 229, + 85, 14, 15, 229, 84, 14, 15, 106, 229, 84, 14, 15, 238, 68, 229, 84, 14, + 15, 214, 14, 15, 229, 127, 14, 15, 229, 116, 14, 15, 229, 115, 14, 15, + 229, 130, 14, 15, 240, 219, 14, 15, 241, 7, 14, 15, 240, 168, 14, 15, + 240, 162, 14, 15, 240, 127, 14, 15, 240, 116, 14, 15, 228, 6, 240, 116, + 14, 15, 201, 14, 15, 241, 10, 14, 15, 240, 72, 14, 15, 106, 240, 72, 14, + 15, 240, 70, 14, 15, 106, 240, 70, 14, 15, 240, 69, 14, 15, 106, 240, 69, + 14, 15, 240, 68, 14, 15, 106, 240, 68, 14, 15, 240, 67, 14, 15, 106, 240, + 67, 14, 15, 240, 74, 14, 15, 106, 240, 74, 14, 15, 240, 73, 14, 15, 106, + 240, 73, 14, 15, 238, 68, 240, 73, 14, 15, 241, 12, 14, 15, 240, 75, 14, + 15, 231, 198, 240, 214, 14, 15, 231, 198, 240, 163, 14, 15, 231, 198, + 240, 124, 14, 15, 231, 198, 241, 4, 14, 15, 252, 119, 14, 15, 252, 174, + 14, 15, 252, 16, 14, 15, 252, 8, 14, 15, 251, 226, 14, 15, 251, 180, 14, + 15, 228, 6, 251, 180, 14, 15, 252, 176, 14, 15, 252, 175, 14, 15, 251, + 120, 14, 15, 106, 251, 120, 14, 15, 251, 118, 14, 15, 106, 251, 118, 14, + 15, 251, 117, 14, 15, 106, 251, 117, 14, 15, 251, 116, 14, 15, 106, 251, + 116, 14, 15, 251, 115, 14, 15, 106, 251, 115, 14, 15, 251, 122, 14, 15, + 106, 251, 122, 14, 15, 251, 121, 14, 15, 106, 251, 121, 14, 15, 238, 68, + 251, 121, 14, 15, 252, 178, 14, 15, 233, 222, 230, 89, 14, 15, 239, 40, + 14, 15, 239, 103, 14, 15, 238, 226, 14, 15, 238, 207, 14, 15, 238, 175, + 14, 15, 238, 161, 14, 15, 228, 6, 238, 161, 14, 15, 222, 14, 15, 239, + 104, 14, 15, 238, 106, 14, 15, 106, 238, 106, 14, 15, 238, 104, 14, 15, + 106, 238, 104, 14, 15, 238, 103, 14, 15, 106, 238, 103, 14, 15, 238, 102, + 14, 15, 106, 238, 102, 14, 15, 238, 101, 14, 15, 106, 238, 101, 14, 15, + 238, 108, 14, 15, 106, 238, 108, 14, 15, 238, 107, 14, 15, 106, 238, 107, + 14, 15, 238, 68, 238, 107, 14, 15, 173, 14, 15, 106, 173, 14, 15, 238, + 229, 14, 15, 254, 152, 173, 14, 15, 233, 222, 173, 14, 15, 238, 9, 14, + 15, 238, 88, 14, 15, 237, 209, 14, 15, 237, 191, 14, 15, 237, 138, 14, + 15, 237, 129, 14, 15, 228, 6, 237, 129, 14, 15, 238, 91, 14, 15, 238, 89, + 14, 15, 237, 58, 14, 15, 106, 237, 58, 14, 15, 237, 60, 14, 15, 106, 237, + 60, 14, 15, 237, 59, 14, 15, 106, 237, 59, 14, 15, 238, 68, 237, 59, 14, + 15, 197, 14, 15, 55, 237, 244, 14, 15, 237, 211, 14, 15, 239, 254, 14, + 15, 240, 39, 14, 15, 239, 209, 14, 15, 239, 198, 14, 15, 239, 167, 14, + 15, 239, 149, 14, 15, 228, 6, 239, 149, 14, 15, 240, 41, 14, 15, 240, 40, + 14, 15, 239, 120, 14, 15, 106, 239, 120, 14, 15, 239, 119, 14, 15, 106, + 239, 119, 14, 15, 239, 118, 14, 15, 106, 239, 118, 14, 15, 239, 117, 14, + 15, 106, 239, 117, 14, 15, 239, 116, 14, 15, 106, 239, 116, 14, 15, 239, + 122, 14, 15, 106, 239, 122, 14, 15, 239, 121, 14, 15, 106, 239, 121, 14, + 15, 162, 14, 15, 106, 162, 14, 15, 113, 162, 14, 15, 233, 203, 14, 15, + 234, 4, 14, 15, 232, 51, 14, 15, 232, 39, 14, 15, 231, 216, 14, 15, 231, + 206, 14, 15, 228, 6, 231, 206, 14, 15, 234, 8, 14, 15, 234, 6, 14, 15, + 231, 8, 14, 15, 106, 231, 8, 14, 15, 231, 6, 14, 15, 106, 231, 6, 14, 15, + 231, 5, 14, 15, 106, 231, 5, 14, 15, 231, 4, 14, 15, 106, 231, 4, 14, 15, + 231, 3, 14, 15, 106, 231, 3, 14, 15, 231, 12, 14, 15, 106, 231, 12, 14, + 15, 231, 11, 14, 15, 106, 231, 11, 14, 15, 238, 68, 231, 11, 14, 15, 193, + 14, 15, 254, 152, 193, 14, 15, 231, 13, 14, 15, 253, 12, 193, 14, 15, + 238, 158, 231, 248, 14, 15, 238, 68, 231, 243, 14, 15, 238, 68, 234, 9, + 14, 15, 238, 68, 231, 172, 14, 15, 238, 68, 231, 64, 14, 15, 238, 68, + 231, 242, 14, 15, 238, 68, 233, 205, 14, 15, 232, 126, 14, 15, 232, 109, + 14, 15, 232, 107, 14, 15, 232, 101, 14, 15, 232, 96, 14, 15, 232, 147, + 14, 15, 232, 146, 14, 15, 232, 62, 14, 15, 106, 232, 62, 14, 15, 232, 61, + 14, 15, 106, 232, 61, 14, 15, 232, 60, 14, 15, 106, 232, 60, 14, 15, 232, + 59, 14, 15, 106, 232, 59, 14, 15, 232, 58, 14, 15, 106, 232, 58, 14, 15, + 232, 64, 14, 15, 106, 232, 64, 14, 15, 232, 63, 14, 15, 106, 232, 63, 14, + 15, 232, 148, 14, 15, 227, 211, 14, 15, 228, 1, 14, 15, 227, 186, 14, 15, + 227, 178, 14, 15, 227, 167, 14, 15, 227, 156, 14, 15, 228, 6, 227, 156, + 14, 15, 216, 14, 15, 228, 3, 14, 15, 227, 116, 14, 15, 106, 227, 116, 14, + 15, 227, 115, 14, 15, 106, 227, 115, 14, 15, 227, 114, 14, 15, 106, 227, + 114, 14, 15, 227, 113, 14, 15, 106, 227, 113, 14, 15, 227, 112, 14, 15, + 106, 227, 112, 14, 15, 227, 118, 14, 15, 106, 227, 118, 14, 15, 227, 117, + 14, 15, 106, 227, 117, 14, 15, 238, 68, 227, 117, 14, 15, 228, 7, 14, 15, + 253, 41, 228, 7, 14, 15, 106, 228, 7, 14, 15, 233, 222, 227, 186, 14, 15, + 234, 203, 14, 15, 234, 238, 234, 203, 14, 15, 106, 239, 254, 14, 15, 234, + 232, 14, 15, 234, 145, 14, 15, 234, 112, 14, 15, 234, 91, 14, 15, 234, + 84, 14, 15, 106, 239, 167, 14, 15, 234, 236, 14, 15, 234, 233, 14, 15, + 106, 240, 41, 14, 15, 234, 21, 14, 15, 106, 234, 21, 14, 15, 144, 14, 15, + 106, 144, 14, 15, 113, 144, 14, 15, 248, 107, 14, 15, 248, 136, 14, 15, + 248, 81, 14, 15, 248, 68, 14, 15, 248, 21, 14, 15, 248, 17, 14, 15, 248, + 139, 14, 15, 248, 138, 14, 15, 247, 218, 14, 15, 106, 247, 218, 14, 15, + 248, 140, 14, 15, 230, 76, 14, 15, 238, 92, 230, 76, 14, 15, 230, 57, 14, + 15, 238, 92, 230, 57, 14, 15, 230, 53, 14, 15, 238, 92, 230, 53, 14, 15, + 230, 38, 14, 15, 230, 35, 14, 15, 230, 87, 14, 15, 230, 86, 14, 15, 230, + 17, 14, 15, 106, 230, 17, 14, 15, 230, 89, 14, 15, 229, 119, 14, 15, 229, + 118, 14, 15, 229, 117, 14, 15, 229, 120, 14, 15, 229, 121, 14, 15, 229, + 62, 14, 15, 229, 61, 14, 15, 229, 60, 14, 15, 229, 63, 14, 15, 237, 73, + 246, 210, 14, 15, 237, 73, 246, 169, 14, 15, 237, 73, 246, 156, 14, 15, + 237, 73, 246, 67, 14, 15, 237, 73, 246, 59, 14, 15, 237, 73, 219, 14, 15, + 237, 73, 246, 249, 14, 15, 237, 73, 192, 14, 15, 237, 72, 192, 14, 15, + 246, 151, 14, 15, 235, 88, 14, 15, 235, 58, 14, 15, 235, 53, 14, 15, 235, + 49, 14, 15, 235, 44, 14, 15, 235, 92, 14, 15, 235, 91, 14, 15, 235, 93, + 14, 15, 229, 233, 14, 15, 229, 231, 14, 15, 229, 230, 14, 15, 229, 234, + 14, 15, 106, 234, 203, 14, 15, 106, 234, 145, 14, 15, 106, 234, 91, 14, + 15, 106, 234, 236, 14, 15, 237, 240, 14, 15, 237, 229, 14, 15, 237, 225, + 14, 15, 237, 222, 14, 15, 237, 219, 14, 15, 237, 242, 14, 15, 237, 241, + 14, 15, 237, 244, 14, 15, 237, 149, 14, 15, 233, 222, 232, 126, 14, 15, + 233, 222, 232, 109, 14, 15, 233, 222, 232, 101, 14, 15, 233, 222, 232, + 147, 14, 15, 228, 75, 230, 76, 14, 15, 228, 75, 230, 57, 14, 15, 228, 75, + 230, 38, 14, 15, 228, 75, 230, 87, 14, 15, 228, 75, 230, 89, 14, 15, 239, + 214, 14, 15, 239, 213, 14, 15, 239, 212, 14, 15, 239, 211, 14, 15, 239, + 220, 14, 15, 239, 219, 14, 15, 239, 221, 14, 15, 230, 88, 230, 76, 14, + 15, 230, 88, 230, 57, 14, 15, 230, 88, 230, 53, 14, 15, 230, 88, 230, 38, + 14, 15, 230, 88, 230, 35, 14, 15, 230, 88, 230, 87, 14, 15, 230, 88, 230, + 86, 14, 15, 230, 88, 230, 89, 14, 15, 255, 46, 217, 14, 15, 253, 12, 72, + 14, 15, 253, 12, 71, 14, 15, 253, 12, 73, 14, 15, 253, 12, 67, 14, 15, + 253, 12, 228, 112, 14, 15, 253, 12, 228, 92, 14, 15, 253, 12, 228, 82, + 14, 15, 253, 12, 228, 143, 14, 15, 253, 12, 238, 9, 14, 15, 253, 12, 237, + 209, 14, 15, 253, 12, 237, 138, 14, 15, 253, 12, 238, 91, 14, 15, 253, + 12, 240, 219, 14, 15, 253, 12, 240, 168, 14, 15, 253, 12, 240, 127, 14, + 15, 253, 12, 201, 14, 15, 233, 222, 246, 210, 14, 15, 233, 222, 246, 169, + 14, 15, 233, 222, 246, 67, 14, 15, 233, 222, 219, 14, 15, 55, 247, 101, + 14, 15, 55, 247, 103, 14, 15, 55, 247, 107, 14, 15, 55, 247, 106, 14, 15, + 55, 247, 104, 14, 15, 55, 247, 115, 14, 15, 55, 234, 43, 14, 15, 55, 234, + 91, 14, 15, 55, 234, 203, 14, 15, 55, 234, 189, 14, 15, 55, 234, 145, 14, + 15, 55, 234, 236, 14, 15, 55, 228, 63, 14, 15, 55, 228, 82, 14, 15, 55, + 228, 112, 14, 15, 55, 228, 109, 14, 15, 55, 228, 92, 14, 15, 55, 228, + 143, 14, 15, 55, 246, 17, 14, 15, 55, 246, 18, 14, 15, 55, 246, 21, 14, + 15, 55, 246, 20, 14, 15, 55, 246, 19, 14, 15, 55, 246, 23, 14, 15, 55, + 230, 24, 14, 15, 55, 230, 38, 14, 15, 55, 230, 76, 14, 15, 55, 230, 75, + 14, 15, 55, 230, 57, 14, 15, 55, 230, 87, 14, 15, 55, 229, 107, 14, 15, + 55, 229, 115, 14, 15, 55, 229, 127, 14, 15, 55, 229, 126, 14, 15, 55, + 229, 116, 14, 15, 55, 229, 130, 14, 15, 55, 235, 124, 14, 15, 55, 235, + 207, 14, 15, 55, 236, 80, 14, 15, 55, 236, 74, 14, 15, 55, 236, 8, 14, + 15, 55, 236, 142, 14, 15, 55, 223, 14, 15, 55, 247, 32, 14, 15, 55, 247, + 72, 14, 15, 55, 247, 173, 14, 15, 55, 247, 169, 14, 15, 55, 247, 96, 14, + 15, 55, 247, 208, 14, 15, 55, 240, 172, 14, 15, 55, 240, 175, 14, 15, 55, + 240, 184, 14, 15, 55, 240, 183, 14, 15, 55, 240, 179, 14, 15, 55, 240, + 194, 14, 15, 55, 240, 138, 14, 15, 55, 240, 139, 14, 15, 55, 240, 142, + 14, 15, 55, 240, 141, 14, 15, 55, 240, 140, 14, 15, 55, 240, 143, 14, 15, + 55, 240, 144, 14, 15, 55, 237, 83, 14, 15, 55, 237, 138, 14, 15, 55, 238, + 9, 14, 15, 55, 238, 7, 14, 15, 55, 237, 209, 14, 15, 55, 238, 91, 14, 15, + 55, 238, 141, 14, 15, 55, 238, 175, 14, 15, 55, 239, 40, 14, 15, 55, 239, + 31, 14, 15, 55, 238, 226, 14, 15, 55, 222, 14, 15, 55, 227, 142, 14, 15, + 55, 227, 167, 14, 15, 55, 227, 211, 14, 15, 55, 227, 208, 14, 15, 55, + 227, 186, 14, 15, 55, 216, 14, 15, 55, 241, 36, 14, 15, 233, 222, 241, + 36, 14, 15, 55, 241, 48, 14, 15, 55, 241, 98, 14, 15, 55, 241, 97, 14, + 15, 55, 241, 86, 14, 15, 233, 222, 241, 86, 14, 15, 55, 241, 107, 14, 15, + 55, 241, 61, 14, 15, 55, 241, 65, 14, 15, 55, 241, 75, 14, 15, 55, 241, + 74, 14, 15, 55, 241, 73, 14, 15, 55, 241, 76, 14, 15, 55, 239, 135, 14, + 15, 55, 239, 167, 14, 15, 55, 239, 254, 14, 15, 55, 239, 250, 14, 15, 55, + 239, 209, 14, 15, 55, 240, 41, 14, 15, 55, 250, 120, 14, 15, 55, 250, + 121, 14, 15, 55, 250, 124, 14, 15, 55, 250, 123, 14, 15, 55, 250, 122, + 14, 15, 55, 250, 125, 14, 15, 55, 239, 210, 14, 15, 55, 239, 212, 14, 15, + 55, 239, 216, 14, 15, 55, 239, 215, 14, 15, 55, 239, 214, 14, 15, 55, + 239, 220, 14, 15, 55, 229, 229, 14, 15, 55, 229, 230, 14, 15, 55, 229, + 233, 14, 15, 55, 229, 232, 14, 15, 55, 229, 231, 14, 15, 55, 229, 234, + 14, 15, 55, 229, 226, 14, 15, 55, 229, 227, 14, 15, 55, 229, 236, 14, 15, + 55, 229, 235, 14, 15, 55, 229, 228, 14, 15, 55, 229, 237, 14, 15, 55, + 227, 19, 14, 15, 55, 227, 27, 14, 15, 55, 227, 86, 14, 15, 55, 227, 85, + 14, 15, 55, 227, 41, 14, 15, 55, 227, 102, 14, 15, 55, 227, 103, 14, 15, + 55, 54, 227, 103, 14, 15, 55, 249, 38, 14, 15, 55, 249, 39, 14, 15, 55, + 249, 46, 14, 15, 55, 249, 45, 14, 15, 55, 249, 41, 14, 15, 55, 249, 47, + 14, 15, 55, 231, 62, 14, 15, 55, 231, 216, 14, 15, 55, 233, 203, 14, 15, + 55, 233, 193, 14, 15, 55, 232, 51, 14, 15, 55, 234, 8, 14, 15, 55, 232, + 74, 14, 15, 55, 232, 101, 14, 15, 55, 232, 126, 14, 15, 55, 232, 124, 14, + 15, 55, 232, 109, 14, 15, 55, 232, 147, 14, 15, 55, 232, 148, 14, 15, 55, + 229, 133, 14, 15, 55, 229, 134, 14, 15, 55, 229, 144, 14, 15, 55, 229, + 143, 14, 15, 55, 229, 135, 14, 15, 55, 229, 148, 14, 15, 55, 252, 34, 14, + 15, 55, 252, 47, 14, 15, 55, 252, 75, 14, 15, 55, 252, 72, 14, 15, 55, + 252, 63, 14, 15, 55, 252, 96, 14, 15, 55, 229, 109, 14, 15, 55, 229, 110, + 14, 15, 55, 229, 113, 14, 15, 55, 229, 112, 14, 15, 55, 229, 111, 14, 15, + 55, 229, 114, 14, 15, 252, 64, 52, 14, 15, 247, 231, 208, 14, 15, 235, + 84, 14, 15, 237, 239, 14, 15, 237, 146, 14, 15, 237, 145, 14, 15, 237, + 144, 14, 15, 237, 143, 14, 15, 237, 148, 14, 15, 237, 147, 236, 232, 231, + 194, 69, 236, 232, 1, 253, 72, 236, 232, 1, 239, 134, 236, 232, 1, 248, + 106, 236, 232, 1, 233, 251, 236, 232, 1, 237, 183, 236, 232, 1, 229, 36, + 236, 232, 1, 251, 85, 236, 232, 1, 229, 251, 236, 232, 1, 251, 221, 236, + 232, 1, 252, 112, 236, 232, 1, 238, 138, 236, 232, 1, 247, 61, 236, 232, + 1, 237, 233, 236, 232, 1, 231, 88, 236, 232, 1, 234, 40, 236, 232, 1, + 255, 53, 236, 232, 1, 236, 205, 236, 232, 1, 228, 246, 236, 232, 1, 249, + 36, 236, 232, 1, 241, 140, 236, 232, 1, 249, 37, 236, 232, 1, 236, 183, + 236, 232, 1, 229, 27, 236, 232, 1, 241, 211, 236, 232, 1, 249, 35, 236, + 232, 1, 236, 67, 236, 232, 248, 105, 69, 236, 232, 224, 248, 105, 69, + 119, 1, 248, 97, 248, 89, 248, 108, 248, 140, 119, 1, 179, 119, 1, 228, + 241, 228, 247, 79, 119, 1, 227, 144, 119, 1, 228, 7, 119, 1, 228, 144, + 119, 1, 230, 20, 230, 19, 230, 34, 119, 1, 248, 174, 119, 1, 254, 245, + 67, 119, 1, 236, 174, 73, 119, 1, 255, 93, 67, 119, 1, 255, 71, 119, 1, + 239, 154, 73, 119, 1, 232, 86, 73, 119, 1, 73, 119, 1, 236, 234, 119, 1, + 236, 211, 119, 1, 234, 223, 234, 231, 234, 184, 144, 119, 1, 240, 226, + 119, 1, 252, 110, 119, 1, 240, 227, 241, 12, 119, 1, 210, 119, 1, 248, + 224, 119, 1, 247, 171, 247, 3, 210, 119, 1, 247, 189, 119, 1, 228, 62, + 228, 57, 228, 144, 119, 1, 246, 243, 192, 119, 1, 246, 247, 192, 119, 1, + 239, 156, 192, 119, 1, 232, 89, 192, 119, 1, 238, 64, 237, 54, 238, 65, + 197, 119, 1, 232, 87, 197, 119, 1, 249, 95, 119, 1, 241, 126, 241, 129, + 241, 123, 71, 119, 1, 72, 119, 1, 241, 92, 221, 119, 1, 247, 159, 119, 1, + 239, 157, 255, 75, 119, 1, 232, 91, 67, 119, 1, 241, 116, 248, 209, 119, + 1, 236, 44, 236, 58, 223, 119, 1, 255, 35, 248, 208, 119, 1, 231, 196, + 193, 119, 1, 232, 43, 239, 153, 193, 119, 1, 232, 85, 193, 119, 1, 252, + 178, 119, 1, 227, 103, 119, 1, 229, 241, 229, 245, 229, 51, 214, 119, 1, + 232, 84, 214, 119, 1, 209, 119, 1, 253, 58, 253, 61, 253, 17, 217, 119, + 1, 232, 90, 217, 119, 1, 249, 94, 119, 1, 236, 191, 119, 1, 249, 14, 249, + 16, 72, 119, 1, 239, 77, 239, 82, 173, 119, 1, 239, 155, 173, 119, 1, + 232, 88, 173, 119, 1, 240, 8, 240, 30, 239, 160, 162, 119, 1, 249, 96, + 119, 1, 241, 175, 119, 1, 241, 176, 119, 1, 251, 94, 251, 96, 209, 119, + 1, 236, 170, 248, 173, 73, 119, 1, 249, 34, 119, 1, 241, 139, 119, 1, + 251, 119, 119, 1, 252, 169, 119, 1, 252, 118, 119, 1, 231, 117, 119, 1, + 239, 152, 119, 1, 232, 83, 119, 1, 245, 224, 119, 1, 235, 93, 119, 1, + 206, 119, 232, 29, 235, 121, 119, 238, 134, 235, 121, 119, 251, 153, 235, + 121, 119, 254, 187, 91, 119, 229, 87, 91, 119, 253, 71, 91, 230, 172, 1, + 67, 230, 172, 1, 71, 230, 172, 1, 79, 230, 172, 1, 201, 230, 172, 1, 247, + 208, 230, 172, 1, 237, 242, 230, 172, 1, 230, 182, 230, 172, 1, 251, 102, + 230, 172, 1, 238, 91, 230, 172, 1, 236, 142, 230, 172, 1, 253, 166, 230, + 172, 1, 222, 230, 172, 1, 216, 230, 172, 1, 240, 41, 230, 172, 1, 228, + 143, 230, 172, 1, 234, 8, 230, 172, 1, 219, 230, 172, 33, 21, 71, 230, + 172, 33, 21, 79, 230, 172, 21, 228, 182, 246, 229, 1, 67, 246, 229, 1, + 71, 246, 229, 1, 79, 246, 229, 1, 201, 246, 229, 1, 247, 208, 246, 229, + 1, 237, 242, 246, 229, 1, 230, 182, 246, 229, 1, 251, 102, 246, 229, 1, + 238, 91, 246, 229, 1, 236, 142, 246, 229, 1, 253, 166, 246, 229, 1, 222, + 246, 229, 1, 216, 246, 229, 1, 234, 236, 246, 229, 1, 240, 41, 246, 229, + 1, 228, 143, 246, 229, 1, 234, 8, 246, 229, 1, 219, 246, 229, 33, 21, 71, + 246, 229, 33, 21, 79, 246, 229, 21, 236, 124, 236, 21, 232, 29, 235, 121, + 236, 21, 45, 235, 121, 252, 214, 1, 67, 252, 214, 1, 71, 252, 214, 1, 79, + 252, 214, 1, 201, 252, 214, 1, 247, 208, 252, 214, 1, 237, 242, 252, 214, + 1, 230, 182, 252, 214, 1, 251, 102, 252, 214, 1, 238, 91, 252, 214, 1, + 236, 142, 252, 214, 1, 253, 166, 252, 214, 1, 222, 252, 214, 1, 216, 252, + 214, 1, 234, 236, 252, 214, 1, 240, 41, 252, 214, 1, 228, 143, 252, 214, + 1, 234, 8, 252, 214, 1, 219, 252, 214, 33, 21, 71, 252, 214, 33, 21, 79, + 230, 171, 1, 67, 230, 171, 1, 71, 230, 171, 1, 79, 230, 171, 1, 201, 230, + 171, 1, 247, 208, 230, 171, 1, 237, 242, 230, 171, 1, 230, 182, 230, 171, + 1, 251, 102, 230, 171, 1, 238, 91, 230, 171, 1, 236, 142, 230, 171, 1, + 253, 166, 230, 171, 1, 222, 230, 171, 1, 216, 230, 171, 1, 240, 41, 230, + 171, 1, 228, 143, 230, 171, 1, 234, 8, 230, 171, 33, 21, 71, 230, 171, + 33, 21, 79, 63, 1, 201, 63, 1, 240, 194, 63, 1, 240, 127, 63, 1, 240, + 175, 63, 1, 237, 222, 63, 1, 252, 176, 63, 1, 252, 96, 63, 1, 251, 226, + 63, 1, 252, 47, 63, 1, 237, 39, 63, 1, 251, 102, 63, 1, 229, 120, 63, 1, + 250, 116, 63, 1, 229, 117, 63, 1, 237, 141, 63, 1, 230, 182, 63, 1, 230, + 87, 63, 1, 87, 63, 1, 230, 38, 63, 1, 237, 138, 63, 1, 253, 166, 63, 1, + 236, 33, 63, 1, 235, 207, 63, 1, 236, 17, 63, 1, 238, 175, 63, 1, 227, + 167, 63, 1, 234, 91, 63, 1, 239, 167, 63, 1, 228, 173, 63, 1, 232, 147, + 63, 1, 231, 137, 63, 1, 234, 8, 63, 1, 219, 63, 1, 240, 41, 63, 1, 235, + 92, 63, 241, 185, 33, 235, 78, 63, 241, 185, 33, 235, 91, 63, 241, 185, + 33, 235, 58, 63, 241, 185, 33, 235, 53, 63, 241, 185, 33, 235, 38, 63, + 241, 185, 33, 235, 17, 63, 241, 185, 33, 235, 5, 63, 241, 185, 33, 235, + 4, 63, 241, 185, 33, 234, 19, 63, 241, 185, 33, 234, 12, 63, 241, 185, + 33, 239, 114, 63, 241, 185, 33, 239, 107, 63, 241, 185, 33, 235, 73, 63, + 241, 185, 33, 235, 84, 63, 241, 185, 33, 235, 45, 229, 59, 127, 63, 241, + 185, 33, 235, 45, 229, 59, 111, 63, 241, 185, 33, 235, 74, 63, 33, 241, + 174, 254, 213, 63, 33, 241, 174, 255, 104, 63, 33, 21, 255, 104, 63, 33, + 21, 71, 63, 33, 21, 241, 209, 63, 33, 21, 228, 7, 63, 33, 21, 227, 111, + 63, 33, 21, 79, 63, 33, 21, 228, 238, 63, 33, 21, 229, 37, 63, 33, 21, + 236, 234, 63, 33, 21, 216, 63, 33, 21, 241, 230, 63, 33, 21, 72, 63, 33, + 21, 255, 75, 63, 33, 21, 255, 55, 63, 33, 21, 236, 202, 63, 33, 21, 254, + 144, 63, 21, 237, 190, 63, 21, 234, 201, 63, 21, 227, 121, 63, 21, 238, + 114, 63, 21, 229, 172, 63, 21, 253, 146, 63, 21, 234, 87, 63, 21, 229, + 223, 63, 21, 241, 0, 63, 21, 255, 57, 63, 21, 233, 238, 233, 235, 63, 21, + 228, 179, 63, 21, 251, 223, 63, 21, 253, 129, 63, 21, 240, 189, 63, 21, + 253, 143, 63, 21, 252, 167, 235, 237, 240, 79, 63, 21, 239, 235, 229, + 210, 63, 21, 253, 47, 63, 21, 236, 19, 238, 140, 63, 21, 240, 115, 63, + 251, 133, 12, 234, 142, 63, 21, 254, 133, 63, 21, 254, 147, 63, 26, 227, + 80, 63, 26, 127, 63, 26, 111, 63, 26, 166, 63, 26, 177, 63, 26, 176, 63, + 26, 187, 63, 26, 203, 63, 26, 195, 63, 26, 202, 63, 12, 239, 235, 254, + 149, 231, 207, 63, 12, 239, 235, 254, 149, 238, 123, 63, 12, 239, 235, + 254, 149, 235, 236, 63, 12, 239, 235, 254, 149, 253, 73, 63, 12, 239, + 235, 254, 149, 252, 205, 63, 12, 239, 235, 254, 149, 235, 176, 63, 12, + 239, 235, 254, 149, 235, 170, 63, 12, 239, 235, 254, 149, 235, 168, 63, + 12, 239, 235, 254, 149, 235, 174, 63, 12, 239, 235, 254, 149, 235, 172, + 58, 253, 26, 58, 248, 243, 58, 251, 214, 58, 247, 231, 208, 58, 251, 219, + 58, 248, 0, 250, 98, 58, 229, 222, 231, 212, 245, 248, 58, 232, 50, 4, + 252, 247, 239, 61, 58, 239, 80, 251, 214, 58, 239, 80, 247, 231, 208, 58, + 237, 181, 58, 247, 243, 34, 233, 183, 127, 58, 247, 243, 34, 233, 183, + 111, 58, 247, 243, 34, 233, 183, 166, 58, 33, 232, 166, 58, 26, 227, 80, + 58, 26, 127, 58, 26, 111, 58, 26, 166, 58, 26, 177, 58, 26, 176, 58, 26, + 187, 58, 26, 203, 58, 26, 195, 58, 26, 202, 58, 1, 67, 58, 1, 72, 58, 1, + 71, 58, 1, 73, 58, 1, 79, 58, 1, 236, 234, 58, 1, 229, 32, 58, 1, 249, + 22, 58, 1, 238, 91, 58, 1, 255, 2, 58, 1, 253, 166, 58, 1, 236, 142, 58, + 1, 235, 92, 58, 1, 247, 208, 58, 1, 222, 58, 1, 240, 41, 58, 1, 234, 8, + 58, 1, 232, 147, 58, 1, 230, 182, 58, 1, 251, 102, 58, 1, 252, 96, 58, 1, + 241, 107, 58, 1, 216, 58, 1, 234, 236, 58, 1, 228, 143, 58, 1, 248, 139, + 58, 1, 201, 58, 1, 240, 194, 58, 1, 229, 148, 58, 1, 227, 102, 58, 1, + 246, 249, 58, 1, 227, 20, 58, 1, 239, 220, 58, 1, 227, 63, 58, 1, 252, + 63, 58, 1, 229, 222, 183, 33, 52, 58, 1, 229, 222, 72, 58, 1, 229, 222, + 71, 58, 1, 229, 222, 73, 58, 1, 229, 222, 79, 58, 1, 229, 222, 236, 234, + 58, 1, 229, 222, 229, 32, 58, 1, 229, 222, 255, 2, 58, 1, 229, 222, 253, + 166, 58, 1, 229, 222, 236, 142, 58, 1, 229, 222, 235, 92, 58, 1, 229, + 222, 247, 208, 58, 1, 229, 222, 222, 58, 1, 229, 222, 230, 182, 58, 1, + 229, 222, 251, 102, 58, 1, 229, 222, 252, 96, 58, 1, 229, 222, 241, 107, + 58, 1, 229, 222, 229, 148, 58, 1, 229, 222, 216, 58, 1, 229, 222, 228, + 143, 58, 1, 229, 222, 201, 58, 1, 229, 222, 247, 207, 58, 1, 229, 222, + 246, 249, 58, 1, 229, 222, 241, 85, 58, 1, 229, 222, 237, 208, 58, 1, + 229, 222, 249, 47, 58, 1, 232, 50, 72, 58, 1, 232, 50, 71, 58, 1, 232, + 50, 241, 114, 58, 1, 232, 50, 229, 32, 58, 1, 232, 50, 79, 58, 1, 232, + 50, 255, 2, 58, 1, 232, 50, 201, 58, 1, 232, 50, 247, 208, 58, 1, 232, + 50, 219, 58, 1, 232, 50, 236, 142, 58, 1, 232, 50, 232, 147, 58, 1, 232, + 50, 230, 182, 58, 1, 232, 50, 251, 102, 58, 1, 232, 50, 241, 107, 58, 1, + 232, 50, 248, 139, 58, 1, 232, 50, 247, 207, 58, 1, 232, 50, 246, 249, + 58, 1, 232, 50, 229, 148, 58, 1, 232, 50, 227, 102, 58, 1, 232, 50, 234, + 233, 58, 1, 232, 50, 252, 96, 58, 1, 232, 50, 227, 76, 58, 1, 239, 80, + 71, 58, 1, 239, 80, 201, 58, 1, 239, 80, 234, 236, 58, 1, 239, 80, 248, + 139, 58, 1, 239, 80, 227, 76, 58, 1, 255, 34, 247, 199, 254, 237, 127, + 58, 1, 255, 34, 247, 199, 228, 178, 127, 58, 1, 255, 34, 247, 199, 251, + 77, 58, 1, 255, 34, 247, 199, 229, 35, 58, 1, 255, 34, 247, 199, 241, + 143, 229, 35, 58, 1, 255, 34, 247, 199, 253, 150, 58, 1, 255, 34, 247, + 199, 204, 253, 150, 58, 1, 255, 34, 247, 199, 67, 58, 1, 255, 34, 247, + 199, 71, 58, 1, 255, 34, 247, 199, 201, 58, 1, 255, 34, 247, 199, 237, + 242, 58, 1, 255, 34, 247, 199, 252, 176, 58, 1, 255, 34, 247, 199, 229, + 130, 58, 1, 255, 34, 247, 199, 229, 120, 58, 1, 255, 34, 247, 199, 251, + 41, 58, 1, 255, 34, 247, 199, 237, 150, 58, 1, 255, 34, 247, 199, 230, + 182, 58, 1, 255, 34, 247, 199, 251, 102, 58, 1, 255, 34, 247, 199, 236, + 142, 58, 1, 255, 34, 247, 199, 236, 33, 58, 1, 255, 34, 247, 199, 231, + 163, 58, 1, 255, 34, 247, 199, 227, 76, 58, 1, 255, 34, 247, 199, 227, + 102, 58, 1, 255, 34, 247, 199, 255, 60, 58, 1, 229, 222, 255, 34, 247, + 199, 230, 182, 58, 1, 229, 222, 255, 34, 247, 199, 227, 76, 58, 1, 239, + 80, 255, 34, 247, 199, 247, 115, 58, 1, 239, 80, 255, 34, 247, 199, 237, + 242, 58, 1, 239, 80, 255, 34, 247, 199, 252, 176, 58, 1, 239, 80, 255, + 34, 247, 199, 241, 90, 58, 1, 239, 80, 255, 34, 247, 199, 229, 130, 58, + 1, 239, 80, 255, 34, 247, 199, 251, 26, 58, 1, 239, 80, 255, 34, 247, + 199, 230, 182, 58, 1, 239, 80, 255, 34, 247, 199, 250, 208, 58, 1, 239, + 80, 255, 34, 247, 199, 231, 163, 58, 1, 239, 80, 255, 34, 247, 199, 251, + 113, 58, 1, 239, 80, 255, 34, 247, 199, 227, 76, 58, 1, 239, 80, 255, 34, + 247, 199, 227, 102, 58, 1, 255, 34, 247, 199, 137, 79, 58, 1, 255, 34, + 247, 199, 137, 216, 58, 1, 239, 80, 255, 34, 247, 199, 253, 46, 58, 1, + 255, 34, 247, 199, 251, 95, 149, 228, 162, 239, 225, 149, 1, 201, 149, 1, + 240, 194, 149, 1, 247, 208, 149, 1, 247, 115, 149, 1, 237, 242, 149, 1, + 252, 176, 149, 1, 252, 96, 149, 1, 241, 107, 149, 1, 241, 90, 149, 1, + 227, 233, 149, 1, 230, 182, 149, 1, 230, 87, 149, 1, 251, 102, 149, 1, + 250, 208, 149, 1, 238, 91, 149, 1, 236, 142, 149, 1, 236, 33, 149, 1, + 253, 166, 149, 1, 253, 46, 149, 1, 222, 149, 1, 216, 149, 1, 234, 236, + 149, 1, 240, 41, 149, 1, 228, 143, 149, 1, 232, 147, 149, 1, 231, 163, + 149, 1, 234, 8, 149, 1, 219, 149, 33, 21, 67, 149, 33, 21, 71, 149, 33, + 21, 79, 149, 33, 21, 249, 22, 149, 33, 21, 255, 55, 149, 33, 21, 236, + 202, 149, 33, 21, 254, 144, 149, 33, 21, 72, 149, 33, 21, 73, 149, 213, + 1, 216, 149, 213, 1, 234, 236, 149, 213, 1, 228, 143, 149, 3, 1, 201, + 149, 3, 1, 237, 242, 149, 3, 1, 254, 236, 149, 3, 1, 230, 182, 149, 3, 1, + 238, 91, 149, 3, 1, 236, 142, 149, 3, 1, 222, 149, 3, 1, 234, 236, 149, + 3, 1, 240, 41, 149, 21, 238, 137, 149, 21, 240, 210, 149, 21, 234, 7, + 149, 21, 239, 149, 149, 248, 156, 69, 149, 235, 23, 69, 149, 26, 227, 80, + 149, 26, 127, 149, 26, 111, 149, 26, 166, 149, 26, 177, 149, 26, 176, + 149, 26, 187, 149, 26, 203, 149, 26, 195, 149, 26, 202, 81, 239, 255, 1, + 201, 81, 239, 255, 1, 228, 54, 81, 239, 255, 1, 237, 242, 81, 239, 255, + 1, 229, 148, 81, 239, 255, 1, 234, 8, 81, 239, 255, 1, 216, 81, 239, 255, + 1, 230, 182, 81, 239, 255, 1, 230, 87, 81, 239, 255, 1, 240, 41, 81, 239, + 255, 1, 236, 142, 81, 239, 255, 1, 236, 33, 81, 239, 255, 1, 222, 81, + 239, 255, 1, 248, 139, 81, 239, 255, 1, 228, 233, 81, 239, 255, 1, 219, + 81, 239, 255, 1, 235, 92, 81, 239, 255, 1, 240, 194, 81, 239, 255, 1, + 229, 141, 81, 239, 255, 1, 238, 91, 81, 239, 255, 1, 67, 81, 239, 255, 1, + 71, 81, 239, 255, 1, 249, 22, 81, 239, 255, 1, 249, 15, 81, 239, 255, 1, + 79, 81, 239, 255, 1, 236, 202, 81, 239, 255, 1, 73, 81, 239, 255, 1, 229, + 32, 81, 239, 255, 1, 72, 81, 239, 255, 1, 254, 143, 81, 239, 255, 1, 255, + 55, 81, 239, 255, 1, 229, 217, 81, 239, 255, 1, 229, 216, 81, 239, 255, + 1, 229, 215, 81, 239, 255, 1, 229, 214, 81, 239, 255, 1, 229, 213, 116, + 81, 122, 1, 200, 235, 92, 116, 81, 122, 1, 170, 235, 92, 116, 81, 122, 1, + 200, 201, 116, 81, 122, 1, 200, 228, 54, 116, 81, 122, 1, 200, 237, 242, + 116, 81, 122, 1, 170, 201, 116, 81, 122, 1, 170, 228, 54, 116, 81, 122, + 1, 170, 237, 242, 116, 81, 122, 1, 200, 229, 148, 116, 81, 122, 1, 200, + 234, 8, 116, 81, 122, 1, 200, 216, 116, 81, 122, 1, 170, 229, 148, 116, + 81, 122, 1, 170, 234, 8, 116, 81, 122, 1, 170, 216, 116, 81, 122, 1, 200, + 230, 182, 116, 81, 122, 1, 200, 230, 87, 116, 81, 122, 1, 200, 238, 91, + 116, 81, 122, 1, 170, 230, 182, 116, 81, 122, 1, 170, 230, 87, 116, 81, + 122, 1, 170, 238, 91, 116, 81, 122, 1, 200, 236, 142, 116, 81, 122, 1, + 200, 236, 33, 116, 81, 122, 1, 200, 222, 116, 81, 122, 1, 170, 236, 142, + 116, 81, 122, 1, 170, 236, 33, 116, 81, 122, 1, 170, 222, 116, 81, 122, + 1, 200, 248, 139, 116, 81, 122, 1, 200, 228, 233, 116, 81, 122, 1, 200, + 240, 41, 116, 81, 122, 1, 170, 248, 139, 116, 81, 122, 1, 170, 228, 233, + 116, 81, 122, 1, 170, 240, 41, 116, 81, 122, 1, 200, 219, 116, 81, 122, + 1, 200, 251, 102, 116, 81, 122, 1, 200, 253, 166, 116, 81, 122, 1, 170, + 219, 116, 81, 122, 1, 170, 251, 102, 116, 81, 122, 1, 170, 253, 166, 116, + 81, 122, 1, 200, 240, 76, 116, 81, 122, 1, 200, 228, 27, 116, 81, 122, 1, + 170, 240, 76, 116, 81, 122, 1, 170, 228, 27, 116, 81, 122, 33, 21, 33, + 232, 82, 116, 81, 122, 33, 21, 255, 104, 116, 81, 122, 33, 21, 241, 209, + 116, 81, 122, 33, 21, 79, 116, 81, 122, 33, 21, 228, 238, 116, 81, 122, + 33, 21, 72, 116, 81, 122, 33, 21, 255, 75, 116, 81, 122, 33, 21, 73, 116, + 81, 122, 33, 21, 236, 249, 116, 81, 122, 33, 21, 229, 32, 116, 81, 122, + 33, 21, 254, 128, 116, 81, 122, 33, 21, 255, 100, 116, 81, 122, 33, 21, + 228, 236, 116, 81, 122, 33, 21, 236, 147, 116, 81, 122, 33, 21, 236, 246, + 116, 81, 122, 33, 21, 229, 30, 116, 81, 122, 33, 21, 241, 114, 116, 81, + 122, 1, 30, 179, 116, 81, 122, 1, 30, 237, 244, 116, 81, 122, 1, 30, 197, + 116, 81, 122, 1, 30, 173, 116, 81, 122, 1, 30, 241, 12, 116, 81, 122, 1, + 30, 209, 116, 81, 122, 1, 30, 217, 116, 81, 122, 188, 239, 65, 116, 81, + 122, 188, 239, 64, 116, 81, 122, 26, 227, 80, 116, 81, 122, 26, 127, 116, + 81, 122, 26, 111, 116, 81, 122, 26, 166, 116, 81, 122, 26, 177, 116, 81, + 122, 26, 176, 116, 81, 122, 26, 187, 116, 81, 122, 26, 203, 116, 81, 122, + 26, 195, 116, 81, 122, 26, 202, 116, 81, 122, 21, 240, 32, 116, 81, 122, + 21, 240, 31, 63, 12, 236, 90, 63, 12, 238, 124, 240, 125, 63, 12, 235, + 237, 240, 125, 63, 12, 253, 74, 240, 125, 63, 12, 252, 206, 240, 125, 63, + 12, 235, 177, 240, 125, 63, 12, 235, 171, 240, 125, 63, 12, 235, 169, + 240, 125, 63, 12, 235, 175, 240, 125, 63, 12, 235, 173, 240, 125, 63, 12, + 251, 68, 240, 125, 63, 12, 251, 64, 240, 125, 63, 12, 251, 63, 240, 125, + 63, 12, 251, 66, 240, 125, 63, 12, 251, 65, 240, 125, 63, 12, 251, 62, + 240, 125, 63, 12, 229, 89, 63, 12, 238, 124, 234, 86, 63, 12, 235, 237, + 234, 86, 63, 12, 253, 74, 234, 86, 63, 12, 252, 206, 234, 86, 63, 12, + 235, 177, 234, 86, 63, 12, 235, 171, 234, 86, 63, 12, 235, 169, 234, 86, + 63, 12, 235, 175, 234, 86, 63, 12, 235, 173, 234, 86, 63, 12, 251, 68, + 234, 86, 63, 12, 251, 64, 234, 86, 63, 12, 251, 63, 234, 86, 63, 12, 251, + 66, 234, 86, 63, 12, 251, 65, 234, 86, 63, 12, 251, 62, 234, 86, 252, + 215, 1, 201, 252, 215, 1, 247, 208, 252, 215, 1, 237, 242, 252, 215, 1, + 237, 224, 252, 215, 1, 236, 142, 252, 215, 1, 253, 166, 252, 215, 1, 222, + 252, 215, 1, 238, 144, 252, 215, 1, 230, 182, 252, 215, 1, 251, 102, 252, + 215, 1, 238, 91, 252, 215, 1, 237, 107, 252, 215, 1, 252, 176, 252, 215, + 1, 241, 107, 252, 215, 1, 237, 57, 252, 215, 1, 237, 55, 252, 215, 1, + 216, 252, 215, 1, 234, 236, 252, 215, 1, 240, 41, 252, 215, 1, 228, 233, + 252, 215, 1, 234, 8, 252, 215, 1, 67, 252, 215, 1, 219, 252, 215, 33, 21, + 71, 252, 215, 33, 21, 79, 252, 215, 33, 21, 72, 252, 215, 33, 21, 73, + 252, 215, 33, 21, 255, 75, 252, 215, 236, 127, 252, 215, 248, 228, 147, + 233, 195, 8, 1, 3, 5, 67, 8, 1, 3, 5, 255, 75, 8, 3, 1, 205, 255, 75, 8, + 1, 3, 5, 253, 140, 217, 8, 1, 3, 5, 252, 178, 8, 1, 3, 5, 209, 8, 1, 3, + 5, 248, 174, 8, 1, 3, 5, 72, 8, 3, 1, 205, 236, 195, 72, 8, 3, 1, 205, + 71, 8, 1, 3, 5, 221, 8, 1, 3, 5, 241, 12, 8, 1, 3, 5, 240, 44, 2, 108, 8, + 1, 3, 5, 173, 8, 1, 3, 5, 224, 197, 8, 1, 3, 5, 73, 8, 1, 3, 5, 236, 195, + 73, 8, 3, 1, 232, 47, 73, 8, 3, 1, 232, 47, 236, 195, 73, 8, 3, 1, 232, + 47, 117, 2, 108, 8, 3, 1, 205, 236, 234, 8, 1, 3, 5, 236, 167, 8, 3, 1, + 229, 208, 137, 73, 8, 3, 1, 252, 250, 137, 73, 8, 1, 3, 5, 223, 8, 1, 3, + 5, 224, 144, 8, 1, 3, 5, 205, 144, 8, 1, 3, 5, 214, 8, 1, 3, 5, 79, 8, 3, + 1, 232, 47, 79, 8, 3, 1, 232, 47, 250, 200, 79, 8, 3, 1, 232, 47, 205, + 173, 8, 1, 3, 5, 179, 8, 1, 3, 5, 228, 144, 8, 1, 3, 5, 227, 103, 8, 1, + 3, 5, 248, 142, 8, 1, 228, 171, 240, 14, 231, 183, 8, 1, 255, 51, 17, 1, + 3, 5, 247, 195, 17, 1, 3, 5, 240, 23, 17, 1, 3, 5, 236, 8, 17, 1, 3, 5, + 234, 147, 17, 1, 3, 5, 235, 134, 32, 1, 3, 5, 248, 250, 49, 1, 5, 67, 49, + 1, 5, 255, 75, 49, 1, 5, 217, 49, 1, 5, 253, 140, 217, 49, 1, 5, 209, 49, + 1, 5, 72, 49, 1, 5, 224, 72, 49, 1, 5, 210, 49, 1, 5, 192, 49, 1, 5, 71, + 49, 1, 5, 221, 49, 1, 5, 241, 12, 49, 1, 5, 162, 49, 1, 5, 173, 49, 1, 5, + 197, 49, 1, 5, 224, 197, 49, 1, 5, 73, 49, 1, 5, 236, 167, 49, 1, 5, 223, + 49, 1, 5, 144, 49, 1, 5, 214, 49, 1, 5, 79, 49, 1, 5, 228, 144, 49, 1, 3, + 67, 49, 1, 3, 205, 67, 49, 1, 3, 255, 21, 49, 1, 3, 205, 255, 75, 49, 1, + 3, 217, 49, 1, 3, 209, 49, 1, 3, 72, 49, 1, 3, 233, 212, 49, 1, 3, 236, + 195, 72, 49, 1, 3, 205, 236, 195, 72, 49, 1, 3, 210, 49, 1, 3, 205, 71, + 49, 1, 3, 241, 12, 49, 1, 3, 173, 49, 1, 3, 248, 224, 49, 1, 3, 73, 49, + 1, 3, 236, 195, 73, 49, 1, 3, 229, 208, 137, 73, 49, 1, 3, 252, 250, 137, + 73, 49, 1, 3, 223, 49, 1, 3, 214, 49, 1, 3, 79, 49, 1, 3, 232, 47, 79, + 49, 1, 3, 205, 173, 49, 1, 3, 179, 49, 1, 3, 255, 51, 49, 1, 3, 253, 53, + 49, 1, 3, 17, 247, 195, 49, 1, 3, 250, 229, 49, 1, 3, 17, 236, 25, 49, 1, + 3, 252, 63, 8, 231, 54, 3, 1, 71, 8, 231, 54, 3, 1, 144, 8, 231, 54, 3, + 1, 79, 8, 231, 54, 3, 1, 179, 17, 231, 54, 3, 1, 253, 53, 17, 231, 54, 3, + 1, 247, 195, 17, 231, 54, 3, 1, 234, 147, 17, 231, 54, 3, 1, 236, 25, 17, + 231, 54, 3, 1, 252, 63, 8, 3, 1, 229, 32, 8, 3, 1, 41, 2, 238, 223, 169, + 8, 3, 1, 251, 104, 2, 238, 223, 169, 8, 3, 1, 248, 141, 2, 238, 223, 169, + 8, 3, 1, 239, 105, 2, 238, 223, 169, 8, 3, 1, 238, 94, 2, 238, 223, 169, + 8, 3, 1, 236, 144, 2, 238, 223, 169, 8, 3, 1, 234, 239, 2, 238, 223, 169, + 8, 3, 1, 234, 239, 2, 248, 52, 19, 238, 223, 169, 8, 3, 1, 234, 11, 2, + 238, 223, 169, 8, 3, 1, 230, 183, 2, 238, 223, 169, 8, 3, 1, 227, 104, 2, + 238, 223, 169, 8, 3, 1, 205, 210, 49, 1, 32, 248, 234, 8, 3, 1, 241, 161, + 210, 8, 3, 1, 230, 90, 2, 231, 80, 8, 3, 5, 1, 220, 2, 108, 8, 3, 1, 241, + 138, 2, 108, 8, 3, 1, 236, 144, 2, 108, 8, 3, 5, 1, 132, 2, 108, 8, 3, 1, + 228, 253, 2, 108, 8, 3, 1, 41, 2, 236, 130, 90, 8, 3, 1, 251, 104, 2, + 236, 130, 90, 8, 3, 1, 248, 141, 2, 236, 130, 90, 8, 3, 1, 247, 209, 2, + 236, 130, 90, 8, 3, 1, 241, 13, 2, 236, 130, 90, 8, 3, 1, 240, 44, 2, + 236, 130, 90, 8, 3, 1, 239, 105, 2, 236, 130, 90, 8, 3, 1, 238, 94, 2, + 236, 130, 90, 8, 3, 1, 236, 144, 2, 236, 130, 90, 8, 3, 1, 234, 239, 2, + 236, 130, 90, 8, 3, 1, 234, 11, 2, 236, 130, 90, 8, 3, 1, 248, 185, 2, + 236, 130, 90, 8, 3, 1, 228, 234, 2, 236, 130, 90, 8, 3, 1, 228, 55, 2, + 236, 130, 90, 8, 3, 1, 227, 104, 2, 236, 130, 90, 8, 3, 1, 134, 2, 234, + 161, 90, 8, 3, 1, 194, 2, 234, 161, 90, 8, 3, 1, 251, 104, 2, 246, 58, + 19, 230, 167, 8, 3, 1, 157, 2, 234, 161, 90, 8, 3, 1, 236, 195, 157, 2, + 234, 161, 90, 8, 3, 1, 224, 236, 195, 157, 2, 234, 161, 90, 8, 3, 1, 233, + 213, 2, 234, 161, 90, 8, 3, 1, 220, 2, 234, 161, 90, 8, 3, 1, 236, 195, + 117, 2, 234, 161, 90, 8, 3, 1, 248, 185, 2, 234, 161, 90, 8, 3, 1, 132, + 2, 234, 161, 90, 8, 3, 1, 248, 143, 2, 234, 161, 90, 49, 1, 3, 205, 255, + 21, 49, 1, 3, 252, 178, 49, 1, 3, 252, 179, 2, 251, 135, 49, 1, 3, 248, + 174, 49, 1, 3, 224, 236, 195, 72, 49, 1, 3, 248, 140, 49, 1, 3, 250, 99, + 241, 109, 2, 108, 49, 1, 3, 84, 210, 49, 1, 3, 205, 192, 49, 1, 3, 220, + 2, 108, 49, 1, 3, 241, 137, 49, 1, 3, 5, 71, 49, 1, 3, 5, 220, 2, 108, + 49, 1, 3, 241, 109, 2, 251, 149, 49, 1, 3, 240, 44, 2, 234, 161, 90, 49, + 1, 3, 240, 44, 2, 236, 130, 90, 49, 1, 3, 5, 162, 49, 1, 3, 239, 105, 2, + 90, 49, 1, 3, 205, 239, 105, 2, 183, 239, 241, 49, 1, 3, 238, 94, 2, 40, + 90, 49, 1, 3, 238, 94, 2, 234, 161, 90, 49, 1, 3, 5, 197, 49, 1, 3, 253, + 140, 73, 49, 1, 3, 236, 25, 49, 1, 3, 234, 11, 2, 90, 49, 1, 3, 248, 184, + 49, 1, 3, 230, 183, 2, 236, 130, 90, 49, 1, 3, 132, 125, 49, 1, 3, 228, + 252, 49, 1, 3, 5, 79, 49, 1, 3, 228, 234, 2, 90, 49, 1, 3, 205, 179, 49, + 1, 3, 227, 103, 49, 1, 3, 227, 104, 2, 234, 161, 90, 49, 1, 3, 227, 104, + 2, 251, 135, 49, 1, 3, 248, 142, 49, 1, 3, 230, 60, 50, 249, 98, 247, 46, + 255, 90, 50, 249, 98, 255, 83, 255, 90, 50, 231, 224, 46, 50, 231, 17, + 69, 8, 5, 1, 134, 2, 234, 108, 46, 8, 3, 1, 134, 2, 234, 108, 46, 8, 5, + 1, 41, 2, 53, 48, 8, 3, 1, 41, 2, 53, 48, 8, 5, 1, 41, 2, 53, 46, 8, 3, + 1, 41, 2, 53, 46, 8, 5, 1, 41, 2, 239, 194, 46, 8, 3, 1, 41, 2, 239, 194, + 46, 8, 5, 1, 252, 179, 2, 252, 116, 19, 135, 8, 3, 1, 252, 179, 2, 252, + 116, 19, 135, 8, 5, 1, 251, 104, 2, 53, 48, 8, 3, 1, 251, 104, 2, 53, 48, + 8, 5, 1, 251, 104, 2, 53, 46, 8, 3, 1, 251, 104, 2, 53, 46, 8, 5, 1, 251, + 104, 2, 239, 194, 46, 8, 3, 1, 251, 104, 2, 239, 194, 46, 8, 5, 1, 251, + 104, 2, 252, 115, 8, 3, 1, 251, 104, 2, 252, 115, 8, 5, 1, 251, 104, 2, + 190, 46, 8, 3, 1, 251, 104, 2, 190, 46, 8, 5, 1, 157, 2, 239, 102, 19, + 191, 8, 3, 1, 157, 2, 239, 102, 19, 191, 8, 5, 1, 157, 2, 239, 102, 19, + 135, 8, 3, 1, 157, 2, 239, 102, 19, 135, 8, 5, 1, 157, 2, 190, 46, 8, 3, + 1, 157, 2, 190, 46, 8, 5, 1, 157, 2, 230, 1, 46, 8, 3, 1, 157, 2, 230, 1, + 46, 8, 5, 1, 157, 2, 252, 116, 19, 252, 231, 8, 3, 1, 157, 2, 252, 116, + 19, 252, 231, 8, 5, 1, 248, 141, 2, 53, 48, 8, 3, 1, 248, 141, 2, 53, 48, + 8, 5, 1, 247, 209, 2, 196, 8, 3, 1, 247, 209, 2, 196, 8, 5, 1, 246, 254, + 2, 53, 48, 8, 3, 1, 246, 254, 2, 53, 48, 8, 5, 1, 246, 254, 2, 53, 46, 8, + 3, 1, 246, 254, 2, 53, 46, 8, 5, 1, 246, 254, 2, 175, 8, 3, 1, 246, 254, + 2, 175, 8, 5, 1, 246, 254, 2, 252, 115, 8, 3, 1, 246, 254, 2, 252, 115, + 8, 5, 1, 246, 254, 2, 252, 232, 46, 8, 3, 1, 246, 254, 2, 252, 232, 46, + 8, 5, 1, 220, 2, 230, 1, 46, 8, 3, 1, 220, 2, 230, 1, 46, 8, 5, 1, 220, + 2, 250, 201, 19, 135, 8, 3, 1, 220, 2, 250, 201, 19, 135, 8, 5, 1, 241, + 13, 2, 135, 8, 3, 1, 241, 13, 2, 135, 8, 5, 1, 241, 13, 2, 53, 46, 8, 3, + 1, 241, 13, 2, 53, 46, 8, 5, 1, 241, 13, 2, 239, 194, 46, 8, 3, 1, 241, + 13, 2, 239, 194, 46, 8, 5, 1, 240, 44, 2, 53, 46, 8, 3, 1, 240, 44, 2, + 53, 46, 8, 5, 1, 240, 44, 2, 53, 253, 68, 19, 196, 8, 3, 1, 240, 44, 2, + 53, 253, 68, 19, 196, 8, 5, 1, 240, 44, 2, 239, 194, 46, 8, 3, 1, 240, + 44, 2, 239, 194, 46, 8, 5, 1, 240, 44, 2, 190, 46, 8, 3, 1, 240, 44, 2, + 190, 46, 8, 5, 1, 239, 105, 2, 135, 8, 3, 1, 239, 105, 2, 135, 8, 5, 1, + 239, 105, 2, 53, 48, 8, 3, 1, 239, 105, 2, 53, 48, 8, 5, 1, 239, 105, 2, + 53, 46, 8, 3, 1, 239, 105, 2, 53, 46, 8, 5, 1, 238, 94, 2, 53, 48, 8, 3, + 1, 238, 94, 2, 53, 48, 8, 5, 1, 238, 94, 2, 53, 46, 8, 3, 1, 238, 94, 2, + 53, 46, 8, 5, 1, 238, 94, 2, 239, 194, 46, 8, 3, 1, 238, 94, 2, 239, 194, + 46, 8, 5, 1, 238, 94, 2, 190, 46, 8, 3, 1, 238, 94, 2, 190, 46, 8, 5, 1, + 117, 2, 230, 1, 19, 135, 8, 3, 1, 117, 2, 230, 1, 19, 135, 8, 5, 1, 117, + 2, 230, 1, 19, 175, 8, 3, 1, 117, 2, 230, 1, 19, 175, 8, 5, 1, 117, 2, + 239, 102, 19, 191, 8, 3, 1, 117, 2, 239, 102, 19, 191, 8, 5, 1, 117, 2, + 239, 102, 19, 135, 8, 3, 1, 117, 2, 239, 102, 19, 135, 8, 5, 1, 236, 144, + 2, 135, 8, 3, 1, 236, 144, 2, 135, 8, 5, 1, 236, 144, 2, 53, 48, 8, 3, 1, + 236, 144, 2, 53, 48, 8, 5, 1, 234, 239, 2, 53, 48, 8, 3, 1, 234, 239, 2, + 53, 48, 8, 5, 1, 234, 239, 2, 53, 46, 8, 3, 1, 234, 239, 2, 53, 46, 8, 5, + 1, 234, 239, 2, 53, 253, 68, 19, 196, 8, 3, 1, 234, 239, 2, 53, 253, 68, + 19, 196, 8, 5, 1, 234, 239, 2, 239, 194, 46, 8, 3, 1, 234, 239, 2, 239, + 194, 46, 8, 5, 1, 234, 11, 2, 53, 48, 8, 3, 1, 234, 11, 2, 53, 48, 8, 5, + 1, 234, 11, 2, 53, 46, 8, 3, 1, 234, 11, 2, 53, 46, 8, 5, 1, 234, 11, 2, + 255, 83, 19, 53, 48, 8, 3, 1, 234, 11, 2, 255, 83, 19, 53, 48, 8, 5, 1, + 234, 11, 2, 252, 149, 19, 53, 48, 8, 3, 1, 234, 11, 2, 252, 149, 19, 53, + 48, 8, 5, 1, 234, 11, 2, 53, 253, 68, 19, 53, 48, 8, 3, 1, 234, 11, 2, + 53, 253, 68, 19, 53, 48, 8, 5, 1, 230, 183, 2, 53, 48, 8, 3, 1, 230, 183, + 2, 53, 48, 8, 5, 1, 230, 183, 2, 53, 46, 8, 3, 1, 230, 183, 2, 53, 46, 8, + 5, 1, 230, 183, 2, 239, 194, 46, 8, 3, 1, 230, 183, 2, 239, 194, 46, 8, + 5, 1, 230, 183, 2, 190, 46, 8, 3, 1, 230, 183, 2, 190, 46, 8, 5, 1, 132, + 2, 250, 201, 46, 8, 3, 1, 132, 2, 250, 201, 46, 8, 5, 1, 132, 2, 230, 1, + 46, 8, 3, 1, 132, 2, 230, 1, 46, 8, 5, 1, 132, 2, 190, 46, 8, 3, 1, 132, + 2, 190, 46, 8, 5, 1, 132, 2, 230, 1, 19, 135, 8, 3, 1, 132, 2, 230, 1, + 19, 135, 8, 5, 1, 132, 2, 239, 102, 19, 175, 8, 3, 1, 132, 2, 239, 102, + 19, 175, 8, 5, 1, 228, 234, 2, 169, 8, 3, 1, 228, 234, 2, 169, 8, 5, 1, + 228, 234, 2, 53, 46, 8, 3, 1, 228, 234, 2, 53, 46, 8, 5, 1, 228, 145, 2, + 191, 8, 3, 1, 228, 145, 2, 191, 8, 5, 1, 228, 145, 2, 135, 8, 3, 1, 228, + 145, 2, 135, 8, 5, 1, 228, 145, 2, 175, 8, 3, 1, 228, 145, 2, 175, 8, 5, + 1, 228, 145, 2, 53, 48, 8, 3, 1, 228, 145, 2, 53, 48, 8, 5, 1, 228, 145, + 2, 53, 46, 8, 3, 1, 228, 145, 2, 53, 46, 8, 5, 1, 228, 55, 2, 53, 48, 8, + 3, 1, 228, 55, 2, 53, 48, 8, 5, 1, 228, 55, 2, 175, 8, 3, 1, 228, 55, 2, + 175, 8, 5, 1, 228, 8, 2, 53, 48, 8, 3, 1, 228, 8, 2, 53, 48, 8, 5, 1, + 227, 104, 2, 252, 2, 8, 3, 1, 227, 104, 2, 252, 2, 8, 5, 1, 227, 104, 2, + 53, 46, 8, 3, 1, 227, 104, 2, 53, 46, 8, 5, 1, 227, 104, 2, 239, 194, 46, + 8, 3, 1, 227, 104, 2, 239, 194, 46, 8, 3, 1, 246, 254, 2, 239, 194, 46, + 8, 3, 1, 230, 183, 2, 175, 8, 3, 1, 228, 145, 2, 234, 108, 48, 8, 3, 1, + 228, 8, 2, 234, 108, 48, 8, 3, 1, 134, 2, 38, 137, 234, 107, 8, 3, 1, + 183, 234, 11, 2, 53, 48, 8, 5, 1, 134, 2, 53, 46, 8, 3, 1, 134, 2, 53, + 46, 8, 5, 1, 134, 2, 246, 58, 48, 8, 3, 1, 134, 2, 246, 58, 48, 8, 5, 1, + 134, 2, 190, 19, 135, 8, 3, 1, 134, 2, 190, 19, 135, 8, 5, 1, 134, 2, + 190, 19, 191, 8, 3, 1, 134, 2, 190, 19, 191, 8, 5, 1, 134, 2, 190, 19, + 246, 58, 48, 8, 3, 1, 134, 2, 190, 19, 246, 58, 48, 8, 5, 1, 134, 2, 190, + 19, 169, 8, 3, 1, 134, 2, 190, 19, 169, 8, 5, 1, 134, 2, 190, 19, 53, 46, + 8, 3, 1, 134, 2, 190, 19, 53, 46, 8, 5, 1, 134, 2, 252, 232, 19, 135, 8, + 3, 1, 134, 2, 252, 232, 19, 135, 8, 5, 1, 134, 2, 252, 232, 19, 191, 8, + 3, 1, 134, 2, 252, 232, 19, 191, 8, 5, 1, 134, 2, 252, 232, 19, 246, 58, + 48, 8, 3, 1, 134, 2, 252, 232, 19, 246, 58, 48, 8, 5, 1, 134, 2, 252, + 232, 19, 169, 8, 3, 1, 134, 2, 252, 232, 19, 169, 8, 5, 1, 134, 2, 252, + 232, 19, 53, 46, 8, 3, 1, 134, 2, 252, 232, 19, 53, 46, 8, 5, 1, 157, 2, + 53, 46, 8, 3, 1, 157, 2, 53, 46, 8, 5, 1, 157, 2, 246, 58, 48, 8, 3, 1, + 157, 2, 246, 58, 48, 8, 5, 1, 157, 2, 169, 8, 3, 1, 157, 2, 169, 8, 5, 1, + 157, 2, 190, 19, 135, 8, 3, 1, 157, 2, 190, 19, 135, 8, 5, 1, 157, 2, + 190, 19, 191, 8, 3, 1, 157, 2, 190, 19, 191, 8, 5, 1, 157, 2, 190, 19, + 246, 58, 48, 8, 3, 1, 157, 2, 190, 19, 246, 58, 48, 8, 5, 1, 157, 2, 190, + 19, 169, 8, 3, 1, 157, 2, 190, 19, 169, 8, 5, 1, 157, 2, 190, 19, 53, 46, + 8, 3, 1, 157, 2, 190, 19, 53, 46, 8, 5, 1, 220, 2, 246, 58, 48, 8, 3, 1, + 220, 2, 246, 58, 48, 8, 5, 1, 220, 2, 53, 46, 8, 3, 1, 220, 2, 53, 46, 8, + 5, 1, 117, 2, 53, 46, 8, 3, 1, 117, 2, 53, 46, 8, 5, 1, 117, 2, 246, 58, + 48, 8, 3, 1, 117, 2, 246, 58, 48, 8, 5, 1, 117, 2, 190, 19, 135, 8, 3, 1, + 117, 2, 190, 19, 135, 8, 5, 1, 117, 2, 190, 19, 191, 8, 3, 1, 117, 2, + 190, 19, 191, 8, 5, 1, 117, 2, 190, 19, 246, 58, 48, 8, 3, 1, 117, 2, + 190, 19, 246, 58, 48, 8, 5, 1, 117, 2, 190, 19, 169, 8, 3, 1, 117, 2, + 190, 19, 169, 8, 5, 1, 117, 2, 190, 19, 53, 46, 8, 3, 1, 117, 2, 190, 19, + 53, 46, 8, 5, 1, 117, 2, 246, 51, 19, 135, 8, 3, 1, 117, 2, 246, 51, 19, + 135, 8, 5, 1, 117, 2, 246, 51, 19, 191, 8, 3, 1, 117, 2, 246, 51, 19, + 191, 8, 5, 1, 117, 2, 246, 51, 19, 246, 58, 48, 8, 3, 1, 117, 2, 246, 51, + 19, 246, 58, 48, 8, 5, 1, 117, 2, 246, 51, 19, 169, 8, 3, 1, 117, 2, 246, + 51, 19, 169, 8, 5, 1, 117, 2, 246, 51, 19, 53, 46, 8, 3, 1, 117, 2, 246, + 51, 19, 53, 46, 8, 5, 1, 132, 2, 53, 46, 8, 3, 1, 132, 2, 53, 46, 8, 5, + 1, 132, 2, 246, 58, 48, 8, 3, 1, 132, 2, 246, 58, 48, 8, 5, 1, 132, 2, + 246, 51, 19, 135, 8, 3, 1, 132, 2, 246, 51, 19, 135, 8, 5, 1, 132, 2, + 246, 51, 19, 191, 8, 3, 1, 132, 2, 246, 51, 19, 191, 8, 5, 1, 132, 2, + 246, 51, 19, 246, 58, 48, 8, 3, 1, 132, 2, 246, 51, 19, 246, 58, 48, 8, + 5, 1, 132, 2, 246, 51, 19, 169, 8, 3, 1, 132, 2, 246, 51, 19, 169, 8, 5, + 1, 132, 2, 246, 51, 19, 53, 46, 8, 3, 1, 132, 2, 246, 51, 19, 53, 46, 8, + 5, 1, 228, 8, 2, 191, 8, 3, 1, 228, 8, 2, 191, 8, 5, 1, 228, 8, 2, 53, + 46, 8, 3, 1, 228, 8, 2, 53, 46, 8, 5, 1, 228, 8, 2, 246, 58, 48, 8, 3, 1, + 228, 8, 2, 246, 58, 48, 8, 5, 1, 228, 8, 2, 169, 8, 3, 1, 228, 8, 2, 169, + 17, 3, 1, 194, 2, 235, 128, 17, 3, 1, 194, 2, 251, 52, 17, 3, 1, 194, 2, + 159, 19, 215, 17, 3, 1, 194, 2, 148, 19, 215, 17, 3, 1, 194, 2, 159, 19, + 212, 17, 3, 1, 194, 2, 148, 19, 212, 17, 3, 1, 194, 2, 159, 19, 236, 50, + 17, 3, 1, 194, 2, 148, 19, 236, 50, 17, 5, 1, 194, 2, 235, 128, 17, 5, 1, + 194, 2, 251, 52, 17, 5, 1, 194, 2, 159, 19, 215, 17, 5, 1, 194, 2, 148, + 19, 215, 17, 5, 1, 194, 2, 159, 19, 212, 17, 5, 1, 194, 2, 148, 19, 212, + 17, 5, 1, 194, 2, 159, 19, 236, 50, 17, 5, 1, 194, 2, 148, 19, 236, 50, + 17, 3, 1, 248, 205, 2, 235, 128, 17, 3, 1, 248, 205, 2, 251, 52, 17, 3, + 1, 248, 205, 2, 159, 19, 215, 17, 3, 1, 248, 205, 2, 148, 19, 215, 17, 3, + 1, 248, 205, 2, 159, 19, 212, 17, 3, 1, 248, 205, 2, 148, 19, 212, 17, 5, + 1, 248, 205, 2, 235, 128, 17, 5, 1, 248, 205, 2, 251, 52, 17, 5, 1, 248, + 205, 2, 159, 19, 215, 17, 5, 1, 248, 205, 2, 148, 19, 215, 17, 5, 1, 248, + 205, 2, 159, 19, 212, 17, 5, 1, 248, 205, 2, 148, 19, 212, 17, 3, 1, 248, + 178, 2, 235, 128, 17, 3, 1, 248, 178, 2, 251, 52, 17, 3, 1, 248, 178, 2, + 159, 19, 215, 17, 3, 1, 248, 178, 2, 148, 19, 215, 17, 3, 1, 248, 178, 2, + 159, 19, 212, 17, 3, 1, 248, 178, 2, 148, 19, 212, 17, 3, 1, 248, 178, 2, + 159, 19, 236, 50, 17, 3, 1, 248, 178, 2, 148, 19, 236, 50, 17, 5, 1, 248, + 178, 2, 235, 128, 17, 5, 1, 248, 178, 2, 251, 52, 17, 5, 1, 248, 178, 2, + 159, 19, 215, 17, 5, 1, 248, 178, 2, 148, 19, 215, 17, 5, 1, 248, 178, 2, + 159, 19, 212, 17, 5, 1, 248, 178, 2, 148, 19, 212, 17, 5, 1, 248, 178, 2, + 159, 19, 236, 50, 17, 5, 1, 248, 178, 2, 148, 19, 236, 50, 17, 3, 1, 241, + 138, 2, 235, 128, 17, 3, 1, 241, 138, 2, 251, 52, 17, 3, 1, 241, 138, 2, + 159, 19, 215, 17, 3, 1, 241, 138, 2, 148, 19, 215, 17, 3, 1, 241, 138, 2, + 159, 19, 212, 17, 3, 1, 241, 138, 2, 148, 19, 212, 17, 3, 1, 241, 138, 2, + 159, 19, 236, 50, 17, 3, 1, 241, 138, 2, 148, 19, 236, 50, 17, 5, 1, 241, + 138, 2, 235, 128, 17, 5, 1, 241, 138, 2, 251, 52, 17, 5, 1, 241, 138, 2, + 159, 19, 215, 17, 5, 1, 241, 138, 2, 148, 19, 215, 17, 5, 1, 241, 138, 2, + 159, 19, 212, 17, 5, 1, 241, 138, 2, 148, 19, 212, 17, 5, 1, 241, 138, 2, + 159, 19, 236, 50, 17, 5, 1, 241, 138, 2, 148, 19, 236, 50, 17, 3, 1, 236, + 215, 2, 235, 128, 17, 3, 1, 236, 215, 2, 251, 52, 17, 3, 1, 236, 215, 2, + 159, 19, 215, 17, 3, 1, 236, 215, 2, 148, 19, 215, 17, 3, 1, 236, 215, 2, + 159, 19, 212, 17, 3, 1, 236, 215, 2, 148, 19, 212, 17, 5, 1, 236, 215, 2, + 235, 128, 17, 5, 1, 236, 215, 2, 251, 52, 17, 5, 1, 236, 215, 2, 159, 19, + 215, 17, 5, 1, 236, 215, 2, 148, 19, 215, 17, 5, 1, 236, 215, 2, 159, 19, + 212, 17, 5, 1, 236, 215, 2, 148, 19, 212, 17, 3, 1, 228, 253, 2, 235, + 128, 17, 3, 1, 228, 253, 2, 251, 52, 17, 3, 1, 228, 253, 2, 159, 19, 215, + 17, 3, 1, 228, 253, 2, 148, 19, 215, 17, 3, 1, 228, 253, 2, 159, 19, 212, + 17, 3, 1, 228, 253, 2, 148, 19, 212, 17, 3, 1, 228, 253, 2, 159, 19, 236, + 50, 17, 3, 1, 228, 253, 2, 148, 19, 236, 50, 17, 5, 1, 228, 253, 2, 251, + 52, 17, 5, 1, 228, 253, 2, 148, 19, 215, 17, 5, 1, 228, 253, 2, 148, 19, + 212, 17, 5, 1, 228, 253, 2, 148, 19, 236, 50, 17, 3, 1, 211, 2, 235, 128, + 17, 3, 1, 211, 2, 251, 52, 17, 3, 1, 211, 2, 159, 19, 215, 17, 3, 1, 211, + 2, 148, 19, 215, 17, 3, 1, 211, 2, 159, 19, 212, 17, 3, 1, 211, 2, 148, + 19, 212, 17, 3, 1, 211, 2, 159, 19, 236, 50, 17, 3, 1, 211, 2, 148, 19, + 236, 50, 17, 5, 1, 211, 2, 235, 128, 17, 5, 1, 211, 2, 251, 52, 17, 5, 1, + 211, 2, 159, 19, 215, 17, 5, 1, 211, 2, 148, 19, 215, 17, 5, 1, 211, 2, + 159, 19, 212, 17, 5, 1, 211, 2, 148, 19, 212, 17, 5, 1, 211, 2, 159, 19, + 236, 50, 17, 5, 1, 211, 2, 148, 19, 236, 50, 17, 3, 1, 194, 2, 215, 17, + 3, 1, 194, 2, 212, 17, 3, 1, 248, 205, 2, 215, 17, 3, 1, 248, 205, 2, + 212, 17, 3, 1, 248, 178, 2, 215, 17, 3, 1, 248, 178, 2, 212, 17, 3, 1, + 241, 138, 2, 215, 17, 3, 1, 241, 138, 2, 212, 17, 3, 1, 236, 215, 2, 215, + 17, 3, 1, 236, 215, 2, 212, 17, 3, 1, 228, 253, 2, 215, 17, 3, 1, 228, + 253, 2, 212, 17, 3, 1, 211, 2, 215, 17, 3, 1, 211, 2, 212, 17, 3, 1, 194, + 2, 159, 19, 227, 149, 17, 3, 1, 194, 2, 148, 19, 227, 149, 17, 3, 1, 194, + 2, 159, 19, 228, 225, 19, 227, 149, 17, 3, 1, 194, 2, 148, 19, 228, 225, + 19, 227, 149, 17, 3, 1, 194, 2, 159, 19, 236, 148, 19, 227, 149, 17, 3, + 1, 194, 2, 148, 19, 236, 148, 19, 227, 149, 17, 3, 1, 194, 2, 159, 19, + 236, 51, 19, 227, 149, 17, 3, 1, 194, 2, 148, 19, 236, 51, 19, 227, 149, + 17, 5, 1, 194, 2, 159, 19, 235, 139, 17, 5, 1, 194, 2, 148, 19, 235, 139, + 17, 5, 1, 194, 2, 159, 19, 228, 225, 19, 235, 139, 17, 5, 1, 194, 2, 148, + 19, 228, 225, 19, 235, 139, 17, 5, 1, 194, 2, 159, 19, 236, 148, 19, 235, + 139, 17, 5, 1, 194, 2, 148, 19, 236, 148, 19, 235, 139, 17, 5, 1, 194, 2, + 159, 19, 236, 51, 19, 235, 139, 17, 5, 1, 194, 2, 148, 19, 236, 51, 19, + 235, 139, 17, 3, 1, 248, 178, 2, 159, 19, 227, 149, 17, 3, 1, 248, 178, + 2, 148, 19, 227, 149, 17, 3, 1, 248, 178, 2, 159, 19, 228, 225, 19, 227, + 149, 17, 3, 1, 248, 178, 2, 148, 19, 228, 225, 19, 227, 149, 17, 3, 1, + 248, 178, 2, 159, 19, 236, 148, 19, 227, 149, 17, 3, 1, 248, 178, 2, 148, + 19, 236, 148, 19, 227, 149, 17, 3, 1, 248, 178, 2, 159, 19, 236, 51, 19, + 227, 149, 17, 3, 1, 248, 178, 2, 148, 19, 236, 51, 19, 227, 149, 17, 5, + 1, 248, 178, 2, 159, 19, 235, 139, 17, 5, 1, 248, 178, 2, 148, 19, 235, + 139, 17, 5, 1, 248, 178, 2, 159, 19, 228, 225, 19, 235, 139, 17, 5, 1, + 248, 178, 2, 148, 19, 228, 225, 19, 235, 139, 17, 5, 1, 248, 178, 2, 159, + 19, 236, 148, 19, 235, 139, 17, 5, 1, 248, 178, 2, 148, 19, 236, 148, 19, + 235, 139, 17, 5, 1, 248, 178, 2, 159, 19, 236, 51, 19, 235, 139, 17, 5, + 1, 248, 178, 2, 148, 19, 236, 51, 19, 235, 139, 17, 3, 1, 211, 2, 159, + 19, 227, 149, 17, 3, 1, 211, 2, 148, 19, 227, 149, 17, 3, 1, 211, 2, 159, + 19, 228, 225, 19, 227, 149, 17, 3, 1, 211, 2, 148, 19, 228, 225, 19, 227, + 149, 17, 3, 1, 211, 2, 159, 19, 236, 148, 19, 227, 149, 17, 3, 1, 211, 2, + 148, 19, 236, 148, 19, 227, 149, 17, 3, 1, 211, 2, 159, 19, 236, 51, 19, + 227, 149, 17, 3, 1, 211, 2, 148, 19, 236, 51, 19, 227, 149, 17, 5, 1, + 211, 2, 159, 19, 235, 139, 17, 5, 1, 211, 2, 148, 19, 235, 139, 17, 5, 1, + 211, 2, 159, 19, 228, 225, 19, 235, 139, 17, 5, 1, 211, 2, 148, 19, 228, + 225, 19, 235, 139, 17, 5, 1, 211, 2, 159, 19, 236, 148, 19, 235, 139, 17, + 5, 1, 211, 2, 148, 19, 236, 148, 19, 235, 139, 17, 5, 1, 211, 2, 159, 19, + 236, 51, 19, 235, 139, 17, 5, 1, 211, 2, 148, 19, 236, 51, 19, 235, 139, + 17, 3, 1, 194, 2, 228, 160, 17, 3, 1, 194, 2, 196, 17, 3, 1, 194, 2, 228, + 225, 19, 227, 149, 17, 3, 1, 194, 2, 227, 149, 17, 3, 1, 194, 2, 236, + 148, 19, 227, 149, 17, 3, 1, 194, 2, 236, 50, 17, 3, 1, 194, 2, 236, 51, + 19, 227, 149, 17, 5, 1, 194, 2, 228, 160, 17, 5, 1, 194, 2, 196, 17, 5, + 1, 194, 2, 215, 17, 5, 1, 194, 2, 212, 17, 5, 1, 194, 2, 235, 139, 17, + 240, 109, 17, 235, 139, 17, 235, 128, 17, 236, 50, 17, 250, 196, 19, 236, + 50, 17, 3, 1, 248, 178, 2, 228, 225, 19, 227, 149, 17, 3, 1, 248, 178, 2, + 227, 149, 17, 3, 1, 248, 178, 2, 236, 148, 19, 227, 149, 17, 3, 1, 248, + 178, 2, 236, 50, 17, 3, 1, 248, 178, 2, 236, 51, 19, 227, 149, 17, 5, 1, + 248, 205, 2, 215, 17, 5, 1, 248, 205, 2, 212, 17, 5, 1, 248, 178, 2, 215, + 17, 5, 1, 248, 178, 2, 212, 17, 5, 1, 248, 178, 2, 235, 139, 17, 159, 19, + 215, 17, 159, 19, 212, 17, 159, 19, 236, 50, 17, 3, 1, 241, 138, 2, 228, + 160, 17, 3, 1, 241, 138, 2, 196, 17, 3, 1, 241, 138, 2, 250, 196, 19, + 215, 17, 3, 1, 241, 138, 2, 250, 196, 19, 212, 17, 3, 1, 241, 138, 2, + 236, 50, 17, 3, 1, 241, 138, 2, 250, 196, 19, 236, 50, 17, 5, 1, 241, + 138, 2, 228, 160, 17, 5, 1, 241, 138, 2, 196, 17, 5, 1, 241, 138, 2, 215, + 17, 5, 1, 241, 138, 2, 212, 17, 148, 19, 215, 17, 148, 19, 212, 17, 148, + 19, 236, 50, 17, 3, 1, 228, 253, 2, 228, 160, 17, 3, 1, 228, 253, 2, 196, + 17, 3, 1, 228, 253, 2, 250, 196, 19, 215, 17, 3, 1, 228, 253, 2, 250, + 196, 19, 212, 17, 3, 1, 234, 148, 2, 235, 128, 17, 3, 1, 234, 148, 2, + 251, 52, 17, 3, 1, 228, 253, 2, 236, 50, 17, 3, 1, 228, 253, 2, 250, 196, + 19, 236, 50, 17, 5, 1, 228, 253, 2, 228, 160, 17, 5, 1, 228, 253, 2, 196, + 17, 5, 1, 228, 253, 2, 215, 17, 5, 1, 228, 253, 2, 212, 17, 5, 1, 234, + 148, 2, 251, 52, 17, 250, 196, 19, 215, 17, 250, 196, 19, 212, 17, 215, + 17, 3, 1, 211, 2, 228, 225, 19, 227, 149, 17, 3, 1, 211, 2, 227, 149, 17, + 3, 1, 211, 2, 236, 148, 19, 227, 149, 17, 3, 1, 211, 2, 236, 50, 17, 3, + 1, 211, 2, 236, 51, 19, 227, 149, 17, 5, 1, 236, 215, 2, 215, 17, 5, 1, + 236, 215, 2, 212, 17, 5, 1, 211, 2, 215, 17, 5, 1, 211, 2, 212, 17, 5, 1, + 211, 2, 235, 139, 17, 212, 17, 251, 52, 248, 235, 235, 35, 248, 242, 235, + 35, 248, 235, 231, 193, 248, 242, 231, 193, 230, 27, 231, 193, 247, 254, + 231, 193, 232, 3, 231, 193, 248, 72, 231, 193, 235, 122, 231, 193, 230, + 52, 231, 193, 246, 241, 231, 193, 227, 81, 228, 89, 231, 193, 227, 81, + 228, 89, 237, 131, 227, 81, 228, 89, 241, 43, 239, 243, 69, 234, 115, 69, + 245, 248, 237, 132, 245, 248, 248, 72, 251, 54, 248, 235, 251, 54, 248, + 242, 251, 54, 163, 125, 45, 59, 239, 193, 45, 170, 239, 193, 40, 232, 29, + 235, 13, 69, 38, 232, 29, 235, 13, 69, 232, 29, 239, 140, 235, 13, 69, + 232, 29, 246, 157, 235, 13, 69, 40, 45, 235, 13, 69, 38, 45, 235, 13, 69, + 45, 239, 140, 235, 13, 69, 45, 246, 157, 235, 13, 69, 251, 91, 45, 251, + 91, 252, 210, 229, 179, 252, 210, 236, 210, 53, 239, 253, 171, 53, 239, + 253, 163, 248, 243, 245, 246, 235, 201, 239, 194, 232, 166, 236, 118, + 232, 166, 239, 243, 248, 240, 234, 115, 248, 240, 235, 191, 250, 150, + 248, 6, 239, 243, 236, 153, 234, 115, 236, 153, 238, 70, 237, 137, 231, + 193, 236, 57, 238, 200, 52, 236, 57, 230, 113, 230, 33, 52, 235, 156, 45, + 235, 156, 229, 170, 235, 156, 224, 235, 156, 224, 45, 235, 156, 224, 229, + 170, 235, 156, 252, 150, 232, 29, 239, 247, 185, 235, 13, 69, 232, 29, + 234, 119, 185, 235, 13, 69, 234, 188, 69, 45, 248, 156, 69, 241, 150, + 236, 154, 229, 14, 99, 230, 11, 252, 151, 241, 164, 235, 201, 254, 157, + 245, 249, 252, 210, 247, 248, 231, 239, 40, 31, 252, 239, 2, 235, 19, 38, + 31, 252, 239, 2, 235, 19, 45, 235, 23, 69, 235, 23, 248, 156, 69, 248, + 156, 235, 23, 69, 229, 244, 21, 248, 179, 224, 235, 233, 52, 86, 139, + 252, 210, 86, 77, 252, 210, 170, 254, 159, 224, 232, 176, 251, 240, 229, + 0, 171, 254, 158, 255, 32, 228, 199, 251, 213, 238, 192, 52, 231, 0, 251, + 54, 241, 143, 229, 14, 248, 27, 235, 122, 69, 204, 53, 235, 121, 235, 32, + 235, 156, 248, 0, 53, 235, 121, 248, 48, 53, 235, 121, 171, 53, 235, 121, + 248, 0, 53, 69, 249, 98, 251, 152, 229, 178, 59, 248, 0, 250, 98, 239, + 33, 10, 231, 193, 228, 72, 241, 43, 247, 229, 254, 219, 241, 142, 229, + 253, 241, 142, 232, 166, 241, 173, 230, 207, 231, 10, 255, 85, 230, 207, + 231, 10, 241, 173, 11, 248, 7, 232, 133, 255, 85, 11, 248, 7, 232, 133, + 238, 67, 26, 232, 134, 237, 133, 26, 232, 134, 231, 28, 227, 80, 231, 28, + 8, 3, 1, 71, 231, 28, 177, 231, 28, 176, 231, 28, 187, 231, 28, 203, 231, + 28, 195, 231, 28, 202, 231, 28, 235, 214, 52, 231, 28, 238, 191, 231, 28, + 248, 202, 52, 231, 28, 40, 236, 106, 231, 28, 38, 236, 106, 231, 28, 8, + 3, 1, 197, 231, 54, 227, 80, 231, 54, 127, 231, 54, 111, 231, 54, 166, + 231, 54, 177, 231, 54, 176, 231, 54, 187, 231, 54, 203, 231, 54, 195, + 231, 54, 202, 231, 54, 235, 214, 52, 231, 54, 238, 191, 231, 54, 248, + 202, 52, 231, 54, 40, 236, 106, 231, 54, 38, 236, 106, 8, 231, 54, 3, 1, + 67, 8, 231, 54, 3, 1, 72, 8, 231, 54, 3, 1, 73, 8, 231, 54, 3, 1, 206, 8, + 231, 54, 3, 1, 233, 212, 248, 166, 52, 251, 220, 52, 251, 146, 52, 247, + 242, 247, 244, 52, 239, 182, 52, 238, 201, 52, 238, 80, 52, 236, 42, 52, + 234, 30, 52, 228, 78, 52, 116, 232, 114, 52, 250, 104, 52, 248, 167, 52, + 240, 159, 52, 229, 104, 52, 249, 83, 52, 247, 156, 236, 61, 52, 236, 41, + 52, 247, 31, 52, 254, 136, 52, 246, 38, 52, 252, 117, 52, 50, 40, 186, + 48, 50, 38, 186, 48, 50, 183, 59, 239, 194, 236, 155, 50, 232, 93, 59, + 239, 194, 236, 155, 50, 254, 244, 65, 48, 50, 251, 241, 65, 48, 50, 40, + 65, 48, 50, 38, 65, 48, 50, 234, 108, 236, 155, 50, 251, 241, 234, 108, + 236, 155, 50, 254, 244, 234, 108, 236, 155, 50, 204, 181, 48, 50, 248, 0, + 181, 48, 50, 248, 231, 252, 5, 50, 248, 231, 231, 171, 50, 248, 231, 250, + 192, 50, 248, 231, 218, 253, 160, 50, 40, 38, 65, 48, 50, 248, 231, 233, + 208, 50, 248, 231, 240, 197, 50, 248, 231, 228, 250, 235, 198, 229, 182, + 50, 234, 158, 231, 209, 236, 155, 50, 45, 59, 231, 79, 236, 155, 50, 254, + 249, 91, 50, 229, 170, 229, 16, 50, 228, 91, 252, 228, 48, 50, 139, 65, + 236, 155, 50, 183, 45, 231, 209, 236, 155, 255, 88, 236, 233, 255, 80, + 153, 230, 77, 231, 57, 138, 5, 252, 178, 250, 243, 252, 111, 252, 108, + 239, 194, 91, 252, 152, 236, 233, 252, 173, 229, 20, 248, 168, 251, 193, + 233, 206, 250, 243, 248, 126, 84, 3, 210, 84, 5, 192, 253, 13, 5, 192, + 138, 5, 192, 235, 218, 251, 193, 235, 218, 251, 194, 236, 159, 171, 236, + 8, 84, 5, 71, 253, 13, 5, 71, 84, 5, 162, 84, 3, 162, 240, 44, 41, 253, + 144, 91, 138, 5, 197, 237, 76, 52, 231, 202, 234, 197, 251, 175, 84, 5, + 223, 138, 5, 223, 138, 5, 235, 93, 84, 5, 144, 253, 13, 5, 144, 138, 5, + 144, 235, 160, 230, 164, 234, 165, 232, 162, 69, 230, 118, 52, 229, 196, + 158, 52, 228, 202, 138, 5, 227, 103, 236, 166, 52, 236, 228, 52, 241, + 143, 236, 228, 52, 253, 13, 5, 227, 103, 205, 17, 3, 1, 241, 137, 240, + 211, 52, 254, 255, 52, 84, 5, 217, 253, 13, 5, 252, 178, 248, 182, 91, + 84, 3, 72, 84, 5, 72, 84, 5, 248, 140, 205, 5, 248, 140, 84, 5, 173, 84, + 3, 73, 83, 91, 253, 56, 91, 247, 88, 91, 251, 79, 91, 241, 177, 231, 200, + 234, 78, 5, 235, 93, 248, 128, 52, 138, 3, 236, 8, 138, 3, 247, 195, 138, + 5, 247, 195, 138, 5, 236, 8, 138, 238, 93, 231, 37, 205, 27, 5, 210, 205, + 27, 5, 162, 224, 27, 5, 162, 205, 27, 5, 228, 7, 138, 24, 5, 209, 138, + 24, 3, 209, 138, 24, 3, 72, 138, 24, 3, 71, 138, 24, 3, 221, 235, 142, + 239, 193, 205, 255, 11, 236, 57, 52, 228, 158, 247, 248, 236, 210, 230, + 50, 228, 158, 247, 248, 171, 230, 48, 228, 158, 247, 248, 236, 210, 248, + 77, 228, 158, 247, 248, 171, 248, 76, 228, 158, 247, 248, 204, 248, 76, + 228, 158, 247, 248, 248, 0, 248, 76, 228, 158, 247, 248, 236, 210, 231, + 254, 228, 158, 247, 248, 248, 48, 231, 253, 228, 158, 247, 248, 236, 210, + 249, 7, 228, 158, 247, 248, 204, 249, 5, 228, 158, 247, 248, 248, 48, + 249, 5, 228, 158, 247, 248, 232, 158, 249, 5, 247, 248, 237, 77, 127, + 234, 85, 178, 127, 234, 85, 178, 111, 234, 85, 178, 166, 234, 85, 178, + 177, 234, 85, 178, 176, 234, 85, 178, 187, 234, 85, 178, 203, 234, 85, + 178, 195, 234, 85, 178, 202, 234, 85, 178, 230, 112, 234, 85, 178, 248, + 245, 234, 85, 178, 229, 81, 234, 85, 178, 248, 74, 234, 85, 178, 236, + 210, 246, 31, 234, 85, 178, 248, 48, 246, 31, 234, 85, 178, 236, 210, + 230, 32, 3, 234, 85, 178, 127, 3, 234, 85, 178, 111, 3, 234, 85, 178, + 166, 3, 234, 85, 178, 177, 3, 234, 85, 178, 176, 3, 234, 85, 178, 187, 3, + 234, 85, 178, 203, 3, 234, 85, 178, 195, 3, 234, 85, 178, 202, 3, 234, + 85, 178, 230, 112, 3, 234, 85, 178, 248, 245, 3, 234, 85, 178, 229, 81, + 3, 234, 85, 178, 248, 74, 3, 234, 85, 178, 236, 210, 246, 31, 3, 234, 85, + 178, 248, 48, 246, 31, 3, 234, 85, 178, 236, 210, 230, 32, 234, 85, 178, + 236, 210, 230, 33, 252, 179, 209, 234, 85, 178, 248, 48, 230, 32, 234, + 85, 178, 230, 113, 230, 32, 234, 85, 178, 224, 236, 210, 246, 31, 139, + 56, 226, 226, 56, 77, 56, 249, 86, 56, 40, 38, 56, 88, 92, 56, 237, 122, + 228, 104, 56, 237, 122, 249, 29, 56, 231, 199, 249, 29, 56, 231, 199, + 228, 104, 56, 139, 65, 2, 108, 77, 65, 2, 108, 139, 228, 119, 56, 77, + 228, 119, 56, 139, 171, 246, 206, 56, 226, 226, 171, 246, 206, 56, 77, + 171, 246, 206, 56, 249, 86, 171, 246, 206, 56, 139, 65, 2, 230, 167, 77, + 65, 2, 230, 167, 139, 65, 247, 237, 125, 226, 226, 65, 247, 237, 125, 77, + 65, 247, 237, 125, 249, 86, 65, 247, 237, 125, 88, 92, 65, 2, 253, 133, + 139, 65, 2, 90, 77, 65, 2, 90, 139, 65, 2, 239, 148, 77, 65, 2, 239, 148, + 40, 38, 228, 119, 56, 40, 38, 65, 2, 108, 249, 86, 227, 37, 56, 226, 226, + 65, 2, 229, 249, 239, 242, 226, 226, 65, 2, 229, 249, 234, 113, 249, 86, + 65, 2, 229, 249, 239, 242, 249, 86, 65, 2, 229, 249, 234, 113, 77, 65, 2, + 251, 174, 249, 85, 249, 86, 65, 2, 251, 174, 239, 242, 254, 244, 229, + 208, 232, 179, 56, 251, 241, 229, 208, 232, 179, 56, 237, 122, 228, 104, + 65, 153, 183, 125, 139, 65, 153, 253, 144, 236, 159, 77, 65, 153, 125, + 254, 244, 236, 195, 218, 56, 251, 241, 236, 195, 218, 56, 139, 186, 2, + 154, 228, 248, 139, 186, 2, 154, 249, 85, 226, 226, 186, 2, 154, 234, + 113, 226, 226, 186, 2, 154, 239, 242, 77, 186, 2, 154, 228, 248, 77, 186, + 2, 154, 249, 85, 249, 86, 186, 2, 154, 234, 113, 249, 86, 186, 2, 154, + 239, 242, 77, 65, 236, 159, 139, 56, 226, 226, 65, 139, 147, 249, 86, 56, + 139, 65, 236, 159, 77, 56, 139, 236, 133, 254, 173, 226, 226, 236, 133, + 254, 173, 77, 236, 133, 254, 173, 249, 86, 236, 133, 254, 173, 139, 186, + 236, 159, 77, 246, 222, 77, 186, 236, 159, 139, 246, 222, 139, 45, 65, 2, + 108, 40, 38, 45, 65, 2, 108, 77, 45, 65, 2, 108, 139, 45, 56, 226, 226, + 45, 56, 77, 45, 56, 249, 86, 45, 56, 40, 38, 45, 56, 88, 92, 45, 56, 237, + 122, 228, 104, 45, 56, 237, 122, 249, 29, 45, 56, 231, 199, 249, 29, 45, + 56, 231, 199, 228, 104, 45, 56, 139, 229, 170, 56, 77, 229, 170, 56, 139, + 231, 166, 56, 77, 231, 166, 56, 226, 226, 65, 2, 45, 108, 249, 86, 65, 2, + 45, 108, 139, 251, 53, 56, 226, 226, 251, 53, 56, 77, 251, 53, 56, 249, + 86, 251, 53, 56, 139, 65, 153, 125, 77, 65, 153, 125, 139, 64, 56, 226, + 226, 64, 56, 77, 64, 56, 249, 86, 64, 56, 226, 226, 64, 65, 247, 237, + 125, 226, 226, 64, 65, 236, 212, 236, 75, 226, 226, 64, 65, 236, 212, + 236, 76, 2, 163, 125, 226, 226, 64, 65, 236, 212, 236, 76, 2, 59, 125, + 226, 226, 64, 45, 56, 226, 226, 64, 45, 65, 236, 212, 236, 75, 77, 64, + 65, 247, 237, 228, 135, 237, 122, 228, 104, 65, 153, 251, 173, 231, 199, + 249, 29, 65, 153, 251, 173, 88, 92, 64, 56, 38, 65, 2, 3, 252, 5, 249, + 86, 65, 139, 147, 226, 226, 56, 204, 77, 254, 173, 139, 65, 2, 59, 108, + 77, 65, 2, 59, 108, 40, 38, 65, 2, 59, 108, 139, 65, 2, 45, 59, 108, 77, + 65, 2, 45, 59, 108, 40, 38, 65, 2, 45, 59, 108, 139, 236, 193, 56, 77, + 236, 193, 56, 40, 38, 236, 193, 56, 28, 255, 30, 251, 210, 236, 102, 250, + 179, 230, 68, 248, 153, 230, 68, 250, 110, 161, 248, 154, 248, 236, 232, + 159, 241, 186, 238, 85, 248, 247, 236, 233, 161, 255, 9, 248, 247, 236, + 233, 3, 248, 247, 236, 233, 251, 189, 254, 168, 239, 18, 250, 110, 161, + 251, 191, 254, 168, 239, 18, 3, 251, 189, 254, 168, 239, 18, 248, 228, + 147, 235, 144, 238, 93, 235, 151, 238, 93, 251, 178, 238, 93, 231, 37, + 238, 192, 52, 238, 190, 52, 53, 235, 213, 250, 133, 231, 239, 232, 160, + 238, 191, 254, 160, 236, 188, 234, 108, 236, 188, 252, 211, 236, 188, 31, + 234, 81, 251, 143, 234, 81, 247, 250, 234, 81, 235, 140, 87, 241, 179, + 38, 255, 0, 255, 0, 239, 37, 255, 0, 231, 186, 255, 0, 250, 135, 250, + 110, 161, 250, 138, 236, 111, 87, 161, 236, 111, 87, 239, 162, 255, 4, + 239, 162, 236, 183, 241, 147, 229, 11, 241, 159, 45, 241, 159, 229, 170, + 241, 159, 251, 185, 241, 159, 231, 21, 241, 159, 228, 167, 241, 159, 251, + 241, 241, 159, 251, 241, 251, 185, 241, 159, 254, 244, 251, 185, 241, + 159, 230, 67, 253, 86, 234, 210, 235, 141, 53, 238, 191, 248, 157, 247, + 162, 235, 141, 246, 61, 230, 1, 236, 188, 224, 169, 241, 143, 240, 3, + 193, 232, 30, 228, 118, 228, 66, 235, 151, 161, 169, 238, 192, 169, 254, + 155, 95, 87, 161, 254, 155, 95, 87, 254, 215, 95, 87, 254, 215, 252, 198, + 161, 255, 84, 95, 87, 238, 3, 254, 215, 237, 125, 255, 84, 95, 87, 255, + 24, 95, 87, 161, 255, 24, 95, 87, 255, 24, 95, 128, 95, 87, 229, 170, + 169, 255, 31, 95, 87, 248, 198, 87, 247, 161, 248, 198, 87, 250, 180, + 253, 50, 254, 217, 230, 77, 239, 197, 247, 161, 95, 87, 254, 215, 95, + 153, 128, 230, 77, 241, 202, 236, 233, 241, 202, 147, 128, 254, 215, 95, + 87, 251, 220, 248, 201, 248, 202, 251, 219, 234, 108, 241, 193, 95, 87, + 234, 108, 95, 87, 251, 167, 87, 248, 181, 248, 200, 87, 231, 113, 248, + 201, 250, 230, 95, 87, 95, 153, 252, 189, 250, 244, 239, 37, 252, 188, + 235, 21, 95, 87, 161, 95, 87, 245, 219, 87, 161, 245, 219, 87, 231, 82, + 248, 198, 87, 239, 228, 128, 95, 87, 247, 43, 128, 95, 87, 239, 228, 236, + 159, 95, 87, 247, 43, 236, 159, 95, 87, 239, 228, 252, 198, 161, 95, 87, + 247, 43, 252, 198, 161, 95, 87, 238, 139, 239, 227, 238, 139, 247, 42, + 253, 50, 161, 248, 198, 87, 161, 239, 227, 161, 247, 42, 238, 3, 239, + 228, 237, 125, 95, 87, 238, 3, 247, 43, 237, 125, 95, 87, 239, 228, 128, + 248, 198, 87, 247, 43, 128, 248, 198, 87, 238, 3, 239, 228, 237, 125, + 248, 198, 87, 238, 3, 247, 43, 237, 125, 248, 198, 87, 239, 228, 128, + 247, 42, 247, 43, 128, 239, 227, 238, 3, 239, 228, 237, 125, 247, 42, + 238, 3, 247, 43, 237, 125, 239, 227, 235, 163, 231, 44, 235, 164, 128, + 95, 87, 231, 45, 128, 95, 87, 235, 164, 128, 248, 198, 87, 231, 45, 128, + 248, 198, 87, 250, 110, 161, 235, 166, 250, 110, 161, 231, 46, 231, 53, + 236, 233, 231, 27, 236, 233, 161, 134, 231, 53, 236, 233, 161, 134, 231, + 27, 236, 233, 231, 53, 147, 128, 95, 87, 231, 27, 147, 128, 95, 87, 238, + 3, 134, 231, 53, 147, 237, 125, 95, 87, 238, 3, 134, 231, 27, 147, 237, + 125, 95, 87, 231, 53, 147, 2, 161, 95, 87, 231, 27, 147, 2, 161, 95, 87, + 238, 130, 238, 131, 238, 132, 238, 131, 229, 11, 31, 241, 202, 236, 233, + 31, 236, 180, 236, 233, 31, 241, 202, 147, 128, 95, 87, 31, 236, 180, + 147, 128, 95, 87, 31, 252, 156, 31, 251, 137, 29, 235, 213, 29, 238, 191, + 29, 229, 253, 29, 250, 133, 231, 239, 29, 53, 236, 188, 29, 234, 108, + 236, 188, 29, 254, 160, 236, 188, 29, 248, 201, 29, 251, 54, 231, 170, + 235, 213, 231, 170, 238, 191, 231, 170, 229, 253, 231, 170, 53, 236, 188, + 38, 230, 174, 40, 230, 174, 92, 230, 174, 88, 230, 174, 254, 162, 238, + 172, 229, 155, 248, 11, 229, 170, 59, 253, 144, 38, 229, 94, 45, 59, 253, + 144, 45, 38, 229, 94, 250, 110, 161, 235, 136, 161, 229, 155, 250, 110, + 161, 248, 12, 238, 6, 45, 59, 253, 144, 45, 38, 229, 94, 235, 164, 229, + 18, 234, 183, 231, 45, 229, 18, 234, 183, 237, 123, 231, 60, 236, 233, + 251, 189, 254, 168, 237, 123, 231, 59, 237, 123, 231, 60, 147, 128, 95, + 87, 251, 189, 254, 168, 237, 123, 231, 60, 128, 95, 87, 236, 180, 236, + 233, 241, 202, 236, 233, 238, 135, 246, 184, 251, 198, 239, 50, 241, 156, + 228, 34, 238, 76, 237, 124, 38, 185, 2, 254, 202, 38, 229, 182, 238, 93, + 239, 162, 255, 4, 238, 93, 239, 162, 236, 183, 238, 93, 241, 147, 238, + 93, 229, 11, 250, 193, 236, 188, 53, 236, 188, 231, 113, 236, 188, 250, + 133, 229, 253, 252, 243, 40, 237, 123, 248, 127, 232, 175, 235, 151, 38, + 237, 123, 248, 127, 232, 175, 235, 151, 40, 232, 175, 235, 151, 38, 232, + 175, 235, 151, 224, 230, 1, 248, 201, 251, 134, 239, 162, 236, 183, 251, + 134, 239, 162, 255, 4, 45, 231, 52, 45, 231, 26, 45, 241, 147, 45, 229, + 11, 235, 225, 95, 19, 236, 111, 87, 239, 228, 2, 250, 100, 247, 43, 2, + 250, 100, 228, 198, 238, 139, 239, 227, 228, 198, 238, 139, 247, 42, 239, + 228, 95, 153, 128, 247, 42, 247, 43, 95, 153, 128, 239, 227, 95, 153, + 128, 239, 227, 95, 153, 128, 247, 42, 95, 153, 128, 235, 163, 95, 153, + 128, 231, 44, 250, 110, 161, 235, 167, 128, 248, 203, 250, 110, 161, 231, + 47, 128, 248, 203, 161, 31, 241, 202, 147, 128, 95, 87, 161, 31, 236, + 180, 147, 128, 95, 87, 31, 241, 202, 147, 128, 161, 95, 87, 31, 236, 180, + 147, 128, 161, 95, 87, 239, 228, 252, 198, 161, 248, 198, 87, 247, 43, + 252, 198, 161, 248, 198, 87, 235, 164, 252, 198, 161, 248, 198, 87, 231, + 45, 252, 198, 161, 248, 198, 87, 161, 237, 123, 231, 60, 236, 233, 250, + 110, 161, 251, 191, 254, 168, 237, 123, 231, 59, 161, 237, 123, 231, 60, + 147, 128, 95, 87, 250, 110, 161, 251, 191, 254, 168, 237, 123, 231, 60, + 128, 248, 203, 59, 248, 243, 238, 222, 163, 248, 243, 88, 38, 250, 199, + 248, 243, 92, 38, 250, 199, 248, 243, 248, 247, 147, 2, 183, 163, 108, + 248, 247, 147, 2, 59, 253, 144, 254, 154, 248, 228, 147, 163, 108, 3, + 248, 247, 147, 2, 59, 253, 144, 254, 154, 248, 228, 147, 163, 108, 248, + 247, 147, 2, 53, 48, 248, 247, 147, 2, 236, 158, 3, 248, 247, 147, 2, + 236, 158, 248, 247, 147, 2, 229, 17, 248, 247, 147, 2, 171, 163, 231, 66, + 251, 189, 2, 183, 163, 108, 251, 189, 2, 59, 253, 144, 254, 154, 248, + 228, 147, 163, 108, 3, 251, 189, 2, 59, 253, 144, 254, 154, 248, 228, + 147, 163, 108, 251, 189, 2, 236, 158, 3, 251, 189, 2, 236, 158, 227, 104, + 126, 253, 157, 239, 17, 250, 194, 52, 248, 248, 56, 246, 43, 88, 254, + 174, 92, 254, 174, 235, 147, 236, 45, 228, 117, 239, 193, 40, 252, 113, + 38, 252, 113, 40, 248, 30, 38, 248, 30, 252, 250, 38, 251, 154, 252, 250, + 40, 251, 154, 229, 208, 38, 251, 154, 229, 208, 40, 251, 154, 224, 161, + 52, 31, 239, 137, 254, 202, 233, 189, 233, 194, 230, 118, 234, 198, 235, + 187, 241, 183, 228, 187, 231, 171, 235, 220, 147, 241, 155, 52, 205, 161, + 52, 228, 124, 246, 44, 229, 208, 40, 251, 173, 229, 208, 38, 251, 173, + 252, 250, 40, 251, 173, 252, 250, 38, 251, 173, 229, 208, 137, 241, 159, + 252, 250, 137, 241, 159, 247, 235, 231, 227, 88, 254, 175, 253, 51, 171, + 163, 253, 135, 236, 184, 240, 199, 248, 194, 153, 230, 77, 225, 228, 55, + 241, 193, 134, 234, 196, 252, 242, 240, 198, 239, 247, 185, 104, 234, + 119, 185, 104, 248, 194, 153, 230, 77, 239, 248, 253, 62, 234, 107, 251, + 112, 255, 31, 254, 182, 230, 206, 229, 200, 234, 35, 250, 165, 236, 181, + 251, 199, 230, 152, 231, 236, 251, 165, 251, 164, 141, 142, 12, 245, 233, + 141, 142, 12, 231, 165, 235, 35, 141, 142, 12, 235, 36, 248, 203, 141, + 142, 12, 235, 36, 250, 138, 141, 142, 12, 235, 36, 250, 192, 141, 142, + 12, 235, 36, 241, 40, 141, 142, 12, 235, 36, 252, 5, 141, 142, 12, 218, + 231, 98, 141, 142, 12, 218, 241, 40, 141, 142, 12, 231, 240, 125, 141, + 142, 12, 253, 161, 125, 141, 142, 12, 235, 36, 231, 239, 141, 142, 12, + 235, 36, 253, 160, 141, 142, 12, 235, 36, 239, 227, 141, 142, 12, 235, + 36, 247, 42, 141, 142, 12, 139, 228, 229, 141, 142, 12, 77, 228, 229, + 141, 142, 12, 235, 36, 139, 56, 141, 142, 12, 235, 36, 77, 56, 141, 142, + 12, 218, 253, 160, 141, 142, 12, 92, 230, 175, 229, 17, 141, 142, 12, + 250, 230, 231, 98, 141, 142, 12, 235, 36, 92, 252, 150, 141, 142, 12, + 235, 36, 250, 229, 141, 142, 12, 92, 230, 175, 241, 40, 141, 142, 12, + 226, 226, 228, 229, 141, 142, 12, 235, 36, 226, 226, 56, 141, 142, 12, + 88, 230, 175, 236, 158, 141, 142, 12, 250, 238, 231, 98, 141, 142, 12, + 235, 36, 88, 252, 150, 141, 142, 12, 235, 36, 250, 237, 141, 142, 12, 88, + 230, 175, 241, 40, 141, 142, 12, 249, 86, 228, 229, 141, 142, 12, 235, + 36, 249, 86, 56, 141, 142, 12, 235, 12, 229, 17, 141, 142, 12, 250, 230, + 229, 17, 141, 142, 12, 250, 193, 229, 17, 141, 142, 12, 241, 41, 229, 17, + 141, 142, 12, 218, 229, 17, 141, 142, 12, 88, 232, 99, 241, 40, 141, 142, + 12, 235, 12, 235, 35, 141, 142, 12, 218, 231, 112, 141, 142, 12, 235, 36, + 251, 219, 141, 142, 12, 88, 230, 175, 175, 141, 142, 12, 250, 238, 175, + 141, 142, 12, 231, 113, 175, 141, 142, 12, 241, 41, 175, 141, 142, 12, + 218, 175, 141, 142, 12, 92, 232, 99, 231, 98, 141, 142, 12, 40, 232, 99, + 231, 98, 141, 142, 12, 230, 1, 175, 141, 142, 12, 247, 43, 175, 141, 142, + 12, 251, 215, 125, 141, 142, 12, 250, 238, 169, 141, 142, 12, 227, 36, + 141, 142, 12, 231, 99, 169, 141, 142, 12, 232, 177, 229, 17, 141, 142, + 12, 235, 36, 161, 248, 203, 141, 142, 12, 235, 36, 235, 22, 141, 142, 12, + 92, 252, 151, 169, 141, 142, 12, 88, 252, 151, 169, 141, 142, 12, 241, + 137, 141, 142, 12, 234, 147, 141, 142, 12, 236, 216, 141, 142, 12, 194, + 229, 17, 141, 142, 12, 248, 205, 229, 17, 141, 142, 12, 241, 138, 229, + 17, 141, 142, 12, 211, 229, 17, 141, 142, 12, 255, 21, 161, 252, 74, 69, + 38, 185, 2, 249, 86, 227, 37, 56, 232, 78, 236, 195, 252, 242, 253, 70, + 91, 59, 239, 194, 2, 238, 223, 250, 100, 241, 164, 91, 251, 186, 229, 15, + 91, 250, 148, 229, 15, 91, 248, 237, 91, 251, 206, 91, 64, 31, 2, 252, + 108, 59, 239, 193, 248, 219, 91, 255, 17, 240, 200, 91, 246, 192, 91, 29, + 163, 253, 144, 2, 237, 118, 29, 229, 183, 249, 88, 252, 226, 218, 2, 237, + 121, 56, 229, 13, 91, 238, 164, 91, 245, 244, 91, 236, 194, 246, 253, 91, + 236, 194, 240, 42, 91, 236, 97, 91, 236, 96, 91, 250, 151, 251, 132, 12, + 248, 7, 111, 231, 211, 91, 141, 142, 12, 235, 35, 250, 252, 232, 167, + 240, 200, 91, 235, 158, 236, 134, 237, 247, 236, 134, 235, 155, 233, 209, + 91, 251, 251, 233, 209, 91, 40, 236, 107, 189, 90, 40, 236, 107, 248, + 149, 40, 236, 107, 168, 90, 38, 236, 107, 189, 90, 38, 236, 107, 248, + 149, 38, 236, 107, 168, 90, 40, 31, 252, 239, 189, 251, 173, 40, 31, 252, + 239, 248, 149, 40, 31, 252, 239, 168, 251, 173, 38, 31, 252, 239, 189, + 251, 173, 38, 31, 252, 239, 248, 149, 38, 31, 252, 239, 168, 251, 173, + 40, 251, 134, 252, 239, 189, 90, 40, 251, 134, 252, 239, 238, 223, 236, + 2, 40, 251, 134, 252, 239, 168, 90, 251, 134, 252, 239, 248, 149, 38, + 251, 134, 252, 239, 189, 90, 38, 251, 134, 252, 239, 238, 223, 236, 2, + 38, 251, 134, 252, 239, 168, 90, 241, 160, 248, 149, 163, 239, 194, 248, + 149, 189, 40, 128, 168, 38, 251, 134, 252, 239, 233, 195, 189, 38, 128, + 168, 40, 251, 134, 252, 239, 233, 195, 231, 38, 229, 207, 231, 38, 252, + 249, 229, 208, 31, 104, 252, 250, 31, 104, 252, 250, 31, 252, 239, 236, + 159, 229, 208, 31, 104, 25, 12, 252, 249, 40, 59, 66, 239, 193, 38, 59, + 66, 239, 193, 163, 233, 218, 239, 192, 163, 233, 218, 239, 191, 163, 233, + 218, 239, 190, 163, 233, 218, 239, 189, 250, 225, 12, 136, 59, 19, 229, + 208, 225, 250, 225, 12, 136, 59, 19, 252, 250, 225, 250, 225, 12, 136, + 59, 2, 252, 5, 250, 225, 12, 136, 92, 19, 163, 2, 252, 5, 250, 225, 12, + 136, 88, 19, 163, 2, 252, 5, 250, 225, 12, 136, 59, 2, 229, 182, 250, + 225, 12, 136, 92, 19, 163, 2, 229, 182, 250, 225, 12, 136, 88, 19, 163, + 2, 229, 182, 250, 225, 12, 136, 59, 19, 228, 118, 250, 225, 12, 136, 92, + 19, 163, 2, 228, 118, 250, 225, 12, 136, 88, 19, 163, 2, 228, 118, 250, + 225, 12, 136, 92, 19, 246, 53, 250, 225, 12, 136, 88, 19, 246, 53, 250, + 225, 12, 136, 59, 19, 229, 208, 239, 248, 250, 225, 12, 136, 59, 19, 252, + 250, 239, 248, 31, 248, 16, 234, 160, 91, 249, 1, 91, 59, 239, 194, 248, + 149, 239, 0, 252, 231, 239, 0, 183, 236, 159, 232, 92, 239, 0, 232, 93, + 236, 159, 239, 158, 239, 0, 183, 236, 159, 171, 232, 80, 239, 0, 171, + 232, 81, 236, 159, 239, 158, 239, 0, 171, 232, 81, 241, 44, 239, 0, 229, + 167, 239, 0, 230, 95, 239, 0, 236, 59, 249, 33, 247, 38, 247, 222, 12, + 28, 237, 79, 12, 28, 231, 110, 147, 246, 205, 12, 28, 231, 110, 147, 230, + 91, 12, 28, 248, 228, 147, 230, 91, 12, 28, 248, 228, 147, 229, 194, 12, + 28, 248, 220, 12, 28, 255, 86, 12, 28, 253, 69, 12, 28, 253, 159, 12, 28, + 163, 230, 176, 12, 28, 239, 194, 248, 100, 12, 28, 59, 230, 176, 12, 28, + 248, 7, 248, 100, 12, 28, 252, 147, 234, 159, 12, 28, 232, 108, 236, 164, + 12, 28, 232, 108, 241, 192, 12, 28, 251, 50, 239, 186, 248, 186, 12, 28, + 250, 214, 251, 181, 127, 12, 28, 250, 214, 251, 181, 111, 12, 28, 250, + 214, 251, 181, 166, 12, 28, 250, 214, 251, 181, 177, 12, 28, 238, 4, 255, + 86, 12, 28, 230, 203, 241, 232, 12, 28, 248, 228, 147, 229, 195, 253, 8, + 12, 28, 252, 163, 12, 28, 248, 228, 147, 239, 32, 12, 28, 231, 50, 12, + 28, 248, 186, 12, 28, 248, 67, 232, 166, 12, 28, 247, 37, 232, 166, 12, + 28, 234, 199, 232, 166, 12, 28, 229, 10, 232, 166, 12, 28, 231, 193, 12, + 28, 250, 235, 253, 10, 91, 236, 195, 252, 242, 12, 28, 237, 249, 12, 28, + 250, 236, 248, 7, 111, 12, 28, 231, 51, 248, 7, 111, 236, 237, 90, 236, + 237, 252, 92, 236, 237, 248, 10, 236, 237, 241, 143, 248, 10, 236, 237, + 253, 67, 252, 216, 236, 237, 252, 246, 230, 11, 236, 237, 252, 237, 253, + 147, 245, 218, 236, 237, 255, 12, 147, 252, 73, 236, 237, 251, 54, 236, + 237, 251, 126, 255, 88, 237, 78, 236, 237, 45, 253, 160, 29, 26, 127, 29, + 26, 111, 29, 26, 166, 29, 26, 177, 29, 26, 176, 29, 26, 187, 29, 26, 203, + 29, 26, 195, 29, 26, 202, 29, 61, 230, 112, 29, 61, 248, 245, 29, 61, + 229, 81, 29, 61, 230, 46, 29, 61, 247, 251, 29, 61, 248, 78, 29, 61, 232, + 0, 29, 61, 232, 156, 29, 61, 249, 9, 29, 61, 237, 186, 29, 61, 229, 79, + 82, 26, 127, 82, 26, 111, 82, 26, 166, 82, 26, 177, 82, 26, 176, 82, 26, + 187, 82, 26, 203, 82, 26, 195, 82, 26, 202, 82, 61, 230, 112, 82, 61, + 248, 245, 82, 61, 229, 81, 82, 61, 230, 46, 82, 61, 247, 251, 82, 61, + 248, 78, 82, 61, 232, 0, 82, 61, 232, 156, 82, 61, 249, 9, 82, 61, 237, + 186, 82, 61, 229, 79, 26, 236, 210, 247, 231, 208, 26, 171, 247, 231, + 208, 26, 204, 247, 231, 208, 26, 248, 0, 247, 231, 208, 26, 248, 48, 247, + 231, 208, 26, 232, 5, 247, 231, 208, 26, 232, 158, 247, 231, 208, 26, + 249, 11, 247, 231, 208, 26, 237, 188, 247, 231, 208, 61, 230, 113, 247, + 231, 208, 61, 248, 246, 247, 231, 208, 61, 229, 82, 247, 231, 208, 61, + 230, 47, 247, 231, 208, 61, 247, 252, 247, 231, 208, 61, 248, 79, 247, + 231, 208, 61, 232, 1, 247, 231, 208, 61, 232, 157, 247, 231, 208, 61, + 249, 10, 247, 231, 208, 61, 237, 187, 247, 231, 208, 61, 229, 80, 247, + 231, 208, 82, 8, 3, 1, 67, 82, 8, 3, 1, 217, 82, 8, 3, 1, 252, 178, 82, + 8, 3, 1, 209, 82, 8, 3, 1, 72, 82, 8, 3, 1, 248, 140, 82, 8, 3, 1, 210, + 82, 8, 3, 1, 192, 82, 8, 3, 1, 71, 82, 8, 3, 1, 221, 82, 8, 3, 1, 241, + 12, 82, 8, 3, 1, 162, 82, 8, 3, 1, 173, 82, 8, 3, 1, 197, 82, 8, 3, 1, + 73, 82, 8, 3, 1, 223, 82, 8, 3, 1, 235, 93, 82, 8, 3, 1, 144, 82, 8, 3, + 1, 193, 82, 8, 3, 1, 214, 82, 8, 3, 1, 79, 82, 8, 3, 1, 179, 82, 8, 3, 1, + 228, 144, 82, 8, 3, 1, 206, 82, 8, 3, 1, 228, 7, 82, 8, 3, 1, 227, 103, + 29, 8, 5, 1, 67, 29, 8, 5, 1, 217, 29, 8, 5, 1, 252, 178, 29, 8, 5, 1, + 209, 29, 8, 5, 1, 72, 29, 8, 5, 1, 248, 140, 29, 8, 5, 1, 210, 29, 8, 5, + 1, 192, 29, 8, 5, 1, 71, 29, 8, 5, 1, 221, 29, 8, 5, 1, 241, 12, 29, 8, 5, 1, 162, 29, 8, 5, 1, 173, 29, 8, 5, 1, 197, 29, 8, 5, 1, 73, 29, 8, 5, - 1, 223, 29, 8, 5, 1, 255, 20, 29, 8, 5, 1, 144, 29, 8, 5, 1, 193, 29, 8, - 5, 1, 214, 29, 8, 5, 1, 79, 29, 8, 5, 1, 179, 29, 8, 5, 1, 255, 16, 29, - 8, 5, 1, 206, 29, 8, 5, 1, 255, 14, 29, 8, 5, 1, 255, 17, 29, 8, 3, 1, - 67, 29, 8, 3, 1, 217, 29, 8, 3, 1, 255, 18, 29, 8, 3, 1, 209, 29, 8, 3, - 1, 72, 29, 8, 3, 1, 255, 19, 29, 8, 3, 1, 210, 29, 8, 3, 1, 192, 29, 8, - 3, 1, 71, 29, 8, 3, 1, 221, 29, 8, 3, 1, 255, 15, 29, 8, 3, 1, 162, 29, + 1, 223, 29, 8, 5, 1, 235, 93, 29, 8, 5, 1, 144, 29, 8, 5, 1, 193, 29, 8, + 5, 1, 214, 29, 8, 5, 1, 79, 29, 8, 5, 1, 179, 29, 8, 5, 1, 228, 144, 29, + 8, 5, 1, 206, 29, 8, 5, 1, 228, 7, 29, 8, 5, 1, 227, 103, 29, 8, 3, 1, + 67, 29, 8, 3, 1, 217, 29, 8, 3, 1, 252, 178, 29, 8, 3, 1, 209, 29, 8, 3, + 1, 72, 29, 8, 3, 1, 248, 140, 29, 8, 3, 1, 210, 29, 8, 3, 1, 192, 29, 8, + 3, 1, 71, 29, 8, 3, 1, 221, 29, 8, 3, 1, 241, 12, 29, 8, 3, 1, 162, 29, 8, 3, 1, 173, 29, 8, 3, 1, 197, 29, 8, 3, 1, 73, 29, 8, 3, 1, 223, 29, 8, - 3, 1, 255, 20, 29, 8, 3, 1, 144, 29, 8, 3, 1, 193, 29, 8, 3, 1, 214, 29, - 8, 3, 1, 79, 29, 8, 3, 1, 179, 29, 8, 3, 1, 255, 16, 29, 8, 3, 1, 206, - 29, 8, 3, 1, 255, 14, 29, 8, 3, 1, 255, 17, 29, 26, 242, 217, 236, 146, - 29, 61, 238, 91, 236, 146, 29, 61, 238, 97, 236, 146, 29, 61, 235, 85, - 236, 146, 29, 61, 235, 82, 236, 146, 29, 61, 236, 207, 236, 146, 29, 61, - 236, 202, 236, 146, 29, 61, 234, 22, 236, 146, 29, 61, 235, 81, 236, 146, - 29, 61, 235, 83, 236, 146, 29, 61, 238, 77, 45, 29, 26, 127, 45, 29, 26, - 111, 45, 29, 26, 166, 45, 29, 26, 177, 45, 29, 26, 176, 45, 29, 26, 187, - 45, 29, 26, 203, 45, 29, 26, 195, 45, 29, 26, 202, 45, 29, 61, 248, 53, - 236, 146, 29, 26, 242, 217, 66, 70, 136, 233, 50, 66, 70, 96, 233, 50, - 66, 70, 136, 235, 63, 66, 70, 96, 235, 63, 66, 70, 136, 240, 3, 248, 63, - 233, 50, 66, 70, 96, 240, 3, 248, 63, 233, 50, 66, 70, 136, 240, 3, 248, - 63, 235, 63, 66, 70, 96, 240, 3, 248, 63, 235, 63, 66, 70, 136, 235, 71, - 248, 63, 233, 50, 66, 70, 96, 235, 71, 248, 63, 233, 50, 66, 70, 136, - 235, 71, 248, 63, 235, 63, 66, 70, 96, 235, 71, 248, 63, 235, 63, 66, 70, - 136, 92, 19, 225, 66, 70, 92, 136, 19, 38, 240, 11, 66, 70, 92, 96, 19, - 38, 240, 9, 66, 70, 96, 92, 19, 225, 66, 70, 136, 92, 19, 242, 220, 66, - 70, 92, 136, 19, 40, 240, 11, 66, 70, 92, 96, 19, 40, 240, 9, 66, 70, 96, - 92, 19, 242, 220, 66, 70, 136, 88, 19, 225, 66, 70, 88, 136, 19, 38, 240, - 11, 66, 70, 88, 96, 19, 38, 240, 9, 66, 70, 96, 88, 19, 225, 66, 70, 136, - 88, 19, 242, 220, 66, 70, 88, 136, 19, 40, 240, 11, 66, 70, 88, 96, 19, - 40, 240, 9, 66, 70, 96, 88, 19, 242, 220, 66, 70, 136, 59, 19, 225, 66, - 70, 59, 136, 19, 38, 240, 11, 66, 70, 88, 96, 19, 38, 92, 240, 9, 66, 70, - 92, 96, 19, 38, 88, 240, 9, 66, 70, 59, 96, 19, 38, 240, 9, 66, 70, 92, - 136, 19, 38, 88, 240, 11, 66, 70, 88, 136, 19, 38, 92, 240, 11, 66, 70, - 96, 59, 19, 225, 66, 70, 136, 59, 19, 242, 220, 66, 70, 59, 136, 19, 40, - 240, 11, 66, 70, 88, 96, 19, 40, 92, 240, 9, 66, 70, 92, 96, 19, 40, 88, - 240, 9, 66, 70, 59, 96, 19, 40, 240, 9, 66, 70, 92, 136, 19, 40, 88, 240, - 11, 66, 70, 88, 136, 19, 40, 92, 240, 11, 66, 70, 96, 59, 19, 242, 220, - 66, 70, 136, 92, 19, 233, 50, 66, 70, 40, 96, 19, 38, 92, 240, 9, 66, 70, - 38, 96, 19, 40, 92, 240, 9, 66, 70, 92, 136, 19, 163, 240, 11, 66, 70, - 92, 96, 19, 163, 240, 9, 66, 70, 38, 136, 19, 40, 92, 240, 11, 66, 70, - 40, 136, 19, 38, 92, 240, 11, 66, 70, 96, 92, 19, 233, 50, 66, 70, 136, - 88, 19, 233, 50, 66, 70, 40, 96, 19, 38, 88, 240, 9, 66, 70, 38, 96, 19, - 40, 88, 240, 9, 66, 70, 88, 136, 19, 163, 240, 11, 66, 70, 88, 96, 19, - 163, 240, 9, 66, 70, 38, 136, 19, 40, 88, 240, 11, 66, 70, 40, 136, 19, - 38, 88, 240, 11, 66, 70, 96, 88, 19, 233, 50, 66, 70, 136, 59, 19, 233, - 50, 66, 70, 40, 96, 19, 38, 59, 240, 9, 66, 70, 38, 96, 19, 40, 59, 240, - 9, 66, 70, 59, 136, 19, 163, 240, 11, 66, 70, 88, 96, 19, 92, 163, 240, - 9, 66, 70, 92, 96, 19, 88, 163, 240, 9, 66, 70, 59, 96, 19, 163, 240, 9, - 66, 70, 40, 88, 96, 19, 38, 92, 240, 9, 66, 70, 38, 88, 96, 19, 40, 92, - 240, 9, 66, 70, 40, 92, 96, 19, 38, 88, 240, 9, 66, 70, 38, 92, 96, 19, - 40, 88, 240, 9, 66, 70, 92, 136, 19, 88, 163, 240, 11, 66, 70, 88, 136, - 19, 92, 163, 240, 11, 66, 70, 38, 136, 19, 40, 59, 240, 11, 66, 70, 40, - 136, 19, 38, 59, 240, 11, 66, 70, 96, 59, 19, 233, 50, 66, 70, 136, 45, - 248, 63, 233, 50, 66, 70, 96, 45, 248, 63, 233, 50, 66, 70, 136, 45, 248, - 63, 235, 63, 66, 70, 96, 45, 248, 63, 235, 63, 66, 70, 45, 233, 50, 66, - 70, 45, 235, 63, 66, 70, 92, 240, 12, 19, 38, 238, 78, 66, 70, 92, 45, - 19, 38, 238, 82, 66, 70, 45, 92, 19, 225, 66, 70, 92, 240, 12, 19, 40, - 238, 78, 66, 70, 92, 45, 19, 40, 238, 82, 66, 70, 45, 92, 19, 242, 220, - 66, 70, 88, 240, 12, 19, 38, 238, 78, 66, 70, 88, 45, 19, 38, 238, 82, - 66, 70, 45, 88, 19, 225, 66, 70, 88, 240, 12, 19, 40, 238, 78, 66, 70, - 88, 45, 19, 40, 238, 82, 66, 70, 45, 88, 19, 242, 220, 66, 70, 59, 240, - 12, 19, 38, 238, 78, 66, 70, 59, 45, 19, 38, 238, 82, 66, 70, 45, 59, 19, - 225, 66, 70, 59, 240, 12, 19, 40, 238, 78, 66, 70, 59, 45, 19, 40, 238, - 82, 66, 70, 45, 59, 19, 242, 220, 66, 70, 92, 240, 12, 19, 163, 238, 78, - 66, 70, 92, 45, 19, 163, 238, 82, 66, 70, 45, 92, 19, 233, 50, 66, 70, - 88, 240, 12, 19, 163, 238, 78, 66, 70, 88, 45, 19, 163, 238, 82, 66, 70, - 45, 88, 19, 233, 50, 66, 70, 59, 240, 12, 19, 163, 238, 78, 66, 70, 59, - 45, 19, 163, 238, 82, 66, 70, 45, 59, 19, 233, 50, 66, 70, 136, 253, 183, - 92, 19, 225, 66, 70, 136, 253, 183, 92, 19, 242, 220, 66, 70, 136, 253, - 183, 88, 19, 242, 220, 66, 70, 136, 253, 183, 88, 19, 225, 66, 70, 136, - 236, 159, 189, 38, 153, 168, 242, 220, 66, 70, 136, 236, 159, 189, 40, - 153, 168, 225, 66, 70, 136, 236, 159, 240, 34, 66, 70, 136, 242, 220, 66, - 70, 136, 253, 176, 66, 70, 136, 225, 66, 70, 136, 242, 236, 66, 70, 96, - 242, 220, 66, 70, 96, 253, 176, 66, 70, 96, 225, 66, 70, 96, 242, 236, - 66, 70, 136, 40, 19, 96, 225, 66, 70, 136, 88, 19, 96, 242, 236, 66, 70, - 96, 40, 19, 136, 225, 66, 70, 96, 88, 19, 136, 242, 236, 189, 137, 240, - 13, 168, 253, 125, 240, 62, 240, 13, 168, 253, 125, 238, 80, 240, 13, - 168, 204, 238, 98, 240, 13, 168, 137, 240, 13, 168, 248, 48, 238, 98, - 240, 13, 168, 204, 236, 236, 240, 13, 168, 243, 31, 238, 98, 240, 13, - 248, 37, 240, 13, 40, 243, 31, 238, 98, 240, 13, 40, 204, 236, 236, 240, - 13, 40, 248, 48, 238, 98, 240, 13, 40, 137, 240, 13, 40, 204, 238, 98, - 240, 13, 40, 253, 125, 238, 80, 240, 13, 40, 253, 125, 240, 62, 240, 13, - 38, 137, 240, 13, 136, 240, 146, 240, 19, 240, 146, 250, 183, 240, 146, - 189, 253, 125, 240, 62, 240, 13, 38, 253, 125, 240, 62, 240, 13, 236, - 158, 168, 242, 220, 236, 158, 168, 225, 236, 158, 189, 242, 220, 236, - 158, 189, 40, 19, 168, 40, 19, 168, 225, 236, 158, 189, 40, 19, 168, 225, - 236, 158, 189, 40, 19, 189, 38, 19, 168, 242, 220, 236, 158, 189, 40, 19, - 189, 38, 19, 168, 225, 236, 158, 189, 225, 236, 158, 189, 38, 19, 168, - 242, 220, 236, 158, 189, 38, 19, 168, 40, 19, 168, 225, 86, 238, 59, 64, - 238, 59, 64, 31, 2, 238, 121, 237, 0, 64, 31, 234, 34, 86, 3, 238, 59, - 31, 2, 163, 243, 19, 31, 2, 59, 243, 19, 31, 2, 234, 230, 234, 51, 243, - 19, 31, 2, 189, 40, 153, 168, 38, 243, 19, 31, 2, 189, 38, 153, 168, 40, - 243, 19, 31, 2, 236, 159, 234, 51, 243, 19, 86, 3, 238, 59, 64, 3, 238, - 59, 86, 234, 31, 64, 234, 31, 86, 59, 234, 31, 64, 59, 234, 31, 86, 231, - 48, 64, 231, 48, 86, 233, 60, 235, 46, 64, 233, 60, 235, 46, 86, 233, 60, - 3, 235, 46, 64, 233, 60, 3, 235, 46, 86, 231, 36, 235, 46, 64, 231, 36, - 235, 46, 86, 231, 36, 3, 235, 46, 64, 231, 36, 3, 235, 46, 86, 231, 36, - 236, 217, 64, 231, 36, 236, 217, 86, 231, 91, 235, 46, 64, 231, 91, 235, - 46, 86, 231, 91, 3, 235, 46, 64, 231, 91, 3, 235, 46, 86, 231, 87, 235, - 46, 64, 231, 87, 235, 46, 86, 231, 87, 3, 235, 46, 64, 231, 87, 3, 235, - 46, 86, 231, 87, 236, 217, 64, 231, 87, 236, 217, 86, 236, 164, 64, 236, - 164, 64, 238, 76, 234, 34, 86, 3, 236, 164, 237, 157, 236, 231, 64, 238, - 51, 240, 4, 238, 51, 218, 2, 59, 243, 19, 235, 183, 86, 238, 51, 218, 2, - 40, 137, 240, 0, 218, 2, 38, 137, 240, 0, 218, 2, 168, 137, 240, 0, 218, - 2, 189, 137, 240, 0, 218, 2, 189, 38, 236, 158, 240, 0, 218, 2, 254, 51, - 253, 230, 189, 40, 236, 158, 240, 0, 40, 137, 86, 238, 51, 38, 137, 86, - 238, 51, 238, 116, 238, 69, 238, 116, 64, 238, 51, 189, 137, 238, 116, - 64, 238, 51, 168, 137, 238, 116, 64, 238, 51, 189, 40, 236, 158, 236, - 211, 248, 113, 189, 38, 236, 158, 236, 211, 248, 113, 168, 38, 236, 158, - 236, 211, 248, 113, 168, 40, 236, 158, 236, 211, 248, 113, 189, 137, 238, - 51, 168, 137, 238, 51, 86, 168, 38, 235, 46, 86, 168, 40, 235, 46, 86, - 189, 40, 235, 46, 86, 189, 38, 235, 46, 64, 238, 69, 31, 2, 40, 137, 240, - 0, 31, 2, 38, 137, 240, 0, 31, 2, 189, 40, 236, 159, 137, 240, 0, 31, 2, - 168, 38, 236, 159, 137, 240, 0, 64, 31, 2, 59, 235, 180, 242, 224, 64, - 233, 60, 236, 152, 2, 248, 40, 233, 60, 236, 152, 2, 40, 137, 240, 0, - 233, 60, 236, 152, 2, 38, 137, 240, 0, 243, 22, 238, 51, 64, 31, 2, 189, - 40, 235, 70, 64, 31, 2, 168, 40, 235, 70, 64, 31, 2, 168, 38, 235, 70, - 64, 31, 2, 189, 38, 235, 70, 64, 218, 2, 189, 40, 235, 70, 64, 218, 2, - 168, 40, 235, 70, 64, 218, 2, 168, 38, 235, 70, 64, 218, 2, 189, 38, 235, - 70, 189, 40, 235, 46, 189, 38, 235, 46, 168, 40, 235, 46, 64, 240, 19, - 238, 59, 86, 240, 19, 238, 59, 64, 240, 19, 3, 238, 59, 86, 240, 19, 3, - 238, 59, 168, 38, 235, 46, 86, 254, 126, 2, 243, 251, 241, 61, 236, 135, - 238, 9, 241, 64, 86, 242, 229, 64, 242, 229, 234, 219, 232, 60, 248, 136, - 235, 172, 243, 235, 234, 110, 243, 235, 232, 120, 233, 73, 86, 234, 81, - 64, 234, 81, 240, 91, 248, 92, 240, 91, 66, 2, 240, 162, 240, 91, 66, 2, - 206, 237, 255, 238, 38, 2, 252, 128, 241, 90, 254, 96, 235, 178, 64, 244, - 12, 240, 119, 86, 244, 12, 240, 119, 236, 101, 224, 238, 120, 240, 135, - 243, 16, 238, 69, 86, 40, 236, 150, 240, 76, 86, 38, 236, 150, 240, 76, - 64, 40, 236, 150, 240, 76, 64, 88, 236, 150, 240, 76, 64, 38, 236, 150, - 240, 76, 64, 92, 236, 150, 240, 76, 247, 92, 19, 233, 129, 239, 19, 52, - 233, 227, 52, 235, 179, 52, 235, 185, 244, 81, 237, 228, 240, 34, 254, - 83, 248, 73, 243, 38, 147, 236, 53, 243, 38, 147, 234, 210, 248, 135, 19, - 235, 196, 243, 26, 91, 254, 139, 239, 192, 240, 185, 19, 239, 196, 246, - 239, 91, 254, 15, 243, 50, 238, 89, 28, 238, 139, 238, 89, 28, 243, 213, - 238, 89, 28, 243, 27, 238, 89, 28, 237, 48, 238, 89, 28, 243, 82, 238, - 89, 28, 240, 105, 238, 89, 28, 235, 102, 238, 89, 28, 240, 49, 247, 195, - 147, 239, 42, 64, 237, 162, 243, 39, 64, 238, 219, 243, 39, 86, 238, 219, - 243, 39, 64, 254, 126, 2, 243, 251, 243, 41, 238, 80, 243, 30, 251, 184, - 238, 80, 243, 30, 237, 208, 240, 96, 52, 240, 49, 248, 95, 52, 237, 185, - 239, 180, 239, 236, 237, 218, 242, 62, 241, 15, 239, 215, 239, 81, 239, - 17, 251, 188, 242, 179, 241, 215, 236, 98, 232, 203, 234, 99, 235, 167, - 239, 163, 64, 242, 252, 243, 208, 64, 242, 252, 240, 213, 64, 242, 252, - 244, 0, 64, 242, 252, 238, 167, 64, 242, 252, 238, 196, 64, 242, 252, - 243, 241, 86, 242, 252, 243, 208, 86, 242, 252, 240, 213, 86, 242, 252, - 244, 0, 86, 242, 252, 238, 167, 86, 242, 252, 238, 196, 86, 242, 252, - 243, 241, 86, 244, 22, 243, 17, 64, 243, 16, 243, 17, 64, 238, 76, 243, - 17, 86, 249, 41, 243, 17, 64, 244, 22, 243, 17, 86, 243, 16, 243, 17, 86, - 238, 76, 243, 17, 64, 249, 41, 243, 17, 254, 96, 238, 11, 238, 80, 243, - 9, 240, 62, 243, 9, 240, 157, 240, 62, 240, 203, 240, 157, 235, 108, 240, - 203, 243, 108, 248, 209, 52, 243, 108, 238, 146, 52, 243, 108, 243, 74, - 52, 248, 56, 129, 240, 34, 248, 43, 129, 240, 34, 235, 159, 235, 65, 91, - 235, 65, 12, 28, 242, 164, 235, 75, 235, 65, 12, 28, 242, 165, 235, 75, - 235, 65, 12, 28, 242, 166, 235, 75, 235, 65, 12, 28, 242, 167, 235, 75, - 235, 65, 12, 28, 242, 168, 235, 75, 235, 65, 12, 28, 242, 169, 235, 75, - 235, 65, 12, 28, 242, 170, 235, 75, 235, 65, 12, 28, 239, 82, 234, 221, - 86, 235, 159, 235, 65, 91, 237, 249, 243, 113, 91, 226, 250, 243, 113, - 91, 236, 74, 243, 113, 52, 235, 41, 91, 254, 2, 239, 60, 254, 2, 239, 61, - 254, 2, 239, 62, 254, 2, 239, 63, 254, 2, 239, 64, 254, 2, 239, 65, 64, - 218, 2, 53, 225, 64, 218, 2, 171, 243, 5, 86, 218, 2, 64, 53, 225, 86, - 218, 2, 171, 64, 243, 5, 236, 184, 28, 243, 50, 236, 184, 28, 249, 23, - 240, 56, 28, 238, 188, 243, 50, 240, 56, 28, 240, 198, 249, 23, 240, 56, - 28, 240, 198, 243, 50, 240, 56, 28, 238, 188, 249, 23, 64, 243, 173, 86, - 243, 173, 240, 185, 19, 246, 248, 238, 159, 238, 133, 239, 211, 244, 24, - 147, 232, 113, 239, 181, 237, 58, 239, 77, 245, 98, 244, 24, 147, 239, - 92, 249, 242, 91, 231, 138, 239, 246, 52, 200, 239, 245, 52, 238, 179, - 240, 96, 52, 238, 179, 248, 95, 52, 233, 212, 240, 96, 19, 248, 95, 52, - 248, 95, 19, 240, 96, 52, 248, 95, 2, 240, 5, 52, 248, 95, 2, 240, 5, 19, - 248, 95, 19, 240, 96, 52, 59, 248, 95, 2, 240, 5, 52, 163, 248, 95, 2, - 240, 5, 52, 240, 19, 64, 238, 51, 240, 19, 86, 238, 51, 240, 19, 3, 64, - 238, 51, 237, 202, 91, 239, 45, 91, 236, 137, 233, 94, 91, 239, 30, 239, - 79, 253, 3, 189, 243, 148, 235, 93, 86, 235, 93, 168, 243, 148, 235, 93, - 64, 235, 93, 235, 113, 237, 195, 52, 252, 210, 241, 89, 235, 162, 236, - 12, 239, 242, 243, 59, 239, 249, 243, 59, 168, 38, 238, 148, 238, 148, - 189, 38, 238, 148, 64, 249, 120, 86, 249, 120, 243, 53, 69, 96, 243, 53, - 69, 231, 37, 206, 96, 231, 37, 206, 240, 91, 206, 96, 240, 91, 206, 236, - 199, 17, 240, 34, 96, 17, 240, 34, 248, 35, 240, 46, 240, 34, 96, 248, - 35, 240, 46, 240, 34, 8, 240, 34, 236, 189, 64, 8, 240, 34, 236, 199, 8, - 240, 34, 239, 126, 240, 34, 248, 135, 147, 241, 74, 248, 58, 229, 58, - 235, 52, 248, 58, 231, 39, 235, 52, 96, 248, 58, 231, 39, 235, 52, 248, - 58, 233, 123, 235, 52, 86, 248, 58, 238, 74, 242, 229, 64, 248, 58, 238, - 74, 242, 229, 240, 148, 236, 199, 64, 242, 229, 29, 64, 242, 229, 248, - 35, 240, 46, 86, 242, 229, 86, 240, 46, 64, 242, 229, 236, 199, 86, 242, - 229, 96, 236, 199, 86, 242, 229, 236, 235, 242, 229, 236, 189, 64, 242, - 229, 96, 235, 52, 248, 35, 240, 46, 235, 52, 242, 254, 242, 124, 235, 52, - 242, 254, 238, 74, 86, 242, 229, 242, 254, 238, 74, 236, 235, 242, 229, - 254, 31, 238, 74, 86, 242, 229, 242, 254, 238, 74, 233, 98, 86, 242, 229, - 96, 242, 254, 238, 74, 233, 98, 86, 242, 229, 240, 251, 238, 74, 86, 242, - 229, 238, 216, 238, 74, 235, 52, 229, 58, 235, 52, 248, 35, 240, 46, 229, - 58, 235, 52, 96, 229, 58, 235, 52, 254, 31, 237, 30, 86, 19, 64, 235, 88, - 86, 235, 88, 64, 235, 88, 242, 254, 237, 30, 236, 199, 86, 235, 88, 29, - 248, 35, 240, 46, 242, 254, 238, 74, 242, 229, 96, 229, 58, 236, 235, - 235, 52, 234, 42, 247, 150, 235, 35, 234, 42, 96, 239, 23, 234, 42, 237, - 42, 96, 237, 42, 231, 39, 235, 52, 242, 254, 229, 58, 235, 139, 235, 52, - 96, 242, 254, 229, 58, 235, 139, 235, 52, 236, 189, 64, 238, 51, 168, 38, - 231, 103, 64, 238, 59, 189, 38, 231, 103, 64, 238, 59, 168, 38, 236, 189, - 64, 238, 59, 189, 38, 236, 189, 64, 238, 59, 86, 238, 76, 242, 250, 64, - 206, 136, 59, 125, 240, 19, 59, 125, 96, 59, 125, 96, 240, 12, 205, 242, - 244, 235, 51, 158, 235, 53, 96, 240, 12, 242, 244, 235, 51, 158, 235, 53, - 96, 45, 205, 242, 244, 235, 51, 158, 235, 53, 96, 45, 242, 244, 235, 51, - 158, 235, 53, 240, 95, 252, 190, 235, 91, 21, 235, 53, 96, 233, 54, 158, - 235, 53, 96, 243, 16, 233, 54, 158, 235, 53, 96, 86, 240, 138, 238, 120, - 96, 86, 243, 16, 238, 69, 240, 135, 240, 138, 238, 120, 240, 135, 243, - 16, 238, 69, 240, 19, 40, 233, 56, 235, 53, 240, 19, 38, 233, 56, 235, - 53, 240, 19, 235, 122, 40, 233, 56, 235, 53, 240, 19, 235, 122, 38, 233, - 56, 235, 53, 240, 19, 231, 87, 185, 238, 52, 235, 53, 240, 19, 231, 36, - 185, 238, 52, 235, 53, 96, 231, 87, 185, 235, 51, 158, 235, 53, 96, 231, - 36, 185, 235, 51, 158, 235, 53, 96, 231, 87, 185, 238, 52, 235, 53, 96, - 231, 36, 185, 238, 52, 235, 53, 136, 40, 236, 171, 242, 255, 238, 52, - 235, 53, 136, 38, 236, 171, 242, 255, 238, 52, 235, 53, 240, 19, 40, 242, - 225, 238, 52, 235, 53, 240, 19, 38, 242, 225, 238, 52, 235, 53, 238, 55, - 236, 146, 29, 26, 127, 238, 55, 236, 146, 29, 26, 111, 238, 55, 236, 146, - 29, 26, 166, 238, 55, 236, 146, 29, 26, 177, 238, 55, 236, 146, 29, 26, - 176, 238, 55, 236, 146, 29, 26, 187, 238, 55, 236, 146, 29, 26, 203, 238, - 55, 236, 146, 29, 26, 195, 238, 55, 236, 146, 29, 26, 202, 238, 55, 236, - 146, 29, 61, 248, 53, 238, 55, 29, 27, 26, 127, 238, 55, 29, 27, 26, 111, - 238, 55, 29, 27, 26, 166, 238, 55, 29, 27, 26, 177, 238, 55, 29, 27, 26, - 176, 238, 55, 29, 27, 26, 187, 238, 55, 29, 27, 26, 203, 238, 55, 29, 27, - 26, 195, 238, 55, 29, 27, 26, 202, 238, 55, 29, 27, 61, 248, 53, 238, 55, - 236, 146, 29, 27, 26, 127, 238, 55, 236, 146, 29, 27, 26, 111, 238, 55, - 236, 146, 29, 27, 26, 166, 238, 55, 236, 146, 29, 27, 26, 177, 238, 55, - 236, 146, 29, 27, 26, 176, 238, 55, 236, 146, 29, 27, 26, 187, 238, 55, - 236, 146, 29, 27, 26, 203, 238, 55, 236, 146, 29, 27, 26, 195, 238, 55, - 236, 146, 29, 27, 26, 202, 238, 55, 236, 146, 29, 27, 61, 248, 53, 96, - 234, 1, 77, 56, 96, 242, 228, 248, 43, 56, 96, 77, 56, 96, 242, 223, 248, - 43, 56, 237, 142, 242, 232, 77, 56, 96, 232, 202, 77, 56, 229, 60, 77, - 56, 96, 229, 60, 77, 56, 240, 55, 229, 60, 77, 56, 96, 240, 55, 229, 60, - 77, 56, 86, 77, 56, 238, 229, 233, 253, 77, 234, 7, 238, 229, 231, 60, - 77, 234, 7, 86, 77, 234, 7, 96, 86, 240, 95, 235, 45, 19, 77, 56, 96, 86, - 240, 95, 226, 226, 19, 77, 56, 244, 23, 86, 77, 56, 96, 229, 65, 86, 77, - 56, 232, 200, 64, 77, 56, 233, 215, 64, 77, 56, 233, 119, 236, 189, 64, - 77, 56, 232, 166, 236, 189, 64, 77, 56, 96, 168, 231, 38, 64, 77, 56, 96, - 189, 231, 38, 64, 77, 56, 238, 204, 168, 231, 38, 64, 77, 56, 238, 204, - 189, 231, 38, 64, 77, 56, 29, 96, 64, 77, 56, 231, 34, 77, 56, 229, 59, - 242, 228, 248, 43, 56, 229, 59, 77, 56, 229, 59, 242, 223, 248, 43, 56, - 96, 229, 59, 242, 228, 248, 43, 56, 96, 229, 59, 77, 56, 96, 229, 59, - 242, 223, 248, 43, 56, 231, 31, 77, 56, 96, 229, 56, 77, 56, 232, 112, - 77, 56, 96, 232, 112, 77, 56, 231, 150, 77, 56, 204, 233, 133, 240, 54, - 64, 236, 152, 234, 34, 3, 64, 235, 46, 231, 49, 248, 35, 238, 87, 248, - 35, 235, 84, 40, 237, 35, 254, 52, 234, 35, 38, 237, 35, 254, 52, 234, - 35, 64, 238, 76, 2, 238, 130, 248, 40, 19, 2, 248, 40, 238, 68, 147, 238, - 96, 236, 206, 168, 38, 240, 31, 2, 248, 40, 189, 40, 240, 31, 2, 248, 40, - 40, 243, 111, 243, 61, 38, 243, 111, 243, 61, 248, 37, 243, 111, 243, 61, - 243, 22, 88, 242, 234, 243, 22, 92, 242, 234, 40, 19, 38, 45, 234, 15, - 40, 19, 38, 242, 234, 40, 235, 103, 183, 38, 242, 234, 183, 40, 242, 234, - 88, 248, 84, 2, 218, 48, 239, 124, 238, 135, 255, 25, 163, 247, 53, 64, - 231, 95, 236, 164, 64, 231, 95, 238, 76, 2, 139, 243, 36, 64, 231, 95, - 238, 76, 2, 77, 243, 36, 64, 31, 2, 139, 243, 36, 64, 31, 2, 77, 243, 36, - 10, 40, 64, 31, 104, 10, 38, 64, 31, 104, 10, 40, 185, 104, 10, 38, 185, - 104, 10, 40, 45, 185, 104, 10, 38, 45, 185, 104, 226, 226, 235, 71, 56, - 235, 45, 235, 71, 56, 231, 86, 240, 178, 218, 56, 235, 62, 240, 178, 218, - 56, 38, 65, 2, 29, 243, 12, 183, 139, 56, 183, 77, 56, 183, 40, 38, 56, - 183, 139, 45, 56, 183, 77, 45, 56, 183, 40, 38, 45, 56, 183, 139, 65, - 248, 44, 125, 183, 77, 65, 248, 44, 125, 183, 139, 45, 65, 248, 44, 125, - 183, 77, 45, 65, 248, 44, 125, 183, 77, 236, 240, 56, 35, 36, 241, 33, - 35, 36, 239, 46, 35, 36, 239, 47, 35, 36, 237, 113, 35, 36, 239, 48, 35, - 36, 237, 114, 35, 36, 237, 120, 35, 36, 235, 206, 35, 36, 239, 49, 35, - 36, 237, 115, 35, 36, 237, 121, 35, 36, 235, 207, 35, 36, 237, 126, 35, - 36, 235, 212, 35, 36, 235, 227, 35, 36, 234, 113, 35, 36, 239, 50, 35, - 36, 237, 116, 35, 36, 237, 122, 35, 36, 235, 208, 35, 36, 237, 127, 35, - 36, 235, 213, 35, 36, 235, 228, 35, 36, 234, 114, 35, 36, 237, 131, 35, - 36, 235, 217, 35, 36, 235, 232, 35, 36, 234, 118, 35, 36, 235, 242, 35, - 36, 234, 128, 35, 36, 234, 148, 35, 36, 233, 138, 35, 36, 239, 51, 35, - 36, 237, 117, 35, 36, 237, 123, 35, 36, 235, 209, 35, 36, 237, 128, 35, - 36, 235, 214, 35, 36, 235, 229, 35, 36, 234, 115, 35, 36, 237, 132, 35, - 36, 235, 218, 35, 36, 235, 233, 35, 36, 234, 119, 35, 36, 235, 243, 35, - 36, 234, 129, 35, 36, 234, 149, 35, 36, 233, 139, 35, 36, 237, 135, 35, - 36, 235, 221, 35, 36, 235, 236, 35, 36, 234, 122, 35, 36, 235, 246, 35, - 36, 234, 132, 35, 36, 234, 152, 35, 36, 233, 142, 35, 36, 235, 252, 35, - 36, 234, 138, 35, 36, 234, 158, 35, 36, 233, 148, 35, 36, 234, 168, 35, - 36, 233, 158, 35, 36, 233, 173, 35, 36, 232, 134, 35, 36, 239, 52, 35, - 36, 237, 118, 35, 36, 237, 124, 35, 36, 235, 210, 35, 36, 237, 129, 35, - 36, 235, 215, 35, 36, 235, 230, 35, 36, 234, 116, 35, 36, 237, 133, 35, - 36, 235, 219, 35, 36, 235, 234, 35, 36, 234, 120, 35, 36, 235, 244, 35, - 36, 234, 130, 35, 36, 234, 150, 35, 36, 233, 140, 35, 36, 237, 136, 35, - 36, 235, 222, 35, 36, 235, 237, 35, 36, 234, 123, 35, 36, 235, 247, 35, - 36, 234, 133, 35, 36, 234, 153, 35, 36, 233, 143, 35, 36, 235, 253, 35, - 36, 234, 139, 35, 36, 234, 159, 35, 36, 233, 149, 35, 36, 234, 169, 35, - 36, 233, 159, 35, 36, 233, 174, 35, 36, 232, 135, 35, 36, 237, 138, 35, - 36, 235, 224, 35, 36, 235, 239, 35, 36, 234, 125, 35, 36, 235, 249, 35, - 36, 234, 135, 35, 36, 234, 155, 35, 36, 233, 145, 35, 36, 235, 255, 35, - 36, 234, 141, 35, 36, 234, 161, 35, 36, 233, 151, 35, 36, 234, 171, 35, - 36, 233, 161, 35, 36, 233, 176, 35, 36, 232, 137, 35, 36, 236, 2, 35, 36, - 234, 144, 35, 36, 234, 164, 35, 36, 233, 154, 35, 36, 234, 174, 35, 36, - 233, 164, 35, 36, 233, 179, 35, 36, 232, 140, 35, 36, 234, 178, 35, 36, - 233, 168, 35, 36, 233, 183, 35, 36, 232, 144, 35, 36, 233, 188, 35, 36, - 232, 149, 35, 36, 232, 155, 35, 36, 231, 129, 35, 36, 239, 53, 35, 36, - 237, 119, 35, 36, 237, 125, 35, 36, 235, 211, 35, 36, 237, 130, 35, 36, - 235, 216, 35, 36, 235, 231, 35, 36, 234, 117, 35, 36, 237, 134, 35, 36, - 235, 220, 35, 36, 235, 235, 35, 36, 234, 121, 35, 36, 235, 245, 35, 36, - 234, 131, 35, 36, 234, 151, 35, 36, 233, 141, 35, 36, 237, 137, 35, 36, - 235, 223, 35, 36, 235, 238, 35, 36, 234, 124, 35, 36, 235, 248, 35, 36, - 234, 134, 35, 36, 234, 154, 35, 36, 233, 144, 35, 36, 235, 254, 35, 36, - 234, 140, 35, 36, 234, 160, 35, 36, 233, 150, 35, 36, 234, 170, 35, 36, - 233, 160, 35, 36, 233, 175, 35, 36, 232, 136, 35, 36, 237, 139, 35, 36, - 235, 225, 35, 36, 235, 240, 35, 36, 234, 126, 35, 36, 235, 250, 35, 36, - 234, 136, 35, 36, 234, 156, 35, 36, 233, 146, 35, 36, 236, 0, 35, 36, - 234, 142, 35, 36, 234, 162, 35, 36, 233, 152, 35, 36, 234, 172, 35, 36, - 233, 162, 35, 36, 233, 177, 35, 36, 232, 138, 35, 36, 236, 3, 35, 36, - 234, 145, 35, 36, 234, 165, 35, 36, 233, 155, 35, 36, 234, 175, 35, 36, - 233, 165, 35, 36, 233, 180, 35, 36, 232, 141, 35, 36, 234, 179, 35, 36, - 233, 169, 35, 36, 233, 184, 35, 36, 232, 145, 35, 36, 233, 189, 35, 36, - 232, 150, 35, 36, 232, 156, 35, 36, 231, 130, 35, 36, 237, 140, 35, 36, - 235, 226, 35, 36, 235, 241, 35, 36, 234, 127, 35, 36, 235, 251, 35, 36, - 234, 137, 35, 36, 234, 157, 35, 36, 233, 147, 35, 36, 236, 1, 35, 36, - 234, 143, 35, 36, 234, 163, 35, 36, 233, 153, 35, 36, 234, 173, 35, 36, - 233, 163, 35, 36, 233, 178, 35, 36, 232, 139, 35, 36, 236, 4, 35, 36, - 234, 146, 35, 36, 234, 166, 35, 36, 233, 156, 35, 36, 234, 176, 35, 36, - 233, 166, 35, 36, 233, 181, 35, 36, 232, 142, 35, 36, 234, 180, 35, 36, - 233, 170, 35, 36, 233, 185, 35, 36, 232, 146, 35, 36, 233, 190, 35, 36, - 232, 151, 35, 36, 232, 157, 35, 36, 231, 131, 35, 36, 236, 5, 35, 36, - 234, 147, 35, 36, 234, 167, 35, 36, 233, 157, 35, 36, 234, 177, 35, 36, - 233, 167, 35, 36, 233, 182, 35, 36, 232, 143, 35, 36, 234, 181, 35, 36, - 233, 171, 35, 36, 233, 186, 35, 36, 232, 147, 35, 36, 233, 191, 35, 36, - 232, 152, 35, 36, 232, 158, 35, 36, 231, 132, 35, 36, 234, 182, 35, 36, - 233, 172, 35, 36, 233, 187, 35, 36, 232, 148, 35, 36, 233, 192, 35, 36, - 232, 153, 35, 36, 232, 159, 35, 36, 231, 133, 35, 36, 233, 193, 35, 36, - 232, 154, 35, 36, 232, 160, 35, 36, 231, 134, 35, 36, 232, 161, 35, 36, - 231, 135, 35, 36, 231, 136, 35, 36, 231, 64, 77, 234, 16, 65, 2, 59, 108, - 77, 234, 16, 65, 2, 45, 59, 108, 139, 45, 65, 2, 59, 108, 77, 45, 65, 2, - 59, 108, 40, 38, 45, 65, 2, 59, 108, 77, 234, 16, 65, 248, 44, 125, 139, - 45, 65, 248, 44, 125, 77, 45, 65, 248, 44, 125, 235, 45, 65, 2, 163, 108, - 226, 226, 65, 2, 163, 108, 226, 226, 240, 3, 56, 235, 45, 240, 3, 56, - 139, 45, 248, 63, 56, 77, 45, 248, 63, 56, 139, 240, 3, 248, 63, 56, 77, - 240, 3, 248, 63, 56, 77, 234, 16, 240, 3, 248, 63, 56, 77, 65, 2, 240, 4, - 243, 46, 226, 226, 65, 153, 125, 235, 45, 65, 153, 125, 77, 65, 2, 248, - 138, 2, 59, 108, 77, 65, 2, 248, 138, 2, 45, 59, 108, 77, 234, 16, 65, 2, - 242, 226, 77, 234, 16, 65, 2, 248, 138, 2, 59, 108, 77, 234, 16, 65, 2, - 248, 138, 2, 45, 59, 108, 139, 233, 64, 77, 233, 64, 139, 45, 233, 64, - 77, 45, 233, 64, 139, 65, 153, 86, 236, 164, 77, 65, 153, 86, 236, 164, - 139, 65, 248, 44, 253, 144, 153, 86, 236, 164, 77, 65, 248, 44, 253, 144, - 153, 86, 236, 164, 242, 223, 248, 56, 19, 242, 228, 248, 43, 56, 242, - 223, 248, 43, 19, 242, 228, 248, 56, 56, 242, 223, 248, 56, 65, 2, 90, - 242, 223, 248, 43, 65, 2, 90, 242, 228, 248, 43, 65, 2, 90, 242, 228, - 248, 56, 65, 2, 90, 242, 223, 248, 56, 65, 19, 242, 223, 248, 43, 56, - 242, 223, 248, 43, 65, 19, 242, 228, 248, 43, 56, 242, 228, 248, 43, 65, - 19, 242, 228, 248, 56, 56, 242, 228, 248, 56, 65, 19, 242, 223, 248, 56, - 56, 240, 69, 236, 159, 236, 185, 238, 105, 235, 86, 238, 105, 236, 159, - 236, 185, 240, 69, 235, 86, 242, 228, 248, 43, 65, 236, 185, 242, 223, - 248, 43, 56, 242, 223, 248, 43, 65, 236, 185, 242, 228, 248, 43, 56, 238, - 105, 236, 159, 236, 185, 242, 223, 248, 43, 56, 240, 69, 236, 159, 236, - 185, 242, 228, 248, 43, 56, 242, 223, 248, 43, 65, 236, 185, 242, 223, - 248, 56, 56, 242, 223, 248, 56, 65, 236, 185, 242, 223, 248, 43, 56, 248, - 141, 65, 236, 150, 237, 111, 225, 65, 236, 150, 77, 248, 187, 238, 111, - 236, 206, 65, 236, 150, 77, 248, 187, 238, 111, 234, 9, 65, 236, 150, - 235, 45, 248, 187, 238, 111, 234, 18, 65, 236, 150, 235, 45, 248, 187, - 238, 111, 233, 63, 234, 250, 253, 183, 235, 62, 56, 236, 50, 253, 183, - 231, 86, 56, 253, 159, 253, 183, 231, 86, 56, 240, 17, 253, 183, 231, 86, - 56, 253, 159, 253, 183, 235, 62, 65, 2, 240, 68, 253, 159, 253, 183, 231, - 86, 65, 2, 243, 12, 168, 38, 232, 98, 235, 62, 56, 168, 40, 232, 98, 231, - 86, 56, 231, 86, 240, 23, 218, 56, 235, 62, 240, 23, 218, 56, 77, 65, 60, - 242, 215, 139, 56, 139, 65, 60, 242, 215, 77, 56, 242, 215, 77, 65, 60, - 139, 56, 77, 65, 2, 248, 49, 46, 139, 65, 2, 248, 49, 46, 77, 65, 238, - 108, 206, 40, 38, 65, 238, 108, 3, 238, 51, 226, 226, 234, 16, 65, 248, - 44, 3, 238, 51, 40, 154, 88, 38, 154, 92, 236, 175, 40, 154, 92, 38, 154, - 88, 236, 175, 88, 154, 38, 92, 154, 40, 236, 175, 88, 154, 40, 92, 154, - 38, 236, 175, 40, 154, 88, 38, 154, 88, 236, 175, 88, 154, 38, 92, 154, - 38, 236, 175, 40, 154, 92, 38, 154, 92, 236, 175, 88, 154, 40, 92, 154, - 40, 236, 175, 139, 186, 2, 154, 88, 153, 125, 77, 186, 2, 154, 88, 153, - 125, 226, 226, 186, 2, 154, 38, 153, 125, 235, 45, 186, 2, 154, 38, 153, - 125, 139, 186, 2, 154, 92, 153, 125, 77, 186, 2, 154, 92, 153, 125, 226, - 226, 186, 2, 154, 40, 153, 125, 235, 45, 186, 2, 154, 40, 153, 125, 139, - 186, 2, 154, 88, 248, 44, 125, 77, 186, 2, 154, 88, 248, 44, 125, 226, - 226, 186, 2, 154, 38, 248, 44, 125, 235, 45, 186, 2, 154, 38, 248, 44, - 125, 139, 186, 2, 154, 92, 248, 44, 125, 77, 186, 2, 154, 92, 248, 44, - 125, 226, 226, 186, 2, 154, 40, 248, 44, 125, 235, 45, 186, 2, 154, 40, - 248, 44, 125, 139, 186, 2, 154, 88, 60, 139, 186, 2, 154, 242, 236, 226, - 226, 186, 2, 154, 40, 240, 45, 226, 226, 186, 2, 154, 225, 77, 186, 2, - 154, 88, 60, 77, 186, 2, 154, 242, 236, 235, 45, 186, 2, 154, 40, 240, - 45, 235, 45, 186, 2, 154, 225, 139, 186, 2, 154, 88, 60, 77, 186, 2, 154, - 253, 176, 139, 186, 2, 154, 92, 60, 77, 186, 2, 154, 242, 236, 77, 186, - 2, 154, 88, 60, 139, 186, 2, 154, 253, 176, 77, 186, 2, 154, 92, 60, 139, - 186, 2, 154, 242, 236, 139, 186, 2, 154, 88, 60, 183, 242, 235, 139, 186, - 2, 154, 92, 242, 230, 183, 242, 235, 77, 186, 2, 154, 88, 60, 183, 242, - 235, 77, 186, 2, 154, 92, 242, 230, 183, 242, 235, 226, 226, 186, 2, 154, - 40, 240, 45, 235, 45, 186, 2, 154, 225, 235, 45, 186, 2, 154, 40, 240, - 45, 226, 226, 186, 2, 154, 225, 38, 45, 65, 2, 238, 121, 243, 99, 240, 7, - 21, 60, 77, 56, 242, 219, 236, 208, 60, 77, 56, 139, 65, 60, 242, 219, - 235, 47, 77, 65, 60, 242, 219, 235, 47, 77, 65, 60, 240, 40, 95, 87, 235, - 44, 60, 139, 56, 139, 65, 238, 108, 234, 3, 232, 68, 60, 77, 56, 240, 26, - 60, 77, 56, 139, 65, 238, 108, 238, 87, 236, 154, 60, 139, 56, 40, 248, - 157, 242, 226, 38, 248, 157, 242, 226, 88, 248, 157, 242, 226, 92, 248, - 157, 242, 226, 240, 3, 59, 253, 144, 234, 35, 255, 97, 126, 247, 97, 255, - 97, 126, 249, 9, 240, 24, 40, 64, 242, 225, 104, 38, 64, 242, 225, 104, - 40, 64, 232, 74, 38, 64, 232, 74, 255, 97, 126, 40, 243, 11, 104, 255, - 97, 126, 38, 243, 11, 104, 255, 97, 126, 40, 238, 166, 104, 255, 97, 126, - 38, 238, 166, 104, 40, 31, 238, 52, 2, 235, 50, 38, 31, 238, 52, 2, 235, - 50, 40, 31, 238, 52, 2, 248, 188, 255, 22, 253, 159, 238, 67, 38, 31, - 238, 52, 2, 248, 188, 255, 22, 240, 17, 238, 67, 40, 31, 238, 52, 2, 248, - 188, 255, 22, 240, 17, 238, 67, 38, 31, 238, 52, 2, 248, 188, 255, 22, - 253, 159, 238, 67, 40, 185, 238, 52, 2, 248, 40, 38, 185, 238, 52, 2, - 248, 40, 40, 253, 183, 235, 44, 104, 38, 253, 183, 232, 68, 104, 45, 40, - 253, 183, 232, 68, 104, 45, 38, 253, 183, 235, 44, 104, 40, 86, 236, 171, - 242, 255, 104, 38, 86, 236, 171, 242, 255, 104, 240, 4, 240, 97, 59, 240, - 126, 242, 224, 236, 168, 185, 238, 96, 242, 220, 38, 185, 239, 240, 2, - 238, 59, 236, 168, 38, 185, 2, 248, 40, 185, 2, 255, 99, 238, 94, 242, - 241, 240, 54, 235, 109, 185, 238, 96, 242, 220, 235, 109, 185, 238, 96, - 253, 176, 205, 240, 54, 224, 240, 54, 185, 2, 235, 50, 224, 185, 2, 235, - 50, 238, 106, 185, 238, 96, 253, 176, 238, 106, 185, 238, 96, 242, 236, - 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, 88, - 19, 225, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, - 150, 88, 19, 242, 220, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, - 22, 65, 236, 150, 92, 19, 225, 236, 168, 185, 2, 248, 35, 253, 229, 240, - 63, 255, 22, 65, 236, 150, 92, 19, 242, 220, 236, 168, 185, 2, 248, 35, - 253, 229, 240, 63, 255, 22, 65, 236, 150, 38, 19, 253, 176, 236, 168, - 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, 40, 19, 253, - 176, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, 65, 236, 150, - 38, 19, 242, 236, 236, 168, 185, 2, 248, 35, 253, 229, 240, 63, 255, 22, - 65, 236, 150, 40, 19, 242, 236, 224, 243, 15, 249, 160, 243, 15, 254, 30, - 2, 236, 163, 243, 15, 254, 30, 2, 3, 218, 48, 243, 15, 254, 30, 2, 38, - 65, 48, 243, 15, 254, 30, 2, 40, 65, 48, 218, 2, 163, 125, 29, 59, 125, - 29, 235, 105, 29, 238, 75, 236, 177, 29, 231, 49, 218, 238, 135, 255, 25, - 163, 253, 144, 19, 253, 159, 137, 238, 135, 255, 25, 59, 125, 218, 2, - 233, 39, 206, 29, 226, 231, 236, 196, 52, 88, 65, 238, 108, 238, 51, 29, - 64, 238, 69, 29, 238, 69, 29, 234, 3, 29, 231, 85, 218, 2, 3, 218, 153, - 253, 145, 225, 218, 2, 171, 163, 239, 207, 153, 253, 145, 225, 238, 84, - 240, 69, 236, 159, 240, 37, 238, 84, 238, 105, 236, 159, 240, 37, 238, - 84, 235, 52, 238, 84, 3, 238, 51, 238, 84, 238, 59, 171, 240, 116, 238, - 12, 236, 152, 2, 53, 48, 236, 152, 2, 235, 50, 255, 99, 255, 22, 235, 46, - 236, 152, 2, 240, 220, 255, 31, 238, 128, 38, 236, 152, 60, 40, 235, 46, - 40, 236, 152, 240, 45, 59, 125, 59, 253, 144, 240, 45, 38, 235, 46, 240, - 161, 2, 40, 137, 240, 0, 240, 161, 2, 38, 137, 240, 0, 86, 238, 168, 243, - 48, 2, 40, 137, 240, 0, 243, 48, 2, 38, 137, 240, 0, 64, 234, 39, 86, - 234, 39, 40, 240, 125, 240, 97, 38, 240, 125, 240, 97, 40, 45, 240, 125, - 240, 97, 38, 45, 240, 125, 240, 97, 234, 204, 235, 101, 254, 248, 248, - 59, 235, 101, 237, 180, 238, 203, 2, 59, 125, 232, 162, 235, 103, 31, 2, - 235, 194, 237, 229, 236, 40, 254, 143, 239, 195, 236, 170, 240, 7, 21, - 19, 238, 58, 235, 105, 240, 7, 21, 19, 238, 58, 236, 200, 2, 242, 219, - 48, 235, 89, 153, 19, 238, 58, 235, 105, 241, 138, 242, 132, 231, 83, - 231, 91, 236, 152, 2, 40, 137, 240, 0, 231, 91, 236, 152, 2, 38, 137, - 240, 0, 86, 238, 76, 2, 92, 56, 86, 236, 231, 64, 218, 2, 92, 56, 86, - 218, 2, 92, 56, 232, 78, 64, 238, 59, 232, 78, 86, 238, 59, 232, 78, 64, - 236, 164, 232, 78, 86, 236, 164, 232, 78, 64, 238, 51, 232, 78, 86, 238, - 51, 231, 152, 238, 75, 238, 83, 235, 47, 238, 83, 2, 236, 163, 238, 75, - 238, 83, 2, 163, 108, 253, 213, 236, 177, 253, 213, 238, 75, 236, 177, - 45, 243, 12, 240, 3, 243, 12, 231, 87, 240, 95, 185, 104, 231, 36, 240, - 95, 185, 104, 247, 152, 246, 87, 242, 238, 29, 53, 235, 47, 242, 238, 29, - 248, 49, 235, 47, 242, 238, 29, 243, 48, 235, 47, 242, 238, 243, 2, 236, - 208, 2, 248, 40, 242, 238, 243, 2, 236, 208, 2, 243, 12, 242, 238, 31, - 232, 76, 235, 47, 242, 238, 31, 243, 2, 235, 47, 171, 238, 56, 19, 235, - 47, 171, 238, 56, 128, 235, 47, 242, 238, 243, 48, 235, 47, 241, 247, - 171, 252, 192, 235, 112, 2, 235, 60, 235, 71, 236, 167, 235, 47, 241, - 110, 249, 134, 235, 60, 236, 167, 2, 45, 108, 236, 167, 238, 255, 2, 240, - 37, 233, 122, 236, 29, 231, 86, 232, 177, 248, 41, 233, 70, 2, 233, 97, - 249, 135, 240, 127, 243, 116, 248, 41, 233, 70, 2, 232, 98, 249, 135, - 240, 127, 243, 116, 248, 41, 233, 70, 161, 236, 39, 253, 145, 243, 116, - 236, 167, 240, 127, 134, 242, 232, 235, 47, 234, 242, 236, 167, 235, 47, - 236, 167, 2, 139, 65, 2, 90, 236, 167, 2, 243, 48, 52, 236, 167, 2, 231, - 88, 236, 167, 2, 240, 58, 236, 167, 2, 236, 163, 236, 167, 2, 235, 50, - 243, 61, 243, 22, 40, 236, 152, 235, 47, 255, 97, 126, 240, 144, 232, - 104, 255, 97, 126, 240, 144, 239, 162, 255, 97, 126, 240, 144, 233, 225, - 248, 49, 21, 2, 3, 218, 48, 248, 49, 21, 2, 190, 240, 2, 48, 248, 49, 21, - 2, 242, 219, 48, 248, 49, 21, 2, 53, 46, 248, 49, 21, 2, 242, 219, 46, - 248, 49, 21, 2, 235, 48, 111, 248, 49, 21, 2, 86, 235, 46, 242, 250, 21, - 2, 242, 244, 48, 242, 250, 21, 2, 53, 46, 242, 250, 21, 2, 238, 105, 243, - 5, 242, 250, 21, 2, 240, 69, 243, 5, 248, 49, 21, 255, 22, 40, 137, 238, - 51, 248, 49, 21, 255, 22, 38, 137, 238, 51, 242, 176, 128, 243, 38, 236, - 170, 231, 37, 21, 2, 53, 48, 231, 37, 21, 2, 235, 50, 234, 21, 239, 167, - 2, 240, 17, 239, 29, 244, 20, 236, 170, 231, 37, 21, 255, 22, 40, 137, - 238, 51, 231, 37, 21, 255, 22, 38, 137, 238, 51, 29, 231, 37, 21, 2, 190, - 238, 54, 231, 37, 21, 255, 22, 45, 238, 51, 29, 236, 196, 52, 248, 49, - 21, 255, 22, 235, 46, 242, 250, 21, 255, 22, 235, 46, 231, 37, 21, 255, - 22, 235, 46, 237, 14, 236, 170, 236, 93, 237, 14, 236, 170, 255, 97, 126, - 234, 246, 232, 104, 232, 115, 128, 234, 50, 232, 76, 2, 248, 40, 243, 2, - 2, 242, 250, 52, 243, 2, 2, 236, 163, 232, 76, 2, 236, 163, 232, 76, 2, - 238, 56, 248, 91, 243, 2, 2, 238, 56, 253, 227, 243, 2, 60, 231, 88, 232, - 76, 60, 240, 58, 243, 2, 60, 253, 144, 60, 231, 88, 232, 76, 60, 253, - 144, 60, 240, 58, 243, 2, 240, 45, 19, 240, 116, 2, 240, 58, 232, 76, - 240, 45, 19, 240, 116, 2, 231, 88, 240, 23, 243, 2, 2, 238, 214, 240, 23, - 232, 76, 2, 238, 214, 45, 31, 231, 88, 45, 31, 240, 58, 240, 23, 243, 2, - 2, 240, 220, 19, 244, 20, 236, 170, 238, 56, 19, 2, 53, 48, 238, 56, 128, - 2, 53, 48, 45, 238, 56, 248, 91, 45, 238, 56, 253, 227, 171, 232, 105, - 238, 56, 248, 91, 171, 232, 105, 238, 56, 253, 227, 238, 217, 243, 22, - 253, 227, 238, 217, 243, 22, 248, 91, 238, 56, 128, 233, 91, 238, 56, - 248, 91, 238, 56, 19, 2, 240, 1, 243, 46, 238, 56, 128, 2, 240, 1, 243, - 46, 238, 56, 19, 2, 163, 242, 235, 238, 56, 128, 2, 163, 242, 235, 238, - 56, 19, 2, 45, 236, 163, 238, 56, 19, 2, 235, 50, 238, 56, 19, 2, 45, - 235, 50, 3, 254, 255, 2, 235, 50, 238, 56, 128, 2, 45, 236, 163, 238, 56, - 128, 2, 45, 235, 50, 255, 97, 126, 241, 87, 227, 10, 255, 97, 126, 247, - 28, 227, 10, 240, 7, 21, 2, 53, 46, 235, 89, 2, 53, 48, 240, 3, 163, 253, - 144, 2, 45, 59, 108, 240, 3, 163, 253, 144, 2, 240, 3, 59, 108, 242, 219, - 236, 208, 2, 53, 48, 242, 219, 236, 208, 2, 240, 69, 243, 5, 238, 81, - 242, 250, 238, 5, 235, 192, 2, 53, 48, 240, 7, 2, 235, 52, 240, 40, 95, - 153, 2, 190, 238, 54, 231, 89, 95, 128, 95, 87, 240, 7, 21, 60, 248, 49, - 52, 248, 49, 21, 60, 240, 7, 52, 240, 7, 21, 60, 242, 219, 235, 47, 45, - 243, 14, 240, 32, 171, 233, 82, 240, 7, 240, 232, 204, 233, 82, 240, 7, - 240, 232, 240, 7, 21, 2, 171, 181, 60, 19, 171, 181, 46, 234, 5, 2, 248, - 58, 181, 48, 235, 44, 2, 218, 238, 94, 232, 68, 2, 218, 238, 94, 235, 44, - 2, 236, 156, 158, 48, 232, 68, 2, 236, 156, 158, 48, 235, 44, 128, 238, - 58, 95, 87, 232, 68, 128, 238, 58, 95, 87, 235, 44, 128, 238, 58, 95, - 153, 2, 53, 238, 94, 232, 68, 128, 238, 58, 95, 153, 2, 53, 238, 94, 235, - 44, 128, 238, 58, 95, 153, 2, 53, 48, 232, 68, 128, 238, 58, 95, 153, 2, - 53, 48, 235, 44, 128, 238, 58, 95, 153, 2, 53, 60, 225, 232, 68, 128, - 238, 58, 95, 153, 2, 53, 60, 242, 220, 235, 44, 128, 232, 81, 232, 68, - 128, 232, 81, 235, 44, 19, 233, 61, 161, 95, 87, 232, 68, 19, 233, 61, - 161, 95, 87, 235, 44, 19, 161, 232, 81, 232, 68, 19, 161, 232, 81, 235, - 44, 60, 233, 57, 95, 60, 231, 85, 232, 68, 60, 233, 57, 95, 60, 234, 3, - 235, 44, 60, 238, 81, 128, 240, 32, 232, 68, 60, 238, 81, 128, 240, 32, - 235, 44, 60, 238, 81, 60, 231, 85, 232, 68, 60, 238, 81, 60, 234, 3, 235, - 44, 60, 232, 68, 60, 233, 57, 240, 32, 232, 68, 60, 235, 44, 60, 233, 57, - 240, 32, 235, 44, 60, 238, 58, 95, 60, 232, 68, 60, 238, 58, 240, 32, - 232, 68, 60, 238, 58, 95, 60, 235, 44, 60, 238, 58, 240, 32, 238, 58, 95, - 153, 128, 234, 3, 238, 58, 95, 153, 128, 231, 85, 238, 58, 95, 153, 128, - 235, 44, 2, 53, 238, 94, 238, 58, 95, 153, 128, 232, 68, 2, 53, 238, 94, - 233, 57, 95, 153, 128, 234, 3, 233, 57, 95, 153, 128, 231, 85, 233, 57, - 238, 58, 95, 153, 128, 234, 3, 233, 57, 238, 58, 95, 153, 128, 231, 85, - 238, 81, 128, 234, 3, 238, 81, 128, 231, 85, 238, 81, 60, 235, 44, 60, - 240, 7, 52, 238, 81, 60, 232, 68, 60, 240, 7, 52, 45, 240, 102, 234, 3, - 45, 240, 102, 231, 85, 45, 240, 102, 235, 44, 2, 235, 50, 232, 68, 233, - 91, 234, 3, 232, 68, 240, 45, 234, 3, 235, 44, 240, 23, 255, 25, 240, - 163, 232, 68, 240, 23, 255, 25, 240, 163, 235, 44, 240, 23, 255, 25, 243, - 158, 60, 238, 58, 240, 32, 232, 68, 240, 23, 255, 25, 243, 158, 60, 238, - 58, 240, 32, 238, 218, 243, 127, 240, 196, 243, 127, 238, 218, 249, 1, - 128, 95, 87, 240, 196, 249, 1, 128, 95, 87, 240, 7, 21, 2, 244, 232, 48, - 236, 176, 60, 233, 61, 240, 7, 52, 236, 178, 60, 233, 61, 240, 7, 52, - 236, 176, 60, 233, 61, 161, 95, 87, 236, 178, 60, 233, 61, 161, 95, 87, - 236, 176, 60, 240, 7, 52, 236, 178, 60, 240, 7, 52, 236, 176, 60, 161, - 95, 87, 236, 178, 60, 161, 95, 87, 236, 176, 60, 240, 40, 95, 87, 236, - 178, 60, 240, 40, 95, 87, 236, 176, 60, 161, 240, 40, 95, 87, 236, 178, - 60, 161, 240, 40, 95, 87, 45, 235, 107, 45, 235, 111, 240, 26, 2, 248, - 40, 236, 154, 2, 248, 40, 240, 26, 2, 248, 49, 21, 46, 236, 154, 2, 248, - 49, 21, 46, 240, 26, 2, 231, 37, 21, 46, 236, 154, 2, 231, 37, 21, 46, - 240, 26, 147, 128, 95, 153, 2, 53, 48, 236, 154, 147, 128, 95, 153, 2, - 53, 48, 240, 26, 147, 60, 240, 7, 52, 236, 154, 147, 60, 240, 7, 52, 240, - 26, 147, 60, 242, 219, 235, 47, 236, 154, 147, 60, 242, 219, 235, 47, - 240, 26, 147, 60, 240, 40, 95, 87, 236, 154, 147, 60, 240, 40, 95, 87, - 240, 26, 147, 60, 161, 95, 87, 236, 154, 147, 60, 161, 95, 87, 31, 40, - 248, 35, 66, 235, 47, 31, 38, 248, 35, 66, 235, 47, 240, 23, 238, 87, - 240, 23, 235, 84, 240, 23, 240, 26, 128, 95, 87, 240, 23, 236, 154, 128, - 95, 87, 240, 26, 60, 235, 84, 236, 154, 60, 238, 87, 240, 26, 60, 238, - 87, 236, 154, 60, 235, 84, 236, 154, 240, 45, 238, 87, 236, 154, 240, 45, - 19, 240, 116, 255, 25, 248, 63, 2, 238, 87, 238, 68, 147, 238, 96, 234, - 9, 236, 75, 2, 254, 246, 249, 3, 233, 254, 231, 88, 237, 160, 233, 220, - 242, 215, 40, 242, 234, 242, 215, 92, 242, 234, 242, 215, 88, 242, 234, - 231, 151, 2, 193, 59, 253, 144, 240, 3, 38, 234, 15, 45, 59, 253, 144, - 40, 234, 15, 59, 253, 144, 45, 40, 234, 15, 45, 59, 253, 144, 45, 40, - 234, 15, 183, 248, 63, 248, 44, 40, 241, 234, 147, 45, 235, 63, 242, 215, - 92, 248, 84, 2, 236, 163, 242, 215, 88, 248, 84, 2, 235, 50, 242, 215, - 88, 248, 84, 60, 242, 215, 92, 242, 234, 45, 92, 242, 234, 45, 88, 242, - 234, 45, 240, 5, 161, 52, 224, 45, 240, 5, 161, 52, 248, 86, 161, 241, - 86, 2, 224, 237, 217, 240, 37, 59, 248, 41, 2, 218, 48, 59, 248, 41, 2, - 218, 46, 92, 248, 84, 2, 218, 46, 236, 200, 2, 163, 108, 236, 200, 2, - 242, 219, 235, 47, 240, 3, 59, 253, 144, 240, 159, 235, 92, 240, 3, 59, - 253, 144, 2, 163, 108, 240, 3, 243, 14, 235, 47, 240, 3, 240, 102, 234, - 3, 240, 3, 240, 102, 231, 85, 233, 57, 238, 58, 235, 44, 128, 95, 87, - 233, 57, 238, 58, 232, 68, 128, 95, 87, 240, 3, 238, 83, 240, 159, 235, - 92, 243, 22, 240, 3, 59, 253, 144, 235, 47, 45, 238, 83, 235, 47, 64, 59, - 125, 242, 238, 64, 59, 125, 242, 223, 248, 43, 64, 56, 242, 223, 248, 56, - 64, 56, 242, 228, 248, 43, 64, 56, 242, 228, 248, 56, 64, 56, 40, 38, 64, - 56, 139, 86, 56, 226, 226, 86, 56, 235, 45, 86, 56, 242, 223, 248, 43, - 86, 56, 242, 223, 248, 56, 86, 56, 242, 228, 248, 43, 86, 56, 242, 228, - 248, 56, 86, 56, 40, 38, 86, 56, 88, 92, 86, 56, 77, 65, 2, 253, 241, - 234, 9, 77, 65, 2, 253, 241, 236, 206, 139, 65, 2, 253, 241, 234, 9, 139, - 65, 2, 253, 241, 236, 206, 31, 2, 253, 159, 137, 240, 0, 31, 2, 240, 17, - 137, 240, 0, 98, 5, 1, 249, 29, 98, 5, 1, 243, 152, 98, 5, 1, 244, 45, - 98, 5, 1, 237, 12, 98, 5, 1, 240, 170, 98, 5, 1, 240, 254, 98, 5, 1, 237, - 52, 98, 5, 1, 240, 171, 98, 5, 1, 238, 235, 98, 5, 1, 243, 60, 98, 5, 1, - 54, 243, 60, 98, 5, 1, 71, 98, 5, 1, 238, 178, 98, 5, 1, 243, 204, 98, 5, - 1, 237, 21, 98, 5, 1, 236, 216, 98, 5, 1, 240, 202, 98, 5, 1, 249, 131, - 98, 5, 1, 238, 210, 98, 5, 1, 240, 217, 98, 5, 1, 240, 235, 98, 5, 1, - 238, 230, 98, 5, 1, 249, 190, 98, 5, 1, 240, 177, 98, 5, 1, 243, 193, 98, - 5, 1, 249, 132, 98, 5, 1, 253, 175, 98, 5, 1, 244, 14, 98, 5, 1, 248, - 140, 98, 5, 1, 238, 170, 98, 5, 1, 248, 46, 98, 5, 1, 243, 83, 98, 5, 1, - 244, 57, 98, 5, 1, 244, 56, 98, 5, 1, 238, 221, 219, 98, 5, 1, 253, 161, - 98, 5, 1, 3, 248, 74, 98, 5, 1, 3, 254, 136, 2, 242, 226, 98, 5, 1, 253, - 162, 98, 5, 1, 238, 117, 3, 248, 74, 98, 5, 1, 253, 213, 248, 74, 98, 5, - 1, 238, 117, 253, 213, 248, 74, 98, 5, 1, 243, 57, 98, 5, 1, 236, 215, - 98, 5, 1, 237, 40, 98, 5, 1, 234, 87, 67, 98, 5, 1, 237, 19, 236, 216, - 98, 3, 1, 249, 29, 98, 3, 1, 243, 152, 98, 3, 1, 244, 45, 98, 3, 1, 237, - 12, 98, 3, 1, 240, 170, 98, 3, 1, 240, 254, 98, 3, 1, 237, 52, 98, 3, 1, - 240, 171, 98, 3, 1, 238, 235, 98, 3, 1, 243, 60, 98, 3, 1, 54, 243, 60, - 98, 3, 1, 71, 98, 3, 1, 238, 178, 98, 3, 1, 243, 204, 98, 3, 1, 237, 21, - 98, 3, 1, 236, 216, 98, 3, 1, 240, 202, 98, 3, 1, 249, 131, 98, 3, 1, - 238, 210, 98, 3, 1, 240, 217, 98, 3, 1, 240, 235, 98, 3, 1, 238, 230, 98, - 3, 1, 249, 190, 98, 3, 1, 240, 177, 98, 3, 1, 243, 193, 98, 3, 1, 249, - 132, 98, 3, 1, 253, 175, 98, 3, 1, 244, 14, 98, 3, 1, 248, 140, 98, 3, 1, - 238, 170, 98, 3, 1, 248, 46, 98, 3, 1, 243, 83, 98, 3, 1, 244, 57, 98, 3, - 1, 244, 56, 98, 3, 1, 238, 221, 219, 98, 3, 1, 253, 161, 98, 3, 1, 3, - 248, 74, 98, 3, 1, 3, 254, 136, 2, 242, 226, 98, 3, 1, 253, 162, 98, 3, - 1, 238, 117, 3, 248, 74, 98, 3, 1, 253, 213, 248, 74, 98, 3, 1, 238, 117, - 253, 213, 248, 74, 98, 3, 1, 243, 57, 98, 3, 1, 236, 215, 98, 3, 1, 237, - 40, 98, 3, 1, 234, 87, 67, 98, 3, 1, 237, 19, 236, 216, 62, 5, 1, 243, - 141, 62, 3, 1, 243, 141, 62, 5, 1, 244, 47, 62, 3, 1, 244, 47, 62, 5, 1, - 240, 10, 62, 3, 1, 240, 10, 62, 5, 1, 240, 164, 62, 3, 1, 240, 164, 62, - 5, 1, 248, 154, 62, 3, 1, 248, 154, 62, 5, 1, 249, 167, 62, 3, 1, 249, - 167, 62, 5, 1, 244, 65, 62, 3, 1, 244, 65, 62, 5, 1, 243, 190, 62, 3, 1, - 243, 190, 62, 5, 1, 238, 226, 62, 3, 1, 238, 226, 62, 5, 1, 240, 191, 62, - 3, 1, 240, 191, 62, 5, 1, 243, 62, 62, 3, 1, 243, 62, 62, 5, 1, 240, 197, - 62, 3, 1, 240, 197, 62, 5, 1, 253, 180, 62, 3, 1, 253, 180, 62, 5, 1, - 253, 166, 62, 3, 1, 253, 166, 62, 5, 1, 248, 163, 62, 3, 1, 248, 163, 62, - 5, 1, 73, 62, 3, 1, 73, 62, 5, 1, 253, 147, 62, 3, 1, 253, 147, 62, 5, 1, - 253, 160, 62, 3, 1, 253, 160, 62, 5, 1, 243, 123, 62, 3, 1, 243, 123, 62, - 5, 1, 248, 85, 62, 3, 1, 248, 85, 62, 5, 1, 254, 74, 62, 3, 1, 254, 74, - 62, 5, 1, 253, 245, 62, 3, 1, 253, 245, 62, 5, 1, 248, 219, 62, 3, 1, - 248, 219, 62, 5, 1, 248, 69, 62, 3, 1, 248, 69, 62, 5, 1, 248, 179, 62, - 3, 1, 248, 179, 62, 5, 1, 235, 67, 243, 3, 62, 3, 1, 235, 67, 243, 3, 62, - 5, 1, 76, 62, 248, 105, 62, 3, 1, 76, 62, 248, 105, 62, 5, 1, 231, 93, - 248, 154, 62, 3, 1, 231, 93, 248, 154, 62, 5, 1, 235, 67, 243, 62, 62, 3, - 1, 235, 67, 243, 62, 62, 5, 1, 235, 67, 253, 166, 62, 3, 1, 235, 67, 253, - 166, 62, 5, 1, 231, 93, 253, 166, 62, 3, 1, 231, 93, 253, 166, 62, 5, 1, - 76, 62, 248, 179, 62, 3, 1, 76, 62, 248, 179, 62, 5, 1, 240, 121, 62, 3, - 1, 240, 121, 62, 5, 1, 238, 133, 243, 32, 62, 3, 1, 238, 133, 243, 32, - 62, 5, 1, 76, 62, 243, 32, 62, 3, 1, 76, 62, 243, 32, 62, 5, 1, 76, 62, - 248, 93, 62, 3, 1, 76, 62, 248, 93, 62, 5, 1, 236, 245, 243, 64, 62, 3, - 1, 236, 245, 243, 64, 62, 5, 1, 235, 67, 243, 28, 62, 3, 1, 235, 67, 243, - 28, 62, 5, 1, 76, 62, 243, 28, 62, 3, 1, 76, 62, 243, 28, 62, 5, 1, 76, - 62, 219, 62, 3, 1, 76, 62, 219, 62, 5, 1, 237, 18, 219, 62, 3, 1, 237, - 18, 219, 62, 5, 1, 76, 62, 249, 81, 62, 3, 1, 76, 62, 249, 81, 62, 5, 1, - 76, 62, 248, 214, 62, 3, 1, 76, 62, 248, 214, 62, 5, 1, 76, 62, 238, 115, - 62, 3, 1, 76, 62, 238, 115, 62, 5, 1, 76, 62, 249, 54, 62, 3, 1, 76, 62, - 249, 54, 62, 5, 1, 76, 62, 240, 88, 62, 3, 1, 76, 62, 240, 88, 62, 5, 1, - 76, 240, 43, 240, 88, 62, 3, 1, 76, 240, 43, 240, 88, 62, 5, 1, 76, 240, - 43, 248, 232, 62, 3, 1, 76, 240, 43, 248, 232, 62, 5, 1, 76, 240, 43, - 248, 178, 62, 3, 1, 76, 240, 43, 248, 178, 62, 5, 1, 76, 240, 43, 249, - 198, 62, 3, 1, 76, 240, 43, 249, 198, 62, 12, 249, 91, 62, 12, 255, 82, - 253, 160, 62, 12, 255, 29, 253, 160, 62, 12, 238, 13, 62, 12, 254, 244, - 253, 160, 62, 12, 254, 184, 253, 160, 62, 12, 247, 74, 243, 123, 62, 76, - 240, 43, 248, 37, 208, 62, 76, 240, 43, 240, 169, 236, 156, 69, 62, 76, - 240, 43, 237, 179, 236, 156, 69, 62, 76, 240, 43, 244, 46, 236, 213, 62, - 236, 155, 253, 125, 243, 7, 62, 248, 37, 208, 62, 231, 149, 236, 213, 75, - 3, 1, 254, 19, 75, 3, 1, 248, 195, 75, 3, 1, 248, 158, 75, 3, 1, 248, - 205, 75, 3, 1, 253, 202, 75, 3, 1, 249, 11, 75, 3, 1, 249, 25, 75, 3, 1, - 248, 253, 75, 3, 1, 253, 247, 75, 3, 1, 248, 162, 75, 3, 1, 248, 224, 75, - 3, 1, 248, 131, 75, 3, 1, 248, 171, 75, 3, 1, 254, 9, 75, 3, 1, 248, 236, - 75, 3, 1, 243, 138, 75, 3, 1, 248, 243, 75, 3, 1, 248, 134, 75, 3, 1, - 248, 254, 75, 3, 1, 254, 75, 75, 3, 1, 243, 115, 75, 3, 1, 243, 103, 75, - 3, 1, 243, 95, 75, 3, 1, 248, 242, 75, 3, 1, 243, 33, 75, 3, 1, 243, 88, - 75, 3, 1, 248, 100, 75, 3, 1, 248, 217, 75, 3, 1, 248, 201, 75, 3, 1, - 243, 87, 75, 3, 1, 249, 16, 75, 3, 1, 243, 101, 75, 3, 1, 248, 212, 75, - 3, 1, 253, 168, 75, 3, 1, 248, 160, 75, 3, 1, 253, 170, 75, 3, 1, 248, - 213, 75, 3, 1, 248, 215, 174, 1, 216, 174, 1, 253, 65, 174, 1, 247, 213, - 174, 1, 253, 68, 174, 1, 242, 193, 174, 1, 240, 158, 238, 157, 249, 202, - 174, 1, 249, 202, 174, 1, 253, 66, 174, 1, 247, 216, 174, 1, 247, 215, - 174, 1, 242, 192, 174, 1, 253, 79, 174, 1, 253, 67, 174, 1, 249, 20, 174, - 1, 240, 66, 249, 20, 174, 1, 242, 194, 174, 1, 249, 19, 174, 1, 240, 158, - 238, 157, 249, 19, 174, 1, 240, 66, 249, 19, 174, 1, 247, 218, 174, 1, - 248, 191, 174, 1, 244, 55, 174, 1, 240, 66, 244, 55, 174, 1, 249, 204, - 174, 1, 240, 66, 249, 204, 174, 1, 253, 189, 174, 1, 243, 135, 174, 1, - 238, 239, 243, 135, 174, 1, 240, 66, 243, 135, 174, 1, 253, 69, 174, 1, - 253, 70, 174, 1, 249, 203, 174, 1, 240, 66, 247, 217, 174, 1, 240, 66, - 243, 50, 174, 1, 253, 71, 174, 1, 253, 161, 174, 1, 253, 72, 174, 1, 247, - 219, 174, 1, 243, 134, 174, 1, 240, 66, 243, 134, 174, 1, 249, 246, 243, - 134, 174, 1, 253, 73, 174, 1, 247, 221, 174, 1, 247, 220, 174, 1, 249, - 21, 174, 1, 247, 222, 174, 1, 247, 214, 174, 1, 247, 223, 174, 1, 253, - 74, 174, 1, 253, 75, 174, 1, 253, 76, 174, 1, 249, 205, 174, 1, 235, 32, - 249, 205, 174, 1, 247, 224, 174, 49, 1, 231, 146, 69, 22, 4, 251, 202, - 22, 4, 251, 239, 22, 4, 252, 142, 22, 4, 252, 183, 22, 4, 247, 75, 22, 4, - 250, 128, 22, 4, 252, 226, 22, 4, 250, 165, 22, 4, 252, 32, 22, 4, 246, - 205, 22, 4, 238, 62, 254, 117, 22, 4, 253, 109, 22, 4, 250, 202, 22, 4, - 245, 49, 22, 4, 251, 122, 22, 4, 247, 145, 22, 4, 245, 4, 22, 4, 246, - 246, 22, 4, 252, 71, 22, 4, 245, 116, 22, 4, 245, 118, 22, 4, 241, 135, - 22, 4, 245, 117, 22, 4, 248, 66, 22, 4, 248, 251, 22, 4, 248, 249, 22, 4, - 247, 99, 22, 4, 247, 103, 22, 4, 249, 168, 22, 4, 248, 250, 22, 4, 250, - 148, 22, 4, 250, 152, 22, 4, 250, 150, 22, 4, 244, 245, 22, 4, 244, 246, - 22, 4, 250, 149, 22, 4, 250, 151, 22, 4, 249, 224, 22, 4, 249, 228, 22, - 4, 249, 226, 22, 4, 248, 15, 22, 4, 248, 19, 22, 4, 249, 225, 22, 4, 249, - 227, 22, 4, 244, 247, 22, 4, 244, 251, 22, 4, 244, 249, 22, 4, 241, 45, - 22, 4, 241, 46, 22, 4, 244, 248, 22, 4, 244, 250, 22, 4, 252, 115, 22, 4, - 252, 122, 22, 4, 252, 117, 22, 4, 247, 23, 22, 4, 247, 24, 22, 4, 252, - 116, 22, 4, 252, 118, 22, 4, 251, 175, 22, 4, 251, 179, 22, 4, 251, 177, - 22, 4, 246, 31, 22, 4, 246, 32, 22, 4, 251, 176, 22, 4, 251, 178, 22, 4, - 253, 56, 22, 4, 253, 63, 22, 4, 253, 58, 22, 4, 247, 208, 22, 4, 247, - 209, 22, 4, 253, 57, 22, 4, 253, 59, 22, 4, 251, 39, 22, 4, 251, 44, 22, - 4, 251, 42, 22, 4, 245, 136, 22, 4, 245, 137, 22, 4, 251, 40, 22, 4, 251, - 43, 38, 185, 232, 79, 238, 95, 38, 185, 240, 4, 232, 79, 238, 95, 40, - 232, 79, 104, 38, 232, 79, 104, 40, 240, 4, 232, 79, 104, 38, 240, 4, - 232, 79, 104, 240, 84, 231, 107, 238, 95, 240, 84, 240, 4, 231, 107, 238, - 95, 240, 4, 231, 100, 238, 95, 40, 231, 100, 104, 38, 231, 100, 104, 240, - 84, 238, 59, 40, 240, 84, 237, 26, 104, 38, 240, 84, 237, 26, 104, 236, - 11, 237, 92, 232, 95, 240, 176, 232, 95, 224, 240, 176, 232, 95, 231, - 140, 240, 4, 239, 149, 235, 45, 238, 160, 226, 226, 238, 160, 240, 4, - 231, 36, 240, 54, 45, 238, 106, 238, 93, 40, 170, 234, 61, 104, 38, 170, - 234, 61, 104, 7, 25, 239, 173, 7, 25, 240, 131, 7, 25, 240, 87, 127, 7, - 25, 240, 87, 111, 7, 25, 240, 87, 166, 7, 25, 239, 160, 7, 25, 248, 92, - 7, 25, 240, 241, 7, 25, 243, 209, 127, 7, 25, 243, 209, 111, 7, 25, 233, - 83, 7, 25, 244, 5, 7, 25, 3, 127, 7, 25, 3, 111, 7, 25, 248, 164, 127, 7, - 25, 248, 164, 111, 7, 25, 248, 164, 166, 7, 25, 248, 164, 177, 7, 25, - 242, 119, 7, 25, 238, 228, 7, 25, 244, 21, 127, 7, 25, 244, 21, 111, 7, - 25, 243, 16, 127, 7, 25, 243, 16, 111, 7, 25, 243, 59, 7, 25, 248, 244, - 7, 25, 241, 54, 7, 25, 248, 136, 7, 25, 243, 30, 7, 25, 240, 167, 7, 25, - 239, 140, 7, 25, 235, 189, 7, 25, 244, 50, 127, 7, 25, 244, 50, 111, 7, - 25, 243, 27, 7, 25, 254, 122, 127, 7, 25, 254, 122, 111, 7, 25, 234, 23, - 137, 249, 185, 240, 247, 7, 25, 248, 202, 7, 25, 249, 56, 7, 25, 243, - 199, 7, 25, 249, 33, 147, 240, 132, 7, 25, 249, 59, 7, 25, 240, 237, 127, - 7, 25, 240, 237, 111, 7, 25, 238, 164, 7, 25, 243, 122, 7, 25, 232, 72, - 243, 122, 7, 25, 254, 41, 127, 7, 25, 254, 41, 111, 7, 25, 254, 41, 166, - 7, 25, 254, 41, 177, 7, 25, 246, 65, 7, 25, 240, 225, 7, 25, 249, 151, 7, - 25, 249, 58, 7, 25, 249, 129, 7, 25, 243, 151, 127, 7, 25, 243, 151, 111, - 7, 25, 243, 222, 7, 25, 238, 202, 7, 25, 243, 97, 127, 7, 25, 243, 97, - 111, 7, 25, 243, 97, 166, 7, 25, 240, 245, 7, 25, 236, 255, 7, 25, 248, - 56, 127, 7, 25, 248, 56, 111, 7, 25, 232, 72, 248, 184, 7, 25, 234, 23, - 243, 8, 7, 25, 243, 8, 7, 25, 232, 72, 238, 220, 7, 25, 232, 72, 240, - 227, 7, 25, 243, 94, 7, 25, 232, 72, 243, 154, 7, 25, 234, 23, 244, 48, - 7, 25, 249, 13, 127, 7, 25, 249, 13, 111, 7, 25, 243, 156, 7, 25, 232, - 72, 243, 96, 7, 25, 183, 127, 7, 25, 183, 111, 7, 25, 232, 72, 243, 66, - 7, 25, 232, 72, 243, 178, 7, 25, 243, 227, 127, 7, 25, 243, 227, 111, 7, - 25, 243, 250, 7, 25, 243, 149, 7, 25, 232, 72, 240, 242, 236, 230, 7, 25, - 232, 72, 243, 214, 7, 25, 232, 72, 243, 82, 7, 25, 232, 72, 249, 63, 7, - 25, 254, 58, 127, 7, 25, 254, 58, 111, 7, 25, 254, 58, 166, 7, 25, 232, - 72, 248, 207, 7, 25, 243, 99, 7, 25, 232, 72, 240, 189, 7, 25, 243, 150, - 7, 25, 240, 181, 7, 25, 232, 72, 243, 172, 7, 25, 232, 72, 243, 85, 7, - 25, 232, 72, 244, 4, 7, 25, 234, 23, 240, 153, 7, 25, 234, 23, 238, 232, - 7, 25, 232, 72, 243, 176, 7, 25, 232, 84, 243, 93, 7, 25, 232, 72, 243, - 93, 7, 25, 232, 84, 240, 151, 7, 25, 232, 72, 240, 151, 7, 25, 232, 84, - 238, 137, 7, 25, 232, 72, 238, 137, 7, 25, 238, 125, 7, 25, 232, 84, 238, - 125, 7, 25, 232, 72, 238, 125, 43, 25, 127, 43, 25, 242, 224, 43, 25, - 248, 40, 43, 25, 240, 37, 43, 25, 239, 185, 43, 25, 90, 43, 25, 111, 43, - 25, 251, 195, 43, 25, 248, 131, 43, 25, 246, 41, 43, 25, 241, 95, 43, 25, - 195, 43, 25, 92, 248, 92, 43, 25, 241, 67, 43, 25, 249, 84, 43, 25, 240, - 241, 43, 25, 248, 35, 248, 92, 43, 25, 241, 204, 43, 25, 240, 210, 43, - 25, 247, 197, 43, 25, 242, 125, 43, 25, 38, 248, 35, 248, 92, 43, 25, - 241, 150, 234, 36, 43, 25, 248, 53, 43, 25, 233, 83, 43, 25, 244, 5, 43, - 25, 240, 131, 43, 25, 237, 243, 43, 25, 241, 6, 43, 25, 240, 201, 43, 25, - 234, 36, 43, 25, 240, 49, 43, 25, 238, 2, 43, 25, 253, 234, 43, 25, 255, - 75, 239, 198, 43, 25, 237, 153, 43, 25, 250, 123, 43, 25, 240, 253, 43, - 25, 241, 52, 43, 25, 247, 34, 43, 25, 245, 227, 43, 25, 240, 147, 43, 25, - 246, 37, 43, 25, 239, 32, 43, 25, 239, 202, 43, 25, 235, 102, 43, 25, - 242, 84, 43, 25, 247, 196, 43, 25, 237, 226, 43, 25, 239, 232, 43, 25, - 250, 207, 43, 25, 242, 215, 238, 228, 43, 25, 240, 4, 240, 131, 43, 25, - 183, 239, 206, 43, 25, 171, 241, 147, 43, 25, 242, 107, 43, 25, 248, 198, - 43, 25, 242, 120, 43, 25, 237, 80, 43, 25, 247, 121, 43, 25, 240, 138, - 43, 25, 237, 169, 43, 25, 245, 72, 43, 25, 243, 59, 43, 25, 239, 12, 43, - 25, 248, 244, 43, 25, 239, 183, 43, 25, 239, 44, 43, 25, 249, 245, 43, - 25, 238, 59, 43, 25, 248, 233, 43, 25, 248, 136, 43, 25, 252, 169, 43, - 25, 243, 30, 43, 25, 244, 37, 43, 25, 246, 35, 43, 25, 208, 43, 25, 240, - 167, 43, 25, 239, 247, 43, 25, 255, 48, 248, 233, 43, 25, 237, 89, 43, - 25, 249, 64, 43, 25, 245, 21, 43, 25, 242, 133, 43, 25, 240, 105, 43, 25, - 243, 27, 43, 25, 245, 22, 43, 25, 239, 67, 43, 25, 45, 206, 43, 25, 137, - 249, 185, 240, 247, 43, 25, 242, 115, 43, 25, 245, 89, 43, 25, 248, 202, - 43, 25, 249, 56, 43, 25, 236, 80, 43, 25, 243, 199, 43, 25, 241, 233, 43, - 25, 247, 151, 43, 25, 242, 136, 43, 25, 246, 51, 43, 25, 253, 5, 43, 25, - 241, 106, 43, 25, 249, 33, 147, 240, 132, 43, 25, 236, 103, 43, 25, 240, - 4, 247, 139, 43, 25, 240, 39, 43, 25, 247, 91, 43, 25, 245, 68, 43, 25, - 249, 59, 43, 25, 240, 236, 43, 25, 56, 43, 25, 242, 134, 43, 25, 239, - 201, 43, 25, 242, 156, 43, 25, 241, 140, 43, 25, 244, 243, 43, 25, 242, - 131, 43, 25, 238, 164, 43, 25, 247, 30, 43, 25, 243, 122, 43, 25, 251, - 111, 43, 25, 252, 14, 43, 25, 240, 225, 43, 25, 237, 156, 43, 25, 249, - 129, 43, 25, 248, 91, 43, 25, 246, 252, 43, 25, 248, 206, 43, 25, 241, - 39, 43, 25, 243, 222, 43, 25, 236, 61, 43, 25, 244, 6, 43, 25, 238, 249, - 43, 25, 238, 202, 43, 25, 238, 156, 43, 25, 239, 153, 43, 25, 244, 226, - 43, 25, 236, 108, 43, 25, 241, 63, 43, 25, 241, 142, 43, 25, 240, 245, - 43, 25, 239, 100, 43, 25, 241, 34, 43, 25, 249, 13, 234, 36, 43, 25, 236, - 255, 43, 25, 247, 194, 43, 25, 248, 184, 43, 25, 243, 8, 43, 25, 238, - 220, 43, 25, 239, 238, 43, 25, 244, 213, 43, 25, 252, 66, 43, 25, 239, 1, - 43, 25, 240, 227, 43, 25, 252, 131, 43, 25, 252, 151, 43, 25, 243, 94, - 43, 25, 244, 227, 43, 25, 243, 154, 43, 25, 239, 9, 43, 25, 237, 214, 43, - 25, 244, 48, 43, 25, 243, 156, 43, 25, 243, 133, 43, 25, 232, 132, 43, - 25, 238, 43, 43, 25, 243, 96, 43, 25, 243, 66, 43, 25, 243, 178, 43, 25, - 241, 249, 43, 25, 242, 114, 43, 25, 242, 215, 242, 139, 243, 85, 43, 25, - 243, 250, 43, 25, 243, 149, 43, 25, 242, 187, 43, 25, 243, 39, 43, 25, - 236, 230, 43, 25, 240, 242, 236, 230, 43, 25, 246, 40, 43, 25, 242, 121, - 43, 25, 243, 214, 43, 25, 243, 82, 43, 25, 249, 63, 43, 25, 248, 207, 43, - 25, 243, 99, 43, 25, 236, 27, 43, 25, 240, 189, 43, 25, 243, 150, 43, 25, - 247, 137, 43, 25, 245, 140, 43, 25, 241, 108, 43, 25, 233, 232, 243, 133, - 43, 25, 235, 117, 43, 25, 240, 181, 43, 25, 243, 172, 43, 25, 243, 85, - 43, 25, 244, 4, 43, 25, 243, 164, 43, 25, 240, 153, 43, 25, 245, 141, 43, - 25, 238, 232, 43, 25, 239, 137, 43, 25, 240, 0, 43, 25, 233, 195, 43, 25, - 243, 176, 43, 25, 239, 229, 43, 25, 245, 74, 43, 25, 249, 152, 43, 25, - 246, 176, 43, 25, 243, 93, 43, 25, 240, 151, 43, 25, 238, 137, 43, 25, - 238, 125, 43, 25, 241, 112, 80, 233, 55, 99, 40, 153, 225, 80, 233, 55, - 99, 60, 153, 46, 80, 233, 55, 99, 40, 153, 240, 1, 19, 225, 80, 233, 55, - 99, 60, 153, 240, 1, 19, 46, 80, 233, 55, 99, 248, 37, 236, 121, 80, 233, - 55, 99, 236, 204, 248, 44, 48, 80, 233, 55, 99, 236, 204, 248, 44, 46, - 80, 233, 55, 99, 236, 204, 248, 44, 242, 220, 80, 233, 55, 99, 236, 204, - 248, 44, 189, 242, 220, 80, 233, 55, 99, 236, 204, 248, 44, 189, 225, 80, - 233, 55, 99, 236, 204, 248, 44, 168, 242, 220, 80, 233, 55, 99, 236, 66, - 80, 240, 15, 80, 240, 27, 80, 248, 37, 208, 245, 69, 69, 237, 184, 234, - 206, 237, 44, 91, 80, 235, 77, 69, 80, 238, 171, 69, 80, 61, 242, 217, - 40, 185, 104, 38, 185, 104, 40, 45, 185, 104, 38, 45, 185, 104, 40, 240, - 31, 104, 38, 240, 31, 104, 40, 64, 240, 31, 104, 38, 64, 240, 31, 104, - 40, 86, 234, 11, 104, 38, 86, 234, 11, 104, 240, 142, 69, 251, 16, 69, - 40, 236, 171, 242, 255, 104, 38, 236, 171, 242, 255, 104, 40, 64, 234, - 11, 104, 38, 64, 234, 11, 104, 40, 64, 236, 171, 242, 255, 104, 38, 64, - 236, 171, 242, 255, 104, 40, 64, 31, 104, 38, 64, 31, 104, 248, 141, 242, - 235, 224, 45, 243, 117, 235, 51, 69, 45, 243, 117, 235, 51, 69, 170, 45, - 243, 117, 235, 51, 69, 240, 142, 158, 243, 39, 236, 166, 178, 127, 236, - 166, 178, 111, 236, 166, 178, 166, 236, 166, 178, 177, 236, 166, 178, - 176, 236, 166, 178, 187, 236, 166, 178, 203, 236, 166, 178, 195, 236, - 166, 178, 202, 80, 246, 42, 188, 69, 80, 240, 69, 188, 69, 80, 235, 98, - 188, 69, 80, 237, 151, 188, 69, 23, 240, 12, 53, 188, 69, 23, 45, 53, - 188, 69, 248, 103, 242, 235, 59, 248, 130, 240, 64, 69, 59, 248, 130, - 240, 64, 2, 240, 59, 243, 1, 69, 59, 248, 130, 240, 64, 158, 189, 243, 7, - 59, 248, 130, 240, 64, 2, 240, 59, 243, 1, 158, 189, 243, 7, 59, 248, - 130, 240, 64, 158, 168, 243, 7, 29, 240, 142, 69, 80, 145, 248, 41, 250, - 237, 235, 95, 91, 236, 166, 178, 248, 53, 236, 166, 178, 238, 77, 236, - 166, 178, 238, 101, 59, 80, 235, 77, 69, 251, 219, 69, 249, 134, 233, - 112, 69, 80, 34, 234, 30, 80, 137, 250, 245, 240, 15, 105, 1, 3, 67, 105, + 3, 1, 235, 93, 29, 8, 3, 1, 144, 29, 8, 3, 1, 193, 29, 8, 3, 1, 214, 29, + 8, 3, 1, 79, 29, 8, 3, 1, 179, 29, 8, 3, 1, 228, 144, 29, 8, 3, 1, 206, + 29, 8, 3, 1, 228, 7, 29, 8, 3, 1, 227, 103, 29, 26, 227, 80, 238, 4, 29, + 61, 248, 245, 238, 4, 29, 61, 229, 81, 238, 4, 29, 61, 230, 46, 238, 4, + 29, 61, 247, 251, 238, 4, 29, 61, 248, 78, 238, 4, 29, 61, 232, 0, 238, + 4, 29, 61, 232, 156, 238, 4, 29, 61, 249, 9, 238, 4, 29, 61, 237, 186, + 238, 4, 29, 61, 229, 79, 45, 29, 26, 127, 45, 29, 26, 111, 45, 29, 26, + 166, 45, 29, 26, 177, 45, 29, 26, 176, 45, 29, 26, 187, 45, 29, 26, 203, + 45, 29, 26, 195, 45, 29, 26, 202, 45, 29, 61, 230, 112, 238, 4, 29, 26, + 227, 80, 66, 70, 136, 246, 53, 66, 70, 96, 246, 53, 66, 70, 136, 228, + 201, 66, 70, 96, 228, 201, 66, 70, 136, 229, 170, 251, 55, 246, 53, 66, + 70, 96, 229, 170, 251, 55, 246, 53, 66, 70, 136, 229, 170, 251, 55, 228, + 201, 66, 70, 96, 229, 170, 251, 55, 228, 201, 66, 70, 136, 235, 32, 251, + 55, 246, 53, 66, 70, 96, 235, 32, 251, 55, 246, 53, 66, 70, 136, 235, 32, + 251, 55, 228, 201, 66, 70, 96, 235, 32, 251, 55, 228, 201, 66, 70, 136, + 92, 19, 225, 66, 70, 92, 136, 19, 38, 246, 199, 66, 70, 92, 96, 19, 38, + 239, 200, 66, 70, 96, 92, 19, 225, 66, 70, 136, 92, 19, 239, 248, 66, 70, + 92, 136, 19, 40, 246, 199, 66, 70, 92, 96, 19, 40, 239, 200, 66, 70, 96, + 92, 19, 239, 248, 66, 70, 136, 88, 19, 225, 66, 70, 88, 136, 19, 38, 246, + 199, 66, 70, 88, 96, 19, 38, 239, 200, 66, 70, 96, 88, 19, 225, 66, 70, + 136, 88, 19, 239, 248, 66, 70, 88, 136, 19, 40, 246, 199, 66, 70, 88, 96, + 19, 40, 239, 200, 66, 70, 96, 88, 19, 239, 248, 66, 70, 136, 59, 19, 225, + 66, 70, 59, 136, 19, 38, 246, 199, 66, 70, 88, 96, 19, 38, 92, 239, 200, + 66, 70, 92, 96, 19, 38, 88, 239, 200, 66, 70, 59, 96, 19, 38, 239, 200, + 66, 70, 92, 136, 19, 38, 88, 246, 199, 66, 70, 88, 136, 19, 38, 92, 246, + 199, 66, 70, 96, 59, 19, 225, 66, 70, 136, 59, 19, 239, 248, 66, 70, 59, + 136, 19, 40, 246, 199, 66, 70, 88, 96, 19, 40, 92, 239, 200, 66, 70, 92, + 96, 19, 40, 88, 239, 200, 66, 70, 59, 96, 19, 40, 239, 200, 66, 70, 92, + 136, 19, 40, 88, 246, 199, 66, 70, 88, 136, 19, 40, 92, 246, 199, 66, 70, + 96, 59, 19, 239, 248, 66, 70, 136, 92, 19, 246, 53, 66, 70, 40, 96, 19, + 38, 92, 239, 200, 66, 70, 38, 96, 19, 40, 92, 239, 200, 66, 70, 92, 136, + 19, 163, 246, 199, 66, 70, 92, 96, 19, 163, 239, 200, 66, 70, 38, 136, + 19, 40, 92, 246, 199, 66, 70, 40, 136, 19, 38, 92, 246, 199, 66, 70, 96, + 92, 19, 246, 53, 66, 70, 136, 88, 19, 246, 53, 66, 70, 40, 96, 19, 38, + 88, 239, 200, 66, 70, 38, 96, 19, 40, 88, 239, 200, 66, 70, 88, 136, 19, + 163, 246, 199, 66, 70, 88, 96, 19, 163, 239, 200, 66, 70, 38, 136, 19, + 40, 88, 246, 199, 66, 70, 40, 136, 19, 38, 88, 246, 199, 66, 70, 96, 88, + 19, 246, 53, 66, 70, 136, 59, 19, 246, 53, 66, 70, 40, 96, 19, 38, 59, + 239, 200, 66, 70, 38, 96, 19, 40, 59, 239, 200, 66, 70, 59, 136, 19, 163, + 246, 199, 66, 70, 88, 96, 19, 92, 163, 239, 200, 66, 70, 92, 96, 19, 88, + 163, 239, 200, 66, 70, 59, 96, 19, 163, 239, 200, 66, 70, 40, 88, 96, 19, + 38, 92, 239, 200, 66, 70, 38, 88, 96, 19, 40, 92, 239, 200, 66, 70, 40, + 92, 96, 19, 38, 88, 239, 200, 66, 70, 38, 92, 96, 19, 40, 88, 239, 200, + 66, 70, 92, 136, 19, 88, 163, 246, 199, 66, 70, 88, 136, 19, 92, 163, + 246, 199, 66, 70, 38, 136, 19, 40, 59, 246, 199, 66, 70, 40, 136, 19, 38, + 59, 246, 199, 66, 70, 96, 59, 19, 246, 53, 66, 70, 136, 45, 251, 55, 246, + 53, 66, 70, 96, 45, 251, 55, 246, 53, 66, 70, 136, 45, 251, 55, 228, 201, + 66, 70, 96, 45, 251, 55, 228, 201, 66, 70, 45, 246, 53, 66, 70, 45, 228, + 201, 66, 70, 92, 232, 29, 19, 38, 249, 93, 66, 70, 92, 45, 19, 38, 232, + 28, 66, 70, 45, 92, 19, 225, 66, 70, 92, 232, 29, 19, 40, 249, 93, 66, + 70, 92, 45, 19, 40, 232, 28, 66, 70, 45, 92, 19, 239, 248, 66, 70, 88, + 232, 29, 19, 38, 249, 93, 66, 70, 88, 45, 19, 38, 232, 28, 66, 70, 45, + 88, 19, 225, 66, 70, 88, 232, 29, 19, 40, 249, 93, 66, 70, 88, 45, 19, + 40, 232, 28, 66, 70, 45, 88, 19, 239, 248, 66, 70, 59, 232, 29, 19, 38, + 249, 93, 66, 70, 59, 45, 19, 38, 232, 28, 66, 70, 45, 59, 19, 225, 66, + 70, 59, 232, 29, 19, 40, 249, 93, 66, 70, 59, 45, 19, 40, 232, 28, 66, + 70, 45, 59, 19, 239, 248, 66, 70, 92, 232, 29, 19, 163, 249, 93, 66, 70, + 92, 45, 19, 163, 232, 28, 66, 70, 45, 92, 19, 246, 53, 66, 70, 88, 232, + 29, 19, 163, 249, 93, 66, 70, 88, 45, 19, 163, 232, 28, 66, 70, 45, 88, + 19, 246, 53, 66, 70, 59, 232, 29, 19, 163, 249, 93, 66, 70, 59, 45, 19, + 163, 232, 28, 66, 70, 45, 59, 19, 246, 53, 66, 70, 136, 254, 203, 92, 19, + 225, 66, 70, 136, 254, 203, 92, 19, 239, 248, 66, 70, 136, 254, 203, 88, + 19, 239, 248, 66, 70, 136, 254, 203, 88, 19, 225, 66, 70, 136, 250, 199, + 189, 38, 153, 168, 239, 248, 66, 70, 136, 250, 199, 189, 40, 153, 168, + 225, 66, 70, 136, 250, 199, 251, 152, 66, 70, 136, 239, 248, 66, 70, 136, + 229, 0, 66, 70, 136, 225, 66, 70, 136, 249, 88, 66, 70, 96, 239, 248, 66, + 70, 96, 229, 0, 66, 70, 96, 225, 66, 70, 96, 249, 88, 66, 70, 136, 40, + 19, 96, 225, 66, 70, 136, 88, 19, 96, 249, 88, 66, 70, 96, 40, 19, 136, + 225, 66, 70, 96, 88, 19, 136, 249, 88, 189, 137, 253, 8, 168, 236, 210, + 249, 8, 253, 8, 168, 236, 210, 235, 31, 253, 8, 168, 204, 249, 6, 253, 8, + 168, 137, 253, 8, 168, 248, 48, 249, 6, 253, 8, 168, 204, 235, 29, 253, + 8, 168, 232, 158, 249, 6, 253, 8, 247, 231, 253, 8, 40, 232, 158, 249, 6, + 253, 8, 40, 204, 235, 29, 253, 8, 40, 248, 48, 249, 6, 253, 8, 40, 137, + 253, 8, 40, 204, 249, 6, 253, 8, 40, 236, 210, 235, 31, 253, 8, 40, 236, + 210, 249, 8, 253, 8, 38, 137, 253, 8, 136, 232, 141, 239, 33, 232, 141, + 251, 60, 232, 141, 189, 236, 210, 249, 8, 253, 8, 38, 236, 210, 249, 8, + 253, 8, 235, 34, 168, 239, 248, 235, 34, 168, 225, 235, 34, 189, 239, + 248, 235, 34, 189, 40, 19, 168, 40, 19, 168, 225, 235, 34, 189, 40, 19, + 168, 225, 235, 34, 189, 40, 19, 189, 38, 19, 168, 239, 248, 235, 34, 189, + 40, 19, 189, 38, 19, 168, 225, 235, 34, 189, 225, 235, 34, 189, 38, 19, + 168, 239, 248, 235, 34, 189, 38, 19, 168, 40, 19, 168, 225, 86, 231, 171, + 64, 231, 171, 64, 31, 2, 234, 75, 251, 172, 64, 31, 251, 190, 86, 3, 231, + 171, 31, 2, 163, 248, 65, 31, 2, 59, 248, 65, 31, 2, 236, 175, 251, 148, + 248, 65, 31, 2, 189, 40, 153, 168, 38, 248, 65, 31, 2, 189, 38, 153, 168, + 40, 248, 65, 31, 2, 250, 199, 251, 148, 248, 65, 86, 3, 231, 171, 64, 3, + 231, 171, 86, 234, 195, 64, 234, 195, 86, 59, 234, 195, 64, 59, 234, 195, + 86, 236, 109, 64, 236, 109, 86, 228, 255, 229, 182, 64, 228, 255, 229, + 182, 86, 228, 255, 3, 229, 182, 64, 228, 255, 3, 229, 182, 86, 234, 119, + 229, 182, 64, 234, 119, 229, 182, 86, 234, 119, 3, 229, 182, 64, 234, + 119, 3, 229, 182, 86, 234, 119, 235, 199, 64, 234, 119, 235, 199, 86, + 249, 87, 229, 182, 64, 249, 87, 229, 182, 86, 249, 87, 3, 229, 182, 64, + 249, 87, 3, 229, 182, 86, 239, 247, 229, 182, 64, 239, 247, 229, 182, 86, + 239, 247, 3, 229, 182, 64, 239, 247, 3, 229, 182, 86, 239, 247, 235, 199, + 64, 239, 247, 235, 199, 86, 250, 192, 64, 250, 192, 64, 250, 193, 251, + 190, 86, 3, 250, 192, 248, 53, 239, 137, 64, 252, 5, 249, 98, 252, 5, + 218, 2, 59, 248, 65, 252, 209, 86, 252, 5, 218, 2, 40, 137, 253, 15, 218, + 2, 38, 137, 253, 15, 218, 2, 168, 137, 253, 15, 218, 2, 189, 137, 253, + 15, 218, 2, 189, 38, 235, 34, 253, 15, 218, 2, 255, 31, 252, 198, 189, + 40, 235, 34, 253, 15, 40, 137, 86, 252, 5, 38, 137, 86, 252, 5, 241, 144, + 252, 210, 241, 144, 64, 252, 5, 189, 137, 241, 144, 64, 252, 5, 168, 137, + 241, 144, 64, 252, 5, 189, 40, 235, 34, 252, 4, 254, 202, 189, 38, 235, + 34, 252, 4, 254, 202, 168, 38, 235, 34, 252, 4, 254, 202, 168, 40, 235, + 34, 252, 4, 254, 202, 189, 137, 252, 5, 168, 137, 252, 5, 86, 168, 38, + 229, 182, 86, 168, 40, 229, 182, 86, 189, 40, 229, 182, 86, 189, 38, 229, + 182, 64, 252, 210, 31, 2, 40, 137, 253, 15, 31, 2, 38, 137, 253, 15, 31, + 2, 189, 40, 250, 199, 137, 253, 15, 31, 2, 168, 38, 250, 199, 137, 253, + 15, 64, 31, 2, 59, 253, 24, 239, 193, 64, 228, 255, 229, 183, 2, 250, + 100, 228, 255, 229, 183, 2, 40, 137, 253, 15, 228, 255, 229, 183, 2, 38, + 137, 253, 15, 240, 16, 252, 5, 64, 31, 2, 189, 40, 235, 33, 64, 31, 2, + 168, 40, 235, 33, 64, 31, 2, 168, 38, 235, 33, 64, 31, 2, 189, 38, 235, + 33, 64, 218, 2, 189, 40, 235, 33, 64, 218, 2, 168, 40, 235, 33, 64, 218, + 2, 168, 38, 235, 33, 64, 218, 2, 189, 38, 235, 33, 189, 40, 229, 182, + 189, 38, 229, 182, 168, 40, 229, 182, 64, 239, 33, 231, 171, 86, 239, 33, + 231, 171, 64, 239, 33, 3, 231, 171, 86, 239, 33, 3, 231, 171, 168, 38, + 229, 182, 86, 231, 36, 2, 234, 207, 251, 232, 229, 22, 231, 218, 251, + 217, 86, 231, 112, 64, 231, 112, 239, 199, 230, 22, 231, 35, 254, 166, + 237, 135, 250, 218, 237, 135, 251, 197, 236, 186, 86, 230, 117, 64, 230, + 117, 253, 151, 252, 242, 253, 151, 66, 2, 252, 73, 253, 151, 66, 2, 206, + 233, 244, 229, 23, 2, 234, 222, 249, 75, 246, 48, 253, 49, 64, 232, 97, + 236, 2, 86, 232, 97, 236, 2, 232, 137, 224, 234, 78, 248, 29, 246, 204, + 252, 210, 86, 40, 235, 198, 241, 184, 86, 38, 235, 198, 241, 184, 64, 40, + 235, 198, 241, 184, 64, 88, 235, 198, 241, 184, 64, 38, 235, 198, 241, + 184, 64, 92, 235, 198, 241, 184, 231, 244, 19, 251, 151, 252, 140, 52, + 234, 228, 52, 253, 29, 52, 252, 172, 254, 252, 236, 176, 251, 152, 252, + 64, 234, 147, 251, 153, 147, 239, 145, 251, 153, 147, 241, 91, 231, 113, + 19, 251, 156, 248, 117, 91, 255, 79, 232, 139, 246, 235, 19, 232, 49, + 236, 79, 91, 227, 177, 227, 231, 229, 174, 28, 246, 201, 229, 174, 28, + 240, 28, 229, 174, 28, 248, 57, 229, 174, 28, 230, 23, 229, 174, 28, 228, + 86, 229, 174, 28, 228, 122, 229, 174, 28, 238, 149, 229, 174, 28, 249, + 32, 228, 99, 147, 250, 204, 64, 247, 234, 248, 135, 64, 231, 226, 248, + 135, 86, 231, 226, 248, 135, 64, 231, 36, 2, 234, 207, 248, 56, 235, 31, + 238, 159, 240, 12, 235, 31, 238, 159, 239, 14, 248, 94, 52, 249, 32, 239, + 85, 52, 241, 25, 233, 228, 228, 244, 237, 253, 235, 211, 254, 191, 230, + 145, 247, 167, 252, 161, 239, 231, 228, 180, 239, 207, 233, 210, 233, + 253, 252, 153, 254, 212, 235, 228, 64, 252, 68, 240, 161, 64, 252, 68, + 235, 24, 64, 252, 68, 234, 82, 64, 252, 68, 253, 23, 64, 252, 68, 240, + 129, 64, 252, 68, 236, 86, 86, 252, 68, 240, 161, 86, 252, 68, 235, 24, + 86, 252, 68, 234, 82, 86, 252, 68, 253, 23, 86, 252, 68, 240, 129, 86, + 252, 68, 236, 86, 86, 231, 192, 231, 43, 64, 246, 204, 231, 43, 64, 250, + 193, 231, 43, 86, 251, 231, 231, 43, 64, 231, 192, 231, 43, 86, 246, 204, + 231, 43, 86, 250, 193, 231, 43, 64, 251, 231, 231, 43, 246, 48, 231, 175, + 235, 31, 237, 115, 249, 8, 237, 115, 253, 89, 249, 8, 237, 112, 253, 89, + 231, 255, 237, 112, 238, 118, 248, 37, 52, 238, 118, 238, 66, 52, 238, + 118, 232, 132, 52, 228, 104, 129, 251, 152, 249, 29, 129, 251, 152, 229, + 7, 234, 191, 91, 234, 191, 12, 28, 229, 58, 235, 217, 234, 191, 12, 28, + 229, 57, 235, 217, 234, 191, 12, 28, 229, 56, 235, 217, 234, 191, 12, 28, + 229, 55, 235, 217, 234, 191, 12, 28, 229, 54, 235, 217, 234, 191, 12, 28, + 229, 53, 235, 217, 234, 191, 12, 28, 229, 52, 235, 217, 234, 191, 12, 28, + 247, 166, 239, 51, 86, 229, 7, 234, 191, 91, 234, 192, 236, 121, 91, 236, + 101, 236, 121, 91, 236, 49, 236, 121, 52, 228, 97, 91, 250, 187, 248, + 134, 250, 187, 248, 133, 250, 187, 248, 132, 250, 187, 248, 131, 250, + 187, 248, 130, 250, 187, 248, 129, 64, 218, 2, 53, 225, 64, 218, 2, 171, + 250, 98, 86, 218, 2, 64, 53, 225, 86, 218, 2, 171, 64, 250, 98, 238, 166, + 28, 227, 231, 238, 166, 28, 227, 176, 250, 170, 28, 247, 44, 227, 231, + 250, 170, 28, 239, 226, 227, 176, 250, 170, 28, 239, 226, 227, 231, 250, + 170, 28, 247, 44, 227, 176, 64, 248, 43, 86, 248, 43, 246, 235, 19, 236, + 4, 255, 6, 251, 150, 231, 1, 231, 120, 147, 255, 70, 233, 219, 255, 37, + 248, 26, 247, 172, 231, 120, 147, 246, 186, 254, 150, 91, 248, 34, 228, + 132, 52, 200, 228, 168, 52, 249, 90, 248, 94, 52, 249, 90, 239, 85, 52, + 241, 152, 248, 94, 19, 239, 85, 52, 239, 85, 19, 248, 94, 52, 239, 85, 2, + 231, 79, 52, 239, 85, 2, 231, 79, 19, 239, 85, 19, 248, 94, 52, 59, 239, + 85, 2, 231, 79, 52, 163, 239, 85, 2, 231, 79, 52, 239, 33, 64, 252, 5, + 239, 33, 86, 252, 5, 239, 33, 3, 64, 252, 5, 239, 60, 91, 250, 132, 91, + 229, 6, 236, 100, 91, 251, 222, 247, 227, 228, 243, 189, 253, 11, 233, + 211, 86, 233, 211, 168, 253, 11, 233, 211, 64, 233, 211, 230, 118, 239, + 165, 52, 230, 153, 249, 77, 255, 47, 248, 214, 228, 192, 246, 232, 228, + 65, 246, 232, 168, 38, 236, 64, 236, 64, 189, 38, 236, 64, 64, 237, 207, + 86, 237, 207, 252, 74, 69, 96, 252, 74, 69, 238, 133, 206, 96, 238, 133, + 206, 253, 151, 206, 96, 253, 151, 206, 236, 161, 17, 251, 152, 96, 17, + 251, 152, 236, 195, 252, 108, 251, 152, 96, 236, 195, 252, 108, 251, 152, + 8, 251, 152, 232, 140, 64, 8, 251, 152, 236, 161, 8, 251, 152, 239, 83, + 251, 152, 231, 113, 147, 251, 48, 248, 0, 230, 127, 254, 159, 248, 0, + 253, 152, 254, 159, 96, 248, 0, 253, 152, 254, 159, 248, 0, 251, 230, + 254, 159, 86, 248, 0, 235, 200, 231, 112, 64, 248, 0, 235, 200, 231, 112, + 231, 84, 236, 161, 64, 231, 112, 29, 64, 231, 112, 236, 195, 252, 108, + 86, 231, 112, 86, 252, 108, 64, 231, 112, 236, 161, 86, 231, 112, 96, + 236, 161, 86, 231, 112, 235, 231, 231, 112, 232, 140, 64, 231, 112, 96, + 254, 159, 236, 195, 252, 108, 254, 159, 249, 11, 231, 179, 254, 159, 249, + 11, 235, 200, 86, 231, 112, 249, 11, 235, 200, 235, 231, 231, 112, 232, + 5, 235, 200, 86, 231, 112, 249, 11, 235, 200, 234, 193, 86, 231, 112, 96, + 249, 11, 235, 200, 234, 193, 86, 231, 112, 229, 82, 235, 200, 86, 231, + 112, 232, 1, 235, 200, 254, 159, 230, 127, 254, 159, 236, 195, 252, 108, + 230, 127, 254, 159, 96, 230, 127, 254, 159, 232, 5, 236, 39, 86, 19, 64, + 248, 28, 86, 248, 28, 64, 248, 28, 249, 11, 236, 39, 236, 161, 86, 248, + 28, 29, 236, 195, 252, 108, 249, 11, 235, 200, 231, 112, 96, 230, 127, + 235, 231, 254, 159, 231, 219, 230, 7, 229, 177, 231, 219, 96, 252, 66, + 231, 219, 231, 191, 96, 231, 191, 253, 152, 254, 159, 249, 11, 230, 127, + 235, 143, 254, 159, 96, 249, 11, 230, 127, 235, 143, 254, 159, 232, 140, + 64, 252, 5, 168, 38, 249, 76, 64, 231, 171, 189, 38, 249, 76, 64, 231, + 171, 168, 38, 232, 140, 64, 231, 171, 189, 38, 232, 140, 64, 231, 171, + 86, 250, 193, 238, 192, 64, 206, 136, 59, 125, 239, 33, 59, 125, 96, 59, + 125, 96, 232, 29, 205, 251, 215, 235, 13, 158, 236, 178, 96, 232, 29, + 251, 215, 235, 13, 158, 236, 178, 96, 45, 205, 251, 215, 235, 13, 158, + 236, 178, 96, 45, 251, 215, 235, 13, 158, 236, 178, 251, 129, 231, 103, + 236, 118, 21, 236, 178, 96, 248, 156, 158, 236, 178, 96, 246, 204, 248, + 156, 158, 236, 178, 96, 86, 246, 203, 234, 78, 96, 86, 246, 204, 252, + 210, 248, 29, 246, 203, 234, 78, 248, 29, 246, 204, 252, 210, 239, 33, + 40, 236, 107, 236, 178, 239, 33, 38, 236, 107, 236, 178, 239, 33, 248, + 35, 40, 236, 107, 236, 178, 239, 33, 248, 35, 38, 236, 107, 236, 178, + 239, 33, 239, 247, 185, 252, 239, 236, 178, 239, 33, 234, 119, 185, 252, + 239, 236, 178, 96, 239, 247, 185, 235, 13, 158, 236, 178, 96, 234, 119, + 185, 235, 13, 158, 236, 178, 96, 239, 247, 185, 252, 239, 236, 178, 96, + 234, 119, 185, 252, 239, 236, 178, 136, 40, 229, 202, 232, 117, 252, 239, + 236, 178, 136, 38, 229, 202, 232, 117, 252, 239, 236, 178, 239, 33, 40, + 251, 134, 252, 239, 236, 178, 239, 33, 38, 251, 134, 252, 239, 236, 178, + 250, 158, 238, 4, 29, 26, 127, 250, 158, 238, 4, 29, 26, 111, 250, 158, + 238, 4, 29, 26, 166, 250, 158, 238, 4, 29, 26, 177, 250, 158, 238, 4, 29, + 26, 176, 250, 158, 238, 4, 29, 26, 187, 250, 158, 238, 4, 29, 26, 203, + 250, 158, 238, 4, 29, 26, 195, 250, 158, 238, 4, 29, 26, 202, 250, 158, + 238, 4, 29, 61, 230, 112, 250, 158, 29, 27, 26, 127, 250, 158, 29, 27, + 26, 111, 250, 158, 29, 27, 26, 166, 250, 158, 29, 27, 26, 177, 250, 158, + 29, 27, 26, 176, 250, 158, 29, 27, 26, 187, 250, 158, 29, 27, 26, 203, + 250, 158, 29, 27, 26, 195, 250, 158, 29, 27, 26, 202, 250, 158, 29, 27, + 61, 230, 112, 250, 158, 238, 4, 29, 27, 26, 127, 250, 158, 238, 4, 29, + 27, 26, 111, 250, 158, 238, 4, 29, 27, 26, 166, 250, 158, 238, 4, 29, 27, + 26, 177, 250, 158, 238, 4, 29, 27, 26, 176, 250, 158, 238, 4, 29, 27, 26, + 187, 250, 158, 238, 4, 29, 27, 26, 203, 250, 158, 238, 4, 29, 27, 26, + 195, 250, 158, 238, 4, 29, 27, 26, 202, 250, 158, 238, 4, 29, 27, 61, + 230, 112, 96, 228, 90, 77, 56, 96, 231, 199, 249, 29, 56, 96, 77, 56, 96, + 237, 122, 249, 29, 56, 249, 80, 235, 202, 77, 56, 96, 234, 76, 77, 56, + 229, 181, 77, 56, 96, 229, 181, 77, 56, 251, 53, 229, 181, 77, 56, 96, + 251, 53, 229, 181, 77, 56, 86, 77, 56, 230, 29, 229, 206, 77, 254, 174, + 230, 29, 252, 248, 77, 254, 174, 86, 77, 254, 174, 96, 86, 251, 129, 249, + 86, 19, 77, 56, 96, 86, 251, 129, 226, 226, 19, 77, 56, 231, 167, 86, 77, + 56, 96, 251, 204, 86, 77, 56, 234, 118, 64, 77, 56, 239, 246, 64, 77, 56, + 253, 162, 232, 140, 64, 77, 56, 247, 236, 232, 140, 64, 77, 56, 96, 168, + 234, 117, 64, 77, 56, 96, 189, 234, 117, 64, 77, 56, 237, 117, 168, 234, + 117, 64, 77, 56, 237, 117, 189, 234, 117, 64, 77, 56, 29, 96, 64, 77, 56, + 228, 94, 77, 56, 253, 14, 231, 199, 249, 29, 56, 253, 14, 77, 56, 253, + 14, 237, 122, 249, 29, 56, 96, 253, 14, 231, 199, 249, 29, 56, 96, 253, + 14, 77, 56, 96, 253, 14, 237, 122, 249, 29, 56, 230, 129, 77, 56, 96, + 230, 128, 77, 56, 228, 110, 77, 56, 96, 228, 110, 77, 56, 236, 192, 77, + 56, 204, 250, 164, 255, 0, 64, 229, 183, 251, 190, 3, 64, 229, 182, 236, + 47, 236, 195, 231, 52, 236, 195, 231, 26, 40, 234, 10, 253, 157, 250, + 233, 38, 234, 10, 253, 157, 250, 233, 64, 250, 193, 2, 252, 106, 250, + 100, 19, 2, 250, 100, 248, 247, 147, 236, 190, 228, 248, 168, 38, 251, + 174, 2, 250, 100, 189, 40, 251, 174, 2, 250, 100, 40, 236, 163, 241, 46, + 38, 236, 163, 241, 46, 247, 231, 236, 163, 241, 46, 240, 16, 88, 230, + 174, 240, 16, 92, 230, 174, 40, 19, 38, 45, 229, 94, 40, 19, 38, 230, + 174, 40, 238, 135, 183, 38, 230, 174, 183, 40, 230, 174, 88, 230, 175, 2, + 218, 48, 239, 138, 250, 137, 252, 189, 163, 234, 38, 64, 251, 203, 250, + 192, 64, 251, 203, 250, 193, 2, 139, 230, 13, 64, 251, 203, 250, 193, 2, + 77, 230, 13, 64, 31, 2, 139, 230, 13, 64, 31, 2, 77, 230, 13, 10, 40, 64, + 31, 104, 10, 38, 64, 31, 104, 10, 40, 185, 104, 10, 38, 185, 104, 10, 40, + 45, 185, 104, 10, 38, 45, 185, 104, 226, 226, 235, 32, 56, 249, 86, 235, + 32, 56, 254, 244, 247, 190, 218, 56, 251, 241, 247, 190, 218, 56, 38, 65, + 2, 29, 235, 213, 183, 139, 56, 183, 77, 56, 183, 40, 38, 56, 183, 139, + 45, 56, 183, 77, 45, 56, 183, 40, 38, 45, 56, 183, 139, 65, 247, 237, + 125, 183, 77, 65, 247, 237, 125, 183, 139, 45, 65, 247, 237, 125, 183, + 77, 45, 65, 247, 237, 125, 183, 77, 231, 166, 56, 35, 36, 253, 9, 35, 36, + 250, 97, 35, 36, 249, 225, 35, 36, 250, 96, 35, 36, 249, 161, 35, 36, + 250, 32, 35, 36, 249, 224, 35, 36, 250, 95, 35, 36, 249, 129, 35, 36, + 250, 0, 35, 36, 249, 192, 35, 36, 250, 63, 35, 36, 249, 160, 35, 36, 250, + 31, 35, 36, 249, 223, 35, 36, 250, 94, 35, 36, 249, 113, 35, 36, 249, + 240, 35, 36, 249, 176, 35, 36, 250, 47, 35, 36, 249, 144, 35, 36, 250, + 15, 35, 36, 249, 207, 35, 36, 250, 78, 35, 36, 249, 128, 35, 36, 249, + 255, 35, 36, 249, 191, 35, 36, 250, 62, 35, 36, 249, 159, 35, 36, 250, + 30, 35, 36, 249, 222, 35, 36, 250, 93, 35, 36, 249, 105, 35, 36, 249, + 232, 35, 36, 249, 168, 35, 36, 250, 39, 35, 36, 249, 136, 35, 36, 250, 7, + 35, 36, 249, 199, 35, 36, 250, 70, 35, 36, 249, 120, 35, 36, 249, 247, + 35, 36, 249, 183, 35, 36, 250, 54, 35, 36, 249, 151, 35, 36, 250, 22, 35, + 36, 249, 214, 35, 36, 250, 85, 35, 36, 249, 112, 35, 36, 249, 239, 35, + 36, 249, 175, 35, 36, 250, 46, 35, 36, 249, 143, 35, 36, 250, 14, 35, 36, + 249, 206, 35, 36, 250, 77, 35, 36, 249, 127, 35, 36, 249, 254, 35, 36, + 249, 190, 35, 36, 250, 61, 35, 36, 249, 158, 35, 36, 250, 29, 35, 36, + 249, 221, 35, 36, 250, 92, 35, 36, 249, 101, 35, 36, 249, 228, 35, 36, + 249, 164, 35, 36, 250, 35, 35, 36, 249, 132, 35, 36, 250, 3, 35, 36, 249, + 195, 35, 36, 250, 66, 35, 36, 249, 116, 35, 36, 249, 243, 35, 36, 249, + 179, 35, 36, 250, 50, 35, 36, 249, 147, 35, 36, 250, 18, 35, 36, 249, + 210, 35, 36, 250, 81, 35, 36, 249, 108, 35, 36, 249, 235, 35, 36, 249, + 171, 35, 36, 250, 42, 35, 36, 249, 139, 35, 36, 250, 10, 35, 36, 249, + 202, 35, 36, 250, 73, 35, 36, 249, 123, 35, 36, 249, 250, 35, 36, 249, + 186, 35, 36, 250, 57, 35, 36, 249, 154, 35, 36, 250, 25, 35, 36, 249, + 217, 35, 36, 250, 88, 35, 36, 249, 104, 35, 36, 249, 231, 35, 36, 249, + 167, 35, 36, 250, 38, 35, 36, 249, 135, 35, 36, 250, 6, 35, 36, 249, 198, + 35, 36, 250, 69, 35, 36, 249, 119, 35, 36, 249, 246, 35, 36, 249, 182, + 35, 36, 250, 53, 35, 36, 249, 150, 35, 36, 250, 21, 35, 36, 249, 213, 35, + 36, 250, 84, 35, 36, 249, 111, 35, 36, 249, 238, 35, 36, 249, 174, 35, + 36, 250, 45, 35, 36, 249, 142, 35, 36, 250, 13, 35, 36, 249, 205, 35, 36, + 250, 76, 35, 36, 249, 126, 35, 36, 249, 253, 35, 36, 249, 189, 35, 36, + 250, 60, 35, 36, 249, 157, 35, 36, 250, 28, 35, 36, 249, 220, 35, 36, + 250, 91, 35, 36, 249, 99, 35, 36, 249, 226, 35, 36, 249, 162, 35, 36, + 250, 33, 35, 36, 249, 130, 35, 36, 250, 1, 35, 36, 249, 193, 35, 36, 250, + 64, 35, 36, 249, 114, 35, 36, 249, 241, 35, 36, 249, 177, 35, 36, 250, + 48, 35, 36, 249, 145, 35, 36, 250, 16, 35, 36, 249, 208, 35, 36, 250, 79, + 35, 36, 249, 106, 35, 36, 249, 233, 35, 36, 249, 169, 35, 36, 250, 40, + 35, 36, 249, 137, 35, 36, 250, 8, 35, 36, 249, 200, 35, 36, 250, 71, 35, + 36, 249, 121, 35, 36, 249, 248, 35, 36, 249, 184, 35, 36, 250, 55, 35, + 36, 249, 152, 35, 36, 250, 23, 35, 36, 249, 215, 35, 36, 250, 86, 35, 36, + 249, 102, 35, 36, 249, 229, 35, 36, 249, 165, 35, 36, 250, 36, 35, 36, + 249, 133, 35, 36, 250, 4, 35, 36, 249, 196, 35, 36, 250, 67, 35, 36, 249, + 117, 35, 36, 249, 244, 35, 36, 249, 180, 35, 36, 250, 51, 35, 36, 249, + 148, 35, 36, 250, 19, 35, 36, 249, 211, 35, 36, 250, 82, 35, 36, 249, + 109, 35, 36, 249, 236, 35, 36, 249, 172, 35, 36, 250, 43, 35, 36, 249, + 140, 35, 36, 250, 11, 35, 36, 249, 203, 35, 36, 250, 74, 35, 36, 249, + 124, 35, 36, 249, 251, 35, 36, 249, 187, 35, 36, 250, 58, 35, 36, 249, + 155, 35, 36, 250, 26, 35, 36, 249, 218, 35, 36, 250, 89, 35, 36, 249, + 100, 35, 36, 249, 227, 35, 36, 249, 163, 35, 36, 250, 34, 35, 36, 249, + 131, 35, 36, 250, 2, 35, 36, 249, 194, 35, 36, 250, 65, 35, 36, 249, 115, + 35, 36, 249, 242, 35, 36, 249, 178, 35, 36, 250, 49, 35, 36, 249, 146, + 35, 36, 250, 17, 35, 36, 249, 209, 35, 36, 250, 80, 35, 36, 249, 107, 35, + 36, 249, 234, 35, 36, 249, 170, 35, 36, 250, 41, 35, 36, 249, 138, 35, + 36, 250, 9, 35, 36, 249, 201, 35, 36, 250, 72, 35, 36, 249, 122, 35, 36, + 249, 249, 35, 36, 249, 185, 35, 36, 250, 56, 35, 36, 249, 153, 35, 36, + 250, 24, 35, 36, 249, 216, 35, 36, 250, 87, 35, 36, 249, 103, 35, 36, + 249, 230, 35, 36, 249, 166, 35, 36, 250, 37, 35, 36, 249, 134, 35, 36, + 250, 5, 35, 36, 249, 197, 35, 36, 250, 68, 35, 36, 249, 118, 35, 36, 249, + 245, 35, 36, 249, 181, 35, 36, 250, 52, 35, 36, 249, 149, 35, 36, 250, + 20, 35, 36, 249, 212, 35, 36, 250, 83, 35, 36, 249, 110, 35, 36, 249, + 237, 35, 36, 249, 173, 35, 36, 250, 44, 35, 36, 249, 141, 35, 36, 250, + 12, 35, 36, 249, 204, 35, 36, 250, 75, 35, 36, 249, 125, 35, 36, 249, + 252, 35, 36, 249, 188, 35, 36, 250, 59, 35, 36, 249, 156, 35, 36, 250, + 27, 35, 36, 249, 219, 35, 36, 250, 90, 77, 229, 66, 65, 2, 59, 108, 77, + 229, 66, 65, 2, 45, 59, 108, 139, 45, 65, 2, 59, 108, 77, 45, 65, 2, 59, + 108, 40, 38, 45, 65, 2, 59, 108, 77, 229, 66, 65, 247, 237, 125, 139, 45, + 65, 247, 237, 125, 77, 45, 65, 247, 237, 125, 249, 86, 65, 2, 163, 108, + 226, 226, 65, 2, 163, 108, 226, 226, 229, 170, 56, 249, 86, 229, 170, 56, + 139, 45, 251, 55, 56, 77, 45, 251, 55, 56, 139, 229, 170, 251, 55, 56, + 77, 229, 170, 251, 55, 56, 77, 229, 66, 229, 170, 251, 55, 56, 77, 65, 2, + 249, 98, 231, 102, 226, 226, 65, 153, 125, 249, 86, 65, 153, 125, 77, 65, + 2, 230, 168, 2, 59, 108, 77, 65, 2, 230, 168, 2, 45, 59, 108, 77, 229, + 66, 65, 2, 230, 167, 77, 229, 66, 65, 2, 230, 168, 2, 59, 108, 77, 229, + 66, 65, 2, 230, 168, 2, 45, 59, 108, 139, 254, 176, 77, 254, 176, 139, + 45, 254, 176, 77, 45, 254, 176, 139, 65, 153, 86, 250, 192, 77, 65, 153, + 86, 250, 192, 139, 65, 247, 237, 253, 144, 153, 86, 250, 192, 77, 65, + 247, 237, 253, 144, 153, 86, 250, 192, 237, 122, 228, 104, 19, 231, 199, + 249, 29, 56, 237, 122, 249, 29, 19, 231, 199, 228, 104, 56, 237, 122, + 228, 104, 65, 2, 90, 237, 122, 249, 29, 65, 2, 90, 231, 199, 249, 29, 65, + 2, 90, 231, 199, 228, 104, 65, 2, 90, 237, 122, 228, 104, 65, 19, 237, + 122, 249, 29, 56, 237, 122, 249, 29, 65, 19, 231, 199, 249, 29, 56, 231, + 199, 249, 29, 65, 19, 231, 199, 228, 104, 56, 231, 199, 228, 104, 65, 19, + 237, 122, 228, 104, 56, 234, 103, 250, 199, 251, 147, 248, 123, 250, 198, + 248, 123, 250, 199, 251, 147, 234, 103, 250, 198, 231, 199, 249, 29, 65, + 251, 147, 237, 122, 249, 29, 56, 237, 122, 249, 29, 65, 251, 147, 231, + 199, 249, 29, 56, 248, 123, 250, 199, 251, 147, 237, 122, 249, 29, 56, + 234, 103, 250, 199, 251, 147, 231, 199, 249, 29, 56, 237, 122, 249, 29, + 65, 251, 147, 237, 122, 228, 104, 56, 237, 122, 228, 104, 65, 251, 147, + 237, 122, 249, 29, 56, 228, 119, 65, 235, 198, 250, 149, 225, 65, 235, + 198, 77, 230, 69, 251, 128, 228, 248, 65, 235, 198, 77, 230, 69, 251, + 128, 249, 85, 65, 235, 198, 249, 86, 230, 69, 251, 128, 239, 242, 65, + 235, 198, 249, 86, 230, 69, 251, 128, 234, 113, 234, 116, 254, 203, 251, + 241, 56, 239, 245, 254, 203, 254, 244, 56, 229, 208, 254, 203, 254, 244, + 56, 252, 250, 254, 203, 254, 244, 56, 229, 208, 254, 203, 251, 241, 65, + 2, 238, 191, 229, 208, 254, 203, 254, 244, 65, 2, 235, 213, 168, 38, 232, + 178, 251, 241, 56, 168, 40, 232, 178, 254, 244, 56, 254, 244, 251, 239, + 218, 56, 251, 241, 251, 239, 218, 56, 77, 65, 60, 232, 93, 139, 56, 139, + 65, 60, 232, 93, 77, 56, 232, 93, 77, 65, 60, 139, 56, 77, 65, 2, 235, + 214, 46, 139, 65, 2, 235, 214, 46, 77, 65, 230, 26, 206, 40, 38, 65, 230, + 26, 3, 252, 5, 226, 226, 229, 66, 65, 247, 237, 3, 252, 5, 40, 154, 88, + 38, 154, 92, 246, 222, 40, 154, 92, 38, 154, 88, 246, 222, 88, 154, 38, + 92, 154, 40, 246, 222, 88, 154, 40, 92, 154, 38, 246, 222, 40, 154, 88, + 38, 154, 88, 246, 222, 88, 154, 38, 92, 154, 38, 246, 222, 40, 154, 92, + 38, 154, 92, 246, 222, 88, 154, 40, 92, 154, 40, 246, 222, 139, 186, 2, + 154, 88, 153, 125, 77, 186, 2, 154, 88, 153, 125, 226, 226, 186, 2, 154, + 38, 153, 125, 249, 86, 186, 2, 154, 38, 153, 125, 139, 186, 2, 154, 92, + 153, 125, 77, 186, 2, 154, 92, 153, 125, 226, 226, 186, 2, 154, 40, 153, + 125, 249, 86, 186, 2, 154, 40, 153, 125, 139, 186, 2, 154, 88, 247, 237, + 125, 77, 186, 2, 154, 88, 247, 237, 125, 226, 226, 186, 2, 154, 38, 247, + 237, 125, 249, 86, 186, 2, 154, 38, 247, 237, 125, 139, 186, 2, 154, 92, + 247, 237, 125, 77, 186, 2, 154, 92, 247, 237, 125, 226, 226, 186, 2, 154, + 40, 247, 237, 125, 249, 86, 186, 2, 154, 40, 247, 237, 125, 139, 186, 2, + 154, 88, 60, 139, 186, 2, 154, 249, 88, 226, 226, 186, 2, 154, 40, 253, + 57, 226, 226, 186, 2, 154, 225, 77, 186, 2, 154, 88, 60, 77, 186, 2, 154, + 249, 88, 249, 86, 186, 2, 154, 40, 253, 57, 249, 86, 186, 2, 154, 225, + 139, 186, 2, 154, 88, 60, 77, 186, 2, 154, 229, 0, 139, 186, 2, 154, 92, + 60, 77, 186, 2, 154, 249, 88, 77, 186, 2, 154, 88, 60, 139, 186, 2, 154, + 229, 0, 77, 186, 2, 154, 92, 60, 139, 186, 2, 154, 249, 88, 139, 186, 2, + 154, 88, 60, 183, 251, 54, 139, 186, 2, 154, 92, 253, 68, 183, 251, 54, + 77, 186, 2, 154, 88, 60, 183, 251, 54, 77, 186, 2, 154, 92, 253, 68, 183, + 251, 54, 226, 226, 186, 2, 154, 40, 253, 57, 249, 86, 186, 2, 154, 225, + 249, 86, 186, 2, 154, 40, 253, 57, 226, 226, 186, 2, 154, 225, 38, 45, + 65, 2, 234, 75, 246, 207, 248, 202, 21, 60, 77, 56, 230, 1, 236, 189, 60, + 77, 56, 139, 65, 60, 230, 1, 236, 188, 77, 65, 60, 230, 1, 236, 188, 77, + 65, 60, 255, 24, 95, 87, 239, 228, 60, 139, 56, 139, 65, 230, 26, 239, + 227, 247, 43, 60, 77, 56, 231, 53, 60, 77, 56, 139, 65, 230, 26, 231, 52, + 231, 27, 60, 139, 56, 40, 248, 55, 230, 167, 38, 248, 55, 230, 167, 88, + 248, 55, 230, 167, 92, 248, 55, 230, 167, 229, 170, 59, 253, 144, 250, + 233, 227, 104, 126, 231, 177, 227, 104, 126, 229, 59, 251, 219, 40, 64, + 251, 134, 104, 38, 64, 251, 134, 104, 40, 64, 236, 106, 38, 64, 236, 106, + 227, 104, 126, 40, 241, 202, 104, 227, 104, 126, 38, 241, 202, 104, 227, + 104, 126, 40, 253, 30, 104, 227, 104, 126, 38, 253, 30, 104, 40, 31, 252, + 239, 2, 229, 17, 38, 31, 252, 239, 2, 229, 17, 40, 31, 252, 239, 2, 230, + 14, 241, 193, 229, 208, 251, 173, 38, 31, 252, 239, 2, 230, 14, 241, 193, + 252, 250, 251, 173, 40, 31, 252, 239, 2, 230, 14, 241, 193, 252, 250, + 251, 173, 38, 31, 252, 239, 2, 230, 14, 241, 193, 229, 208, 251, 173, 40, + 185, 252, 239, 2, 250, 100, 38, 185, 252, 239, 2, 250, 100, 40, 254, 203, + 239, 228, 104, 38, 254, 203, 247, 43, 104, 45, 40, 254, 203, 247, 43, + 104, 45, 38, 254, 203, 239, 228, 104, 40, 86, 229, 202, 232, 117, 104, + 38, 86, 229, 202, 232, 117, 104, 249, 98, 248, 91, 59, 227, 37, 239, 193, + 239, 37, 185, 236, 190, 239, 248, 38, 185, 228, 224, 2, 231, 171, 239, + 37, 38, 185, 2, 250, 100, 185, 2, 234, 11, 241, 163, 255, 83, 255, 0, + 231, 186, 185, 236, 190, 239, 248, 231, 186, 185, 236, 190, 229, 0, 205, + 255, 0, 224, 255, 0, 185, 2, 229, 17, 224, 185, 2, 229, 17, 236, 242, + 185, 236, 190, 229, 0, 236, 242, 185, 236, 190, 249, 88, 239, 37, 185, 2, + 236, 195, 254, 186, 248, 226, 241, 193, 65, 235, 198, 88, 19, 225, 239, + 37, 185, 2, 236, 195, 254, 186, 248, 226, 241, 193, 65, 235, 198, 88, 19, + 239, 248, 239, 37, 185, 2, 236, 195, 254, 186, 248, 226, 241, 193, 65, + 235, 198, 92, 19, 225, 239, 37, 185, 2, 236, 195, 254, 186, 248, 226, + 241, 193, 65, 235, 198, 92, 19, 239, 248, 239, 37, 185, 2, 236, 195, 254, + 186, 248, 226, 241, 193, 65, 235, 198, 38, 19, 229, 0, 239, 37, 185, 2, + 236, 195, 254, 186, 248, 226, 241, 193, 65, 235, 198, 40, 19, 229, 0, + 239, 37, 185, 2, 236, 195, 254, 186, 248, 226, 241, 193, 65, 235, 198, + 38, 19, 249, 88, 239, 37, 185, 2, 236, 195, 254, 186, 248, 226, 241, 193, + 65, 235, 198, 40, 19, 249, 88, 224, 248, 236, 232, 159, 248, 236, 232, + 160, 2, 236, 158, 248, 236, 232, 160, 2, 3, 218, 48, 248, 236, 232, 160, + 2, 38, 65, 48, 248, 236, 232, 160, 2, 40, 65, 48, 218, 2, 163, 125, 29, + 59, 125, 29, 236, 110, 29, 234, 158, 231, 208, 29, 236, 47, 218, 250, + 137, 252, 189, 163, 253, 144, 19, 229, 208, 137, 250, 137, 252, 189, 59, + 125, 218, 2, 231, 29, 206, 29, 254, 243, 250, 133, 52, 88, 65, 230, 26, + 252, 5, 29, 64, 252, 210, 29, 252, 210, 29, 239, 227, 29, 247, 42, 218, + 2, 3, 218, 153, 230, 77, 225, 218, 2, 171, 163, 231, 67, 153, 230, 77, + 225, 231, 170, 234, 103, 250, 199, 231, 239, 231, 170, 248, 123, 250, + 199, 231, 239, 231, 170, 254, 159, 231, 170, 3, 252, 5, 231, 170, 231, + 171, 171, 241, 45, 231, 168, 229, 183, 2, 53, 48, 229, 183, 2, 229, 17, + 234, 11, 241, 193, 229, 182, 229, 183, 2, 232, 164, 254, 154, 252, 249, + 38, 229, 183, 60, 40, 229, 182, 40, 229, 183, 253, 57, 59, 125, 59, 253, + 144, 253, 57, 38, 229, 182, 252, 244, 2, 40, 137, 253, 15, 252, 244, 2, + 38, 137, 253, 15, 86, 252, 243, 229, 254, 2, 40, 137, 253, 15, 229, 254, + 2, 38, 137, 253, 15, 64, 246, 44, 86, 246, 44, 40, 228, 88, 248, 91, 38, + 228, 88, 248, 91, 40, 45, 228, 88, 248, 91, 38, 45, 228, 88, 248, 91, + 241, 189, 241, 179, 230, 12, 236, 159, 241, 179, 241, 180, 238, 6, 2, 59, + 125, 249, 92, 238, 135, 31, 2, 251, 184, 236, 162, 241, 187, 254, 167, + 232, 73, 235, 151, 248, 202, 21, 19, 231, 241, 236, 110, 248, 202, 21, + 19, 231, 241, 236, 111, 2, 230, 1, 48, 245, 219, 153, 19, 231, 241, 236, + 110, 247, 79, 231, 111, 230, 66, 249, 87, 229, 183, 2, 40, 137, 253, 15, + 249, 87, 229, 183, 2, 38, 137, 253, 15, 86, 250, 193, 2, 92, 56, 86, 239, + 137, 64, 218, 2, 92, 56, 86, 218, 2, 92, 56, 248, 191, 64, 231, 171, 248, + 191, 86, 231, 171, 248, 191, 64, 250, 192, 248, 191, 86, 250, 192, 248, + 191, 64, 252, 5, 248, 191, 86, 252, 5, 234, 37, 234, 158, 231, 209, 236, + 188, 231, 209, 2, 236, 158, 234, 158, 231, 209, 2, 163, 108, 253, 35, + 231, 208, 253, 35, 234, 158, 231, 208, 45, 235, 213, 229, 170, 235, 213, + 239, 247, 251, 129, 185, 104, 234, 119, 251, 129, 185, 104, 229, 250, + 238, 189, 238, 93, 29, 53, 236, 188, 238, 93, 29, 235, 214, 236, 188, + 238, 93, 29, 229, 254, 236, 188, 238, 93, 229, 12, 236, 189, 2, 250, 100, + 238, 93, 229, 12, 236, 189, 2, 235, 213, 238, 93, 31, 241, 148, 236, 188, + 238, 93, 31, 229, 12, 236, 188, 171, 239, 162, 19, 236, 188, 171, 239, + 162, 128, 236, 188, 238, 93, 229, 254, 236, 188, 238, 170, 171, 231, 39, + 231, 38, 2, 241, 159, 235, 32, 241, 160, 236, 188, 248, 59, 236, 103, + 241, 159, 241, 160, 2, 45, 108, 241, 160, 254, 132, 2, 231, 239, 252, 3, + 247, 228, 254, 244, 241, 157, 239, 194, 241, 158, 2, 234, 194, 236, 91, + 254, 183, 235, 195, 239, 194, 241, 158, 2, 232, 178, 236, 91, 254, 183, + 235, 195, 239, 194, 241, 158, 161, 241, 190, 230, 77, 235, 195, 241, 160, + 254, 183, 134, 235, 202, 236, 188, 235, 27, 241, 160, 236, 188, 241, 160, + 2, 139, 65, 2, 90, 241, 160, 2, 229, 254, 52, 241, 160, 2, 241, 147, 241, + 160, 2, 229, 11, 241, 160, 2, 236, 158, 241, 160, 2, 229, 17, 241, 46, + 240, 16, 40, 229, 183, 236, 188, 227, 104, 126, 233, 215, 251, 205, 227, + 104, 126, 233, 215, 235, 229, 227, 104, 126, 233, 215, 235, 148, 235, + 214, 21, 2, 3, 218, 48, 235, 214, 21, 2, 190, 255, 91, 48, 235, 214, 21, + 2, 230, 1, 48, 235, 214, 21, 2, 53, 46, 235, 214, 21, 2, 230, 1, 46, 235, + 214, 21, 2, 231, 54, 111, 235, 214, 21, 2, 86, 229, 182, 238, 192, 21, 2, + 251, 215, 48, 238, 192, 21, 2, 53, 46, 238, 192, 21, 2, 248, 123, 250, + 98, 238, 192, 21, 2, 234, 103, 250, 98, 235, 214, 21, 241, 193, 40, 137, + 252, 5, 235, 214, 21, 241, 193, 38, 137, 252, 5, 228, 211, 128, 251, 153, + 235, 151, 238, 133, 21, 2, 53, 48, 238, 133, 21, 2, 229, 17, 232, 175, + 235, 152, 2, 252, 250, 251, 238, 231, 229, 235, 151, 238, 133, 21, 241, + 193, 40, 137, 252, 5, 238, 133, 21, 241, 193, 38, 137, 252, 5, 29, 238, + 133, 21, 2, 190, 255, 90, 238, 133, 21, 241, 193, 45, 252, 5, 29, 250, + 133, 52, 235, 214, 21, 241, 193, 229, 182, 238, 192, 21, 241, 193, 229, + 182, 238, 133, 21, 241, 193, 229, 182, 241, 154, 235, 151, 234, 114, 241, + 154, 235, 151, 227, 104, 126, 234, 182, 251, 205, 255, 14, 128, 251, 178, + 241, 148, 2, 250, 100, 229, 12, 2, 238, 192, 52, 229, 12, 2, 236, 158, + 241, 148, 2, 236, 158, 241, 148, 2, 239, 162, 255, 4, 229, 12, 2, 239, + 162, 236, 183, 229, 12, 60, 241, 147, 241, 148, 60, 229, 11, 229, 12, 60, + 253, 144, 60, 241, 147, 241, 148, 60, 253, 144, 60, 229, 11, 229, 12, + 253, 57, 19, 241, 45, 2, 229, 11, 241, 148, 253, 57, 19, 241, 45, 2, 241, + 147, 251, 239, 229, 12, 2, 232, 163, 251, 239, 241, 148, 2, 232, 163, 45, + 31, 241, 147, 45, 31, 229, 11, 251, 239, 229, 12, 2, 232, 164, 19, 231, + 229, 235, 151, 239, 162, 19, 2, 53, 48, 239, 162, 128, 2, 53, 48, 45, + 239, 162, 255, 4, 45, 239, 162, 236, 183, 171, 241, 149, 239, 162, 255, + 4, 171, 241, 149, 239, 162, 236, 183, 231, 235, 240, 16, 236, 183, 231, + 235, 240, 16, 255, 4, 239, 162, 128, 236, 156, 239, 162, 255, 4, 239, + 162, 19, 2, 238, 223, 231, 102, 239, 162, 128, 2, 238, 223, 231, 102, + 239, 162, 19, 2, 163, 251, 54, 239, 162, 128, 2, 163, 251, 54, 239, 162, + 19, 2, 45, 236, 158, 239, 162, 19, 2, 229, 17, 239, 162, 19, 2, 45, 229, + 17, 3, 228, 209, 2, 229, 17, 239, 162, 128, 2, 45, 236, 158, 239, 162, + 128, 2, 45, 229, 17, 227, 104, 126, 250, 106, 254, 239, 227, 104, 126, + 234, 216, 254, 239, 248, 202, 21, 2, 53, 46, 245, 219, 2, 53, 48, 229, + 170, 163, 253, 144, 2, 45, 59, 108, 229, 170, 163, 253, 144, 2, 229, 170, + 59, 108, 230, 1, 236, 189, 2, 53, 48, 230, 1, 236, 189, 2, 234, 103, 250, + 98, 232, 35, 238, 192, 232, 34, 251, 200, 2, 53, 48, 248, 202, 2, 254, + 159, 255, 24, 95, 153, 2, 190, 255, 90, 254, 215, 95, 128, 95, 87, 248, + 202, 21, 60, 235, 214, 52, 235, 214, 21, 60, 248, 202, 52, 248, 202, 21, + 60, 230, 1, 236, 188, 45, 251, 220, 248, 203, 171, 251, 196, 248, 202, + 232, 40, 204, 251, 196, 248, 202, 232, 40, 248, 202, 21, 2, 171, 181, 60, + 19, 171, 181, 46, 248, 198, 2, 248, 0, 181, 48, 239, 228, 2, 218, 241, + 163, 247, 43, 2, 218, 241, 163, 239, 228, 2, 235, 23, 158, 48, 247, 43, + 2, 235, 23, 158, 48, 239, 228, 128, 231, 241, 95, 87, 247, 43, 128, 231, + 241, 95, 87, 239, 228, 128, 231, 241, 95, 153, 2, 53, 241, 163, 247, 43, + 128, 231, 241, 95, 153, 2, 53, 241, 163, 239, 228, 128, 231, 241, 95, + 153, 2, 53, 48, 247, 43, 128, 231, 241, 95, 153, 2, 53, 48, 239, 228, + 128, 231, 241, 95, 153, 2, 53, 60, 225, 247, 43, 128, 231, 241, 95, 153, + 2, 53, 60, 239, 248, 239, 228, 128, 254, 216, 247, 43, 128, 254, 216, + 239, 228, 19, 232, 27, 161, 95, 87, 247, 43, 19, 232, 27, 161, 95, 87, + 239, 228, 19, 161, 254, 216, 247, 43, 19, 161, 254, 216, 239, 228, 60, + 249, 91, 95, 60, 247, 42, 247, 43, 60, 249, 91, 95, 60, 239, 227, 239, + 228, 60, 232, 35, 128, 248, 203, 247, 43, 60, 232, 35, 128, 248, 203, + 239, 228, 60, 232, 35, 60, 247, 42, 247, 43, 60, 232, 35, 60, 239, 227, + 239, 228, 60, 247, 43, 60, 249, 91, 248, 203, 247, 43, 60, 239, 228, 60, + 249, 91, 248, 203, 239, 228, 60, 231, 241, 95, 60, 247, 43, 60, 231, 241, + 248, 203, 247, 43, 60, 231, 241, 95, 60, 239, 228, 60, 231, 241, 248, + 203, 231, 241, 95, 153, 128, 239, 227, 231, 241, 95, 153, 128, 247, 42, + 231, 241, 95, 153, 128, 239, 228, 2, 53, 241, 163, 231, 241, 95, 153, + 128, 247, 43, 2, 53, 241, 163, 249, 91, 95, 153, 128, 239, 227, 249, 91, + 95, 153, 128, 247, 42, 249, 91, 231, 241, 95, 153, 128, 239, 227, 249, + 91, 231, 241, 95, 153, 128, 247, 42, 232, 35, 128, 239, 227, 232, 35, + 128, 247, 42, 232, 35, 60, 239, 228, 60, 248, 202, 52, 232, 35, 60, 247, + 43, 60, 248, 202, 52, 45, 237, 252, 239, 227, 45, 237, 252, 247, 42, 45, + 237, 252, 239, 228, 2, 229, 17, 247, 43, 236, 156, 239, 227, 247, 43, + 253, 57, 239, 227, 239, 228, 251, 239, 252, 189, 251, 130, 247, 43, 251, + 239, 252, 189, 251, 130, 239, 228, 251, 239, 252, 189, 251, 131, 60, 231, + 241, 248, 203, 247, 43, 251, 239, 252, 189, 251, 131, 60, 231, 241, 248, + 203, 231, 230, 230, 80, 240, 15, 230, 80, 231, 230, 230, 81, 128, 95, 87, + 240, 15, 230, 81, 128, 95, 87, 248, 202, 21, 2, 252, 208, 48, 235, 164, + 60, 232, 27, 248, 202, 52, 231, 45, 60, 232, 27, 248, 202, 52, 235, 164, + 60, 232, 27, 161, 95, 87, 231, 45, 60, 232, 27, 161, 95, 87, 235, 164, + 60, 248, 202, 52, 231, 45, 60, 248, 202, 52, 235, 164, 60, 161, 95, 87, + 231, 45, 60, 161, 95, 87, 235, 164, 60, 255, 24, 95, 87, 231, 45, 60, + 255, 24, 95, 87, 235, 164, 60, 161, 255, 24, 95, 87, 231, 45, 60, 161, + 255, 24, 95, 87, 45, 235, 163, 45, 231, 44, 231, 53, 2, 250, 100, 231, + 27, 2, 250, 100, 231, 53, 2, 235, 214, 21, 46, 231, 27, 2, 235, 214, 21, + 46, 231, 53, 2, 238, 133, 21, 46, 231, 27, 2, 238, 133, 21, 46, 231, 53, + 147, 128, 95, 153, 2, 53, 48, 231, 27, 147, 128, 95, 153, 2, 53, 48, 231, + 53, 147, 60, 248, 202, 52, 231, 27, 147, 60, 248, 202, 52, 231, 53, 147, + 60, 230, 1, 236, 188, 231, 27, 147, 60, 230, 1, 236, 188, 231, 53, 147, + 60, 255, 24, 95, 87, 231, 27, 147, 60, 255, 24, 95, 87, 231, 53, 147, 60, + 161, 95, 87, 231, 27, 147, 60, 161, 95, 87, 31, 40, 236, 195, 66, 236, + 188, 31, 38, 236, 195, 66, 236, 188, 251, 239, 231, 52, 251, 239, 231, + 26, 251, 239, 231, 53, 128, 95, 87, 251, 239, 231, 27, 128, 95, 87, 231, + 53, 60, 231, 26, 231, 27, 60, 231, 52, 231, 53, 60, 231, 52, 231, 27, 60, + 231, 26, 231, 27, 253, 57, 231, 52, 231, 27, 253, 57, 19, 241, 45, 252, + 189, 251, 55, 2, 231, 52, 248, 247, 147, 236, 190, 249, 85, 235, 226, 2, + 230, 126, 229, 207, 229, 192, 241, 147, 248, 8, 237, 130, 232, 93, 40, + 230, 174, 232, 93, 92, 230, 174, 232, 93, 88, 230, 174, 236, 48, 2, 193, + 59, 253, 144, 229, 170, 38, 229, 94, 45, 59, 253, 144, 40, 229, 94, 59, + 253, 144, 45, 40, 229, 94, 45, 59, 253, 144, 45, 40, 229, 94, 183, 251, + 55, 247, 237, 40, 239, 19, 147, 45, 228, 201, 232, 93, 92, 230, 175, 2, + 236, 158, 232, 93, 88, 230, 175, 2, 229, 17, 232, 93, 88, 230, 175, 60, + 232, 93, 92, 230, 174, 45, 92, 230, 174, 45, 88, 230, 174, 45, 231, 79, + 161, 52, 224, 45, 231, 79, 161, 52, 250, 110, 161, 250, 139, 2, 224, 238, + 5, 231, 239, 59, 239, 194, 2, 218, 48, 59, 239, 194, 2, 218, 46, 92, 230, + 175, 2, 218, 46, 236, 111, 2, 163, 108, 236, 111, 2, 230, 1, 236, 188, + 229, 170, 59, 253, 144, 253, 32, 234, 183, 229, 170, 59, 253, 144, 2, + 163, 108, 229, 170, 251, 220, 236, 188, 229, 170, 237, 252, 239, 227, + 229, 170, 237, 252, 247, 42, 249, 91, 231, 241, 239, 228, 128, 95, 87, + 249, 91, 231, 241, 247, 43, 128, 95, 87, 229, 170, 231, 209, 253, 32, + 234, 183, 240, 16, 229, 170, 59, 253, 144, 236, 188, 45, 231, 209, 236, + 188, 64, 59, 125, 238, 93, 64, 59, 125, 237, 122, 249, 29, 64, 56, 237, + 122, 228, 104, 64, 56, 231, 199, 249, 29, 64, 56, 231, 199, 228, 104, 64, + 56, 40, 38, 64, 56, 139, 86, 56, 226, 226, 86, 56, 249, 86, 86, 56, 237, + 122, 249, 29, 86, 56, 237, 122, 228, 104, 86, 56, 231, 199, 249, 29, 86, + 56, 231, 199, 228, 104, 86, 56, 40, 38, 86, 56, 88, 92, 86, 56, 77, 65, + 2, 229, 249, 249, 85, 77, 65, 2, 229, 249, 228, 248, 139, 65, 2, 229, + 249, 249, 85, 139, 65, 2, 229, 249, 228, 248, 31, 2, 229, 208, 137, 253, + 15, 31, 2, 252, 250, 137, 253, 15, 98, 5, 1, 254, 122, 98, 5, 1, 252, + 213, 98, 5, 1, 228, 210, 98, 5, 1, 247, 80, 98, 5, 1, 250, 112, 98, 5, 1, + 227, 193, 98, 5, 1, 227, 62, 98, 5, 1, 249, 44, 98, 5, 1, 227, 84, 98, 5, + 1, 241, 112, 98, 5, 1, 54, 241, 112, 98, 5, 1, 71, 98, 5, 1, 250, 128, + 98, 5, 1, 240, 255, 98, 5, 1, 239, 174, 98, 5, 1, 238, 97, 98, 5, 1, 238, + 69, 98, 5, 1, 236, 203, 98, 5, 1, 235, 196, 98, 5, 1, 234, 102, 98, 5, 1, + 231, 234, 98, 5, 1, 229, 86, 98, 5, 1, 229, 24, 98, 5, 1, 247, 239, 98, + 5, 1, 246, 183, 98, 5, 1, 236, 168, 98, 5, 1, 236, 80, 98, 5, 1, 232, 76, + 98, 5, 1, 229, 135, 98, 5, 1, 252, 39, 98, 5, 1, 232, 147, 98, 5, 1, 227, + 197, 98, 5, 1, 227, 199, 98, 5, 1, 227, 220, 98, 5, 1, 231, 184, 219, 98, + 5, 1, 227, 142, 98, 5, 1, 3, 227, 123, 98, 5, 1, 3, 227, 124, 2, 230, + 167, 98, 5, 1, 227, 167, 98, 5, 1, 241, 136, 3, 227, 123, 98, 5, 1, 253, + 35, 227, 123, 98, 5, 1, 241, 136, 253, 35, 227, 123, 98, 5, 1, 248, 49, + 98, 5, 1, 241, 110, 98, 5, 1, 232, 75, 98, 5, 1, 229, 162, 67, 98, 5, 1, + 240, 9, 238, 97, 98, 3, 1, 254, 122, 98, 3, 1, 252, 213, 98, 3, 1, 228, + 210, 98, 3, 1, 247, 80, 98, 3, 1, 250, 112, 98, 3, 1, 227, 193, 98, 3, 1, + 227, 62, 98, 3, 1, 249, 44, 98, 3, 1, 227, 84, 98, 3, 1, 241, 112, 98, 3, + 1, 54, 241, 112, 98, 3, 1, 71, 98, 3, 1, 250, 128, 98, 3, 1, 240, 255, + 98, 3, 1, 239, 174, 98, 3, 1, 238, 97, 98, 3, 1, 238, 69, 98, 3, 1, 236, + 203, 98, 3, 1, 235, 196, 98, 3, 1, 234, 102, 98, 3, 1, 231, 234, 98, 3, + 1, 229, 86, 98, 3, 1, 229, 24, 98, 3, 1, 247, 239, 98, 3, 1, 246, 183, + 98, 3, 1, 236, 168, 98, 3, 1, 236, 80, 98, 3, 1, 232, 76, 98, 3, 1, 229, + 135, 98, 3, 1, 252, 39, 98, 3, 1, 232, 147, 98, 3, 1, 227, 197, 98, 3, 1, + 227, 199, 98, 3, 1, 227, 220, 98, 3, 1, 231, 184, 219, 98, 3, 1, 227, + 142, 98, 3, 1, 3, 227, 123, 98, 3, 1, 3, 227, 124, 2, 230, 167, 98, 3, 1, + 227, 167, 98, 3, 1, 241, 136, 3, 227, 123, 98, 3, 1, 253, 35, 227, 123, + 98, 3, 1, 241, 136, 253, 35, 227, 123, 98, 3, 1, 248, 49, 98, 3, 1, 241, + 110, 98, 3, 1, 232, 75, 98, 3, 1, 229, 162, 67, 98, 3, 1, 240, 9, 238, + 97, 62, 5, 1, 255, 36, 62, 3, 1, 255, 36, 62, 5, 1, 228, 191, 62, 3, 1, + 228, 191, 62, 5, 1, 247, 195, 62, 3, 1, 247, 195, 62, 5, 1, 251, 80, 62, + 3, 1, 251, 80, 62, 5, 1, 249, 12, 62, 3, 1, 249, 12, 62, 5, 1, 231, 203, + 62, 3, 1, 231, 203, 62, 5, 1, 227, 92, 62, 3, 1, 227, 92, 62, 5, 1, 246, + 218, 62, 3, 1, 246, 218, 62, 5, 1, 230, 59, 62, 3, 1, 230, 59, 62, 5, 1, + 245, 227, 62, 3, 1, 245, 227, 62, 5, 1, 240, 249, 62, 3, 1, 240, 249, 62, + 5, 1, 240, 7, 62, 3, 1, 240, 7, 62, 5, 1, 238, 226, 62, 3, 1, 238, 226, + 62, 5, 1, 237, 209, 62, 3, 1, 237, 209, 62, 5, 1, 240, 96, 62, 3, 1, 240, + 96, 62, 5, 1, 73, 62, 3, 1, 73, 62, 5, 1, 236, 8, 62, 3, 1, 236, 8, 62, + 5, 1, 234, 91, 62, 3, 1, 234, 91, 62, 5, 1, 232, 37, 62, 3, 1, 232, 37, + 62, 5, 1, 230, 146, 62, 3, 1, 230, 146, 62, 5, 1, 229, 37, 62, 3, 1, 229, + 37, 62, 5, 1, 248, 81, 62, 3, 1, 248, 81, 62, 5, 1, 240, 179, 62, 3, 1, + 240, 179, 62, 5, 1, 235, 134, 62, 3, 1, 235, 134, 62, 5, 1, 236, 199, 62, + 3, 1, 236, 199, 62, 5, 1, 250, 197, 255, 38, 62, 3, 1, 250, 197, 255, 38, + 62, 5, 1, 76, 62, 255, 51, 62, 3, 1, 76, 62, 255, 51, 62, 5, 1, 251, 145, + 249, 12, 62, 3, 1, 251, 145, 249, 12, 62, 5, 1, 250, 197, 240, 249, 62, + 3, 1, 250, 197, 240, 249, 62, 5, 1, 250, 197, 237, 209, 62, 3, 1, 250, + 197, 237, 209, 62, 5, 1, 251, 145, 237, 209, 62, 3, 1, 251, 145, 237, + 209, 62, 5, 1, 76, 62, 236, 199, 62, 3, 1, 76, 62, 236, 199, 62, 5, 1, + 233, 239, 62, 3, 1, 233, 239, 62, 5, 1, 251, 150, 232, 119, 62, 3, 1, + 251, 150, 232, 119, 62, 5, 1, 76, 62, 232, 119, 62, 3, 1, 76, 62, 232, + 119, 62, 5, 1, 76, 62, 248, 184, 62, 3, 1, 76, 62, 248, 184, 62, 5, 1, + 255, 43, 240, 182, 62, 3, 1, 255, 43, 240, 182, 62, 5, 1, 250, 197, 246, + 54, 62, 3, 1, 250, 197, 246, 54, 62, 5, 1, 76, 62, 246, 54, 62, 3, 1, 76, + 62, 246, 54, 62, 5, 1, 76, 62, 219, 62, 3, 1, 76, 62, 219, 62, 5, 1, 240, + 43, 219, 62, 3, 1, 240, 43, 219, 62, 5, 1, 76, 62, 246, 195, 62, 3, 1, + 76, 62, 246, 195, 62, 5, 1, 76, 62, 246, 220, 62, 3, 1, 76, 62, 246, 220, + 62, 5, 1, 76, 62, 247, 193, 62, 3, 1, 76, 62, 247, 193, 62, 5, 1, 76, 62, + 250, 130, 62, 3, 1, 76, 62, 250, 130, 62, 5, 1, 76, 62, 232, 104, 62, 3, + 1, 76, 62, 232, 104, 62, 5, 1, 76, 237, 82, 232, 104, 62, 3, 1, 76, 237, + 82, 232, 104, 62, 5, 1, 76, 237, 82, 237, 229, 62, 3, 1, 76, 237, 82, + 237, 229, 62, 5, 1, 76, 237, 82, 237, 48, 62, 3, 1, 76, 237, 82, 237, 48, + 62, 5, 1, 76, 237, 82, 228, 120, 62, 3, 1, 76, 237, 82, 228, 120, 62, 12, + 241, 2, 62, 12, 238, 227, 234, 91, 62, 12, 236, 9, 234, 91, 62, 12, 231, + 108, 62, 12, 230, 147, 234, 91, 62, 12, 240, 180, 234, 91, 62, 12, 232, + 105, 232, 37, 62, 76, 237, 82, 247, 231, 208, 62, 76, 237, 82, 250, 151, + 235, 23, 69, 62, 76, 237, 82, 241, 182, 235, 23, 69, 62, 76, 237, 82, + 228, 203, 250, 136, 62, 247, 248, 236, 210, 246, 236, 62, 247, 231, 208, + 62, 238, 155, 250, 136, 75, 3, 1, 255, 8, 75, 3, 1, 253, 148, 75, 3, 1, + 247, 194, 75, 3, 1, 250, 105, 75, 3, 1, 248, 234, 75, 3, 1, 228, 184, 75, + 3, 1, 227, 83, 75, 3, 1, 230, 157, 75, 3, 1, 241, 192, 75, 3, 1, 240, + 254, 75, 3, 1, 240, 13, 75, 3, 1, 239, 81, 75, 3, 1, 238, 71, 75, 3, 1, + 236, 211, 75, 3, 1, 236, 120, 75, 3, 1, 227, 72, 75, 3, 1, 234, 227, 75, + 3, 1, 233, 237, 75, 3, 1, 230, 151, 75, 3, 1, 229, 21, 75, 3, 1, 236, 30, + 75, 3, 1, 240, 185, 75, 3, 1, 247, 109, 75, 3, 1, 235, 77, 75, 3, 1, 232, + 102, 75, 3, 1, 252, 57, 75, 3, 1, 252, 165, 75, 3, 1, 241, 80, 75, 3, 1, + 252, 7, 75, 3, 1, 252, 84, 75, 3, 1, 228, 52, 75, 3, 1, 241, 89, 75, 3, + 1, 246, 248, 75, 3, 1, 246, 210, 75, 3, 1, 246, 166, 75, 3, 1, 228, 112, + 75, 3, 1, 246, 227, 75, 3, 1, 246, 65, 174, 1, 216, 174, 1, 227, 255, + 174, 1, 227, 254, 174, 1, 227, 246, 174, 1, 227, 244, 174, 1, 253, 59, + 255, 92, 227, 240, 174, 1, 227, 240, 174, 1, 227, 252, 174, 1, 227, 249, + 174, 1, 227, 251, 174, 1, 227, 250, 174, 1, 227, 190, 174, 1, 227, 247, + 174, 1, 227, 239, 174, 1, 229, 105, 227, 239, 174, 1, 227, 237, 174, 1, + 227, 242, 174, 1, 253, 59, 255, 92, 227, 242, 174, 1, 229, 105, 227, 242, + 174, 1, 227, 241, 174, 1, 228, 3, 174, 1, 227, 238, 174, 1, 229, 105, + 227, 238, 174, 1, 227, 229, 174, 1, 229, 105, 227, 229, 174, 1, 227, 186, + 174, 1, 227, 213, 174, 1, 255, 59, 227, 213, 174, 1, 229, 105, 227, 213, + 174, 1, 227, 236, 174, 1, 227, 235, 174, 1, 227, 233, 174, 1, 229, 105, + 227, 243, 174, 1, 229, 105, 227, 231, 174, 1, 227, 230, 174, 1, 227, 142, + 174, 1, 227, 227, 174, 1, 227, 226, 174, 1, 227, 245, 174, 1, 229, 105, + 227, 245, 174, 1, 254, 124, 227, 245, 174, 1, 227, 225, 174, 1, 227, 223, + 174, 1, 227, 224, 174, 1, 227, 222, 174, 1, 227, 221, 174, 1, 227, 253, + 174, 1, 227, 219, 174, 1, 227, 218, 174, 1, 227, 217, 174, 1, 227, 216, + 174, 1, 227, 214, 174, 1, 230, 140, 227, 214, 174, 1, 227, 212, 174, 49, + 1, 240, 36, 69, 22, 4, 239, 166, 22, 4, 238, 174, 22, 4, 234, 89, 22, 4, + 231, 215, 22, 4, 232, 100, 22, 4, 253, 3, 22, 4, 229, 224, 22, 4, 251, + 225, 22, 4, 237, 136, 22, 4, 237, 38, 22, 4, 247, 77, 236, 249, 22, 4, + 227, 26, 22, 4, 250, 115, 22, 4, 251, 16, 22, 4, 241, 47, 22, 4, 230, 37, + 22, 4, 252, 46, 22, 4, 236, 16, 22, 4, 235, 206, 22, 4, 247, 120, 22, 4, + 247, 116, 22, 4, 247, 117, 22, 4, 247, 118, 22, 4, 231, 163, 22, 4, 231, + 133, 22, 4, 231, 144, 22, 4, 231, 162, 22, 4, 231, 147, 22, 4, 231, 148, + 22, 4, 231, 137, 22, 4, 252, 134, 22, 4, 252, 121, 22, 4, 252, 123, 22, + 4, 252, 133, 22, 4, 252, 131, 22, 4, 252, 132, 22, 4, 252, 122, 22, 4, + 227, 1, 22, 4, 226, 237, 22, 4, 226, 248, 22, 4, 227, 0, 22, 4, 226, 251, + 22, 4, 226, 252, 22, 4, 226, 240, 22, 4, 252, 130, 22, 4, 252, 124, 22, + 4, 252, 126, 22, 4, 252, 129, 22, 4, 252, 127, 22, 4, 252, 128, 22, 4, + 252, 125, 22, 4, 234, 251, 22, 4, 234, 241, 22, 4, 234, 247, 22, 4, 234, + 250, 22, 4, 234, 248, 22, 4, 234, 249, 22, 4, 234, 246, 22, 4, 240, 54, + 22, 4, 240, 46, 22, 4, 240, 49, 22, 4, 240, 53, 22, 4, 240, 50, 22, 4, + 240, 51, 22, 4, 240, 47, 22, 4, 228, 20, 22, 4, 228, 10, 22, 4, 228, 16, + 22, 4, 228, 19, 22, 4, 228, 17, 22, 4, 228, 18, 22, 4, 228, 15, 22, 4, + 247, 8, 22, 4, 246, 255, 22, 4, 247, 2, 22, 4, 247, 7, 22, 4, 247, 4, 22, + 4, 247, 5, 22, 4, 247, 1, 38, 185, 231, 49, 239, 61, 38, 185, 249, 98, + 231, 49, 239, 61, 40, 231, 49, 104, 38, 231, 49, 104, 40, 249, 98, 231, + 49, 104, 38, 249, 98, 231, 49, 104, 234, 220, 241, 151, 239, 61, 234, + 220, 249, 98, 241, 151, 239, 61, 249, 98, 229, 193, 239, 61, 40, 229, + 193, 104, 38, 229, 193, 104, 234, 220, 231, 171, 40, 234, 220, 236, 213, + 104, 38, 234, 220, 236, 213, 104, 249, 23, 251, 171, 236, 116, 248, 9, + 236, 116, 224, 248, 9, 236, 116, 245, 245, 249, 98, 236, 245, 249, 86, + 255, 5, 226, 226, 255, 5, 249, 98, 234, 119, 255, 0, 45, 236, 242, 245, + 248, 40, 170, 236, 108, 104, 38, 170, 236, 108, 104, 7, 25, 234, 175, 7, + 25, 251, 245, 7, 25, 233, 199, 127, 7, 25, 233, 199, 111, 7, 25, 233, + 199, 166, 7, 25, 236, 46, 7, 25, 252, 242, 7, 25, 230, 177, 7, 25, 240, + 131, 127, 7, 25, 240, 131, 111, 7, 25, 250, 134, 7, 25, 233, 201, 7, 25, + 3, 127, 7, 25, 3, 111, 7, 25, 240, 22, 127, 7, 25, 240, 22, 111, 7, 25, + 240, 22, 166, 7, 25, 240, 22, 177, 7, 25, 231, 223, 7, 25, 230, 30, 7, + 25, 231, 221, 127, 7, 25, 231, 221, 111, 7, 25, 246, 204, 127, 7, 25, + 246, 204, 111, 7, 25, 246, 232, 7, 25, 234, 215, 7, 25, 252, 44, 7, 25, + 231, 35, 7, 25, 238, 159, 7, 25, 251, 0, 7, 25, 238, 152, 7, 25, 251, + 255, 7, 25, 228, 123, 127, 7, 25, 228, 123, 111, 7, 25, 248, 57, 7, 25, + 236, 87, 127, 7, 25, 236, 87, 111, 7, 25, 232, 33, 137, 229, 190, 229, + 153, 7, 25, 251, 162, 7, 25, 250, 109, 7, 25, 241, 105, 7, 25, 252, 255, + 147, 251, 234, 7, 25, 248, 144, 7, 25, 231, 182, 127, 7, 25, 231, 182, + 111, 7, 25, 253, 149, 7, 25, 232, 38, 7, 25, 252, 177, 232, 38, 7, 25, + 237, 251, 127, 7, 25, 237, 251, 111, 7, 25, 237, 251, 166, 7, 25, 237, + 251, 177, 7, 25, 239, 10, 7, 25, 232, 120, 7, 25, 234, 218, 7, 25, 248, + 161, 7, 25, 236, 222, 7, 25, 252, 224, 127, 7, 25, 252, 224, 111, 7, 25, + 239, 36, 7, 25, 238, 154, 7, 25, 247, 48, 127, 7, 25, 247, 48, 111, 7, + 25, 247, 48, 166, 7, 25, 230, 8, 7, 25, 251, 233, 7, 25, 228, 104, 127, + 7, 25, 228, 104, 111, 7, 25, 252, 177, 233, 193, 7, 25, 232, 33, 246, 50, + 7, 25, 246, 50, 7, 25, 252, 177, 231, 187, 7, 25, 252, 177, 232, 116, 7, + 25, 248, 16, 7, 25, 252, 177, 252, 146, 7, 25, 232, 33, 228, 136, 7, 25, + 228, 137, 127, 7, 25, 228, 137, 111, 7, 25, 252, 0, 7, 25, 252, 177, 247, + 67, 7, 25, 183, 127, 7, 25, 183, 111, 7, 25, 252, 177, 239, 158, 7, 25, + 252, 177, 247, 184, 7, 25, 238, 151, 127, 7, 25, 238, 151, 111, 7, 25, + 234, 221, 7, 25, 253, 6, 7, 25, 252, 177, 230, 156, 239, 251, 7, 25, 252, + 177, 239, 252, 7, 25, 252, 177, 228, 86, 7, 25, 252, 177, 248, 24, 7, 25, + 249, 28, 127, 7, 25, 249, 28, 111, 7, 25, 249, 28, 166, 7, 25, 252, 177, + 249, 27, 7, 25, 246, 207, 7, 25, 252, 177, 246, 49, 7, 25, 252, 254, 7, + 25, 247, 102, 7, 25, 252, 177, 248, 54, 7, 25, 252, 177, 253, 27, 7, 25, + 252, 177, 233, 245, 7, 25, 232, 33, 228, 100, 7, 25, 232, 33, 227, 206, + 7, 25, 252, 177, 247, 238, 7, 25, 241, 108, 248, 164, 7, 25, 252, 177, + 248, 164, 7, 25, 241, 108, 229, 209, 7, 25, 252, 177, 229, 209, 7, 25, + 241, 108, 249, 79, 7, 25, 252, 177, 249, 79, 7, 25, 229, 92, 7, 25, 241, + 108, 229, 92, 7, 25, 252, 177, 229, 92, 43, 25, 127, 43, 25, 239, 193, + 43, 25, 250, 100, 43, 25, 231, 239, 43, 25, 233, 198, 43, 25, 90, 43, 25, + 111, 43, 25, 239, 206, 43, 25, 239, 81, 43, 25, 239, 238, 43, 25, 248, + 218, 43, 25, 195, 43, 25, 92, 252, 242, 43, 25, 251, 163, 43, 25, 245, + 225, 43, 25, 230, 177, 43, 25, 236, 195, 252, 242, 43, 25, 240, 130, 43, + 25, 235, 181, 43, 25, 228, 67, 43, 25, 231, 178, 43, 25, 38, 236, 195, + 252, 242, 43, 25, 246, 167, 248, 230, 43, 25, 230, 112, 43, 25, 250, 134, + 43, 25, 233, 201, 43, 25, 251, 245, 43, 25, 235, 153, 43, 25, 255, 64, + 43, 25, 238, 147, 43, 25, 248, 230, 43, 25, 249, 32, 43, 25, 233, 214, + 43, 25, 247, 72, 43, 25, 247, 73, 231, 233, 43, 25, 248, 163, 43, 25, + 253, 34, 43, 25, 228, 79, 43, 25, 252, 58, 43, 25, 234, 83, 43, 25, 241, + 191, 43, 25, 231, 231, 43, 25, 240, 21, 43, 25, 251, 169, 43, 25, 231, + 174, 43, 25, 238, 149, 43, 25, 234, 99, 43, 25, 228, 69, 43, 25, 236, + 208, 43, 25, 229, 97, 43, 25, 249, 71, 43, 25, 232, 93, 230, 30, 43, 25, + 249, 98, 251, 245, 43, 25, 183, 231, 81, 43, 25, 171, 246, 231, 43, 25, + 232, 95, 43, 25, 252, 245, 43, 25, 231, 220, 43, 25, 252, 227, 43, 25, + 231, 101, 43, 25, 246, 203, 43, 25, 246, 237, 43, 25, 250, 103, 43, 25, + 246, 232, 43, 25, 252, 236, 43, 25, 234, 215, 43, 25, 233, 207, 43, 25, + 250, 153, 43, 25, 254, 129, 43, 25, 231, 171, 43, 25, 237, 119, 43, 25, + 231, 35, 43, 25, 233, 224, 43, 25, 238, 159, 43, 25, 229, 189, 43, 25, + 240, 33, 43, 25, 208, 43, 25, 251, 0, 43, 25, 228, 111, 43, 25, 250, 117, + 237, 119, 43, 25, 251, 211, 43, 25, 247, 225, 43, 25, 251, 253, 43, 25, + 231, 104, 43, 25, 228, 122, 43, 25, 248, 57, 43, 25, 251, 252, 43, 25, + 248, 111, 43, 25, 45, 206, 43, 25, 137, 229, 190, 229, 153, 43, 25, 231, + 237, 43, 25, 248, 119, 43, 25, 251, 162, 43, 25, 250, 109, 43, 25, 235, + 150, 43, 25, 241, 105, 43, 25, 239, 22, 43, 25, 230, 0, 43, 25, 231, 7, + 43, 25, 239, 201, 43, 25, 228, 240, 43, 25, 248, 80, 43, 25, 252, 255, + 147, 251, 234, 43, 25, 232, 48, 43, 25, 249, 98, 230, 111, 43, 25, 228, + 95, 43, 25, 231, 246, 43, 25, 250, 147, 43, 25, 248, 144, 43, 25, 231, + 189, 43, 25, 56, 43, 25, 231, 94, 43, 25, 231, 181, 43, 25, 229, 197, 43, + 25, 247, 53, 43, 25, 252, 139, 43, 25, 231, 116, 43, 25, 253, 149, 43, + 25, 234, 143, 43, 25, 232, 38, 43, 25, 241, 101, 43, 25, 237, 250, 43, + 25, 232, 120, 43, 25, 248, 104, 43, 25, 236, 222, 43, 25, 255, 4, 43, 25, + 235, 215, 43, 25, 249, 34, 43, 25, 252, 223, 43, 25, 239, 36, 43, 25, + 238, 193, 43, 25, 232, 182, 43, 25, 254, 177, 43, 25, 238, 154, 43, 25, + 229, 212, 43, 25, 236, 187, 43, 25, 253, 1, 43, 25, 231, 91, 43, 25, 251, + 218, 43, 25, 247, 47, 43, 25, 230, 8, 43, 25, 241, 165, 43, 25, 253, 7, + 43, 25, 228, 137, 248, 230, 43, 25, 251, 233, 43, 25, 228, 103, 43, 25, + 233, 193, 43, 25, 246, 50, 43, 25, 231, 187, 43, 25, 228, 230, 43, 25, + 253, 88, 43, 25, 235, 238, 43, 25, 253, 158, 43, 25, 232, 116, 43, 25, + 234, 190, 43, 25, 234, 36, 43, 25, 248, 16, 43, 25, 253, 0, 43, 25, 252, + 146, 43, 25, 253, 19, 43, 25, 238, 156, 43, 25, 228, 136, 43, 25, 252, 0, + 43, 25, 228, 85, 43, 25, 250, 144, 43, 25, 228, 185, 43, 25, 247, 67, 43, + 25, 239, 158, 43, 25, 247, 184, 43, 25, 238, 150, 43, 25, 231, 238, 43, + 25, 232, 93, 230, 166, 253, 27, 43, 25, 234, 221, 43, 25, 253, 6, 43, 25, + 228, 64, 43, 25, 248, 135, 43, 25, 239, 251, 43, 25, 230, 156, 239, 251, + 43, 25, 239, 249, 43, 25, 231, 201, 43, 25, 239, 252, 43, 25, 228, 86, + 43, 25, 248, 24, 43, 25, 249, 27, 43, 25, 246, 207, 43, 25, 247, 246, 43, + 25, 246, 49, 43, 25, 252, 254, 43, 25, 230, 160, 43, 25, 246, 240, 43, + 25, 248, 73, 43, 25, 234, 3, 228, 85, 43, 25, 252, 141, 43, 25, 247, 102, + 43, 25, 248, 54, 43, 25, 253, 27, 43, 25, 233, 245, 43, 25, 250, 246, 43, + 25, 228, 100, 43, 25, 246, 190, 43, 25, 227, 206, 43, 25, 238, 199, 43, + 25, 253, 15, 43, 25, 248, 238, 43, 25, 247, 238, 43, 25, 229, 168, 43, + 25, 249, 73, 43, 25, 234, 211, 43, 25, 237, 120, 43, 25, 248, 164, 43, + 25, 229, 209, 43, 25, 249, 79, 43, 25, 229, 92, 43, 25, 248, 25, 80, 250, + 217, 99, 40, 153, 225, 80, 250, 217, 99, 60, 153, 46, 80, 250, 217, 99, + 40, 153, 238, 223, 19, 225, 80, 250, 217, 99, 60, 153, 238, 223, 19, 46, + 80, 250, 217, 99, 247, 231, 231, 19, 80, 250, 217, 99, 231, 20, 247, 237, + 48, 80, 250, 217, 99, 231, 20, 247, 237, 46, 80, 250, 217, 99, 231, 20, + 247, 237, 239, 248, 80, 250, 217, 99, 231, 20, 247, 237, 189, 239, 248, + 80, 250, 217, 99, 231, 20, 247, 237, 189, 225, 80, 250, 217, 99, 231, 20, + 247, 237, 168, 239, 248, 80, 250, 217, 99, 236, 157, 80, 231, 193, 80, + 251, 214, 80, 247, 231, 208, 250, 141, 69, 241, 102, 241, 181, 231, 115, + 91, 80, 241, 119, 69, 80, 251, 236, 69, 80, 61, 227, 80, 40, 185, 104, + 38, 185, 104, 40, 45, 185, 104, 38, 45, 185, 104, 40, 251, 174, 104, 38, + 251, 174, 104, 40, 64, 251, 174, 104, 38, 64, 251, 174, 104, 40, 86, 239, + 232, 104, 38, 86, 239, 232, 104, 235, 185, 69, 247, 153, 69, 40, 229, + 202, 232, 117, 104, 38, 229, 202, 232, 117, 104, 40, 64, 239, 232, 104, + 38, 64, 239, 232, 104, 40, 64, 229, 202, 232, 117, 104, 38, 64, 229, 202, + 232, 117, 104, 40, 64, 31, 104, 38, 64, 31, 104, 228, 119, 251, 54, 224, + 45, 235, 157, 235, 13, 69, 45, 235, 157, 235, 13, 69, 170, 45, 235, 157, + 235, 13, 69, 235, 185, 158, 248, 135, 246, 230, 178, 127, 246, 230, 178, + 111, 246, 230, 178, 166, 246, 230, 178, 177, 246, 230, 178, 176, 246, + 230, 178, 187, 246, 230, 178, 203, 246, 230, 178, 195, 246, 230, 178, + 202, 80, 239, 224, 188, 69, 80, 234, 103, 188, 69, 80, 250, 223, 188, 69, + 80, 248, 217, 188, 69, 23, 232, 29, 53, 188, 69, 23, 45, 53, 188, 69, + 228, 117, 251, 54, 59, 240, 253, 234, 176, 69, 59, 240, 253, 234, 176, 2, + 228, 171, 231, 202, 69, 59, 240, 253, 234, 176, 158, 189, 246, 236, 59, + 240, 253, 234, 176, 2, 228, 171, 231, 202, 158, 189, 246, 236, 59, 240, + 253, 234, 176, 158, 168, 246, 236, 29, 235, 185, 69, 80, 145, 239, 194, + 248, 101, 232, 167, 91, 246, 230, 178, 230, 112, 246, 230, 178, 229, 79, + 246, 230, 178, 230, 44, 59, 80, 241, 119, 69, 239, 53, 69, 236, 103, 255, + 18, 69, 80, 34, 241, 183, 80, 137, 248, 66, 231, 193, 105, 1, 3, 67, 105, 1, 67, 105, 1, 3, 71, 105, 1, 71, 105, 1, 3, 79, 105, 1, 79, 105, 1, 3, - 72, 105, 1, 72, 105, 1, 3, 73, 105, 1, 73, 105, 1, 201, 105, 1, 253, 139, - 105, 1, 253, 215, 105, 1, 254, 6, 105, 1, 253, 203, 105, 1, 253, 235, - 105, 1, 253, 172, 105, 1, 254, 5, 105, 1, 253, 190, 105, 1, 253, 234, - 105, 1, 253, 132, 105, 1, 253, 163, 105, 1, 253, 198, 105, 1, 254, 17, - 105, 1, 253, 211, 105, 1, 254, 18, 105, 1, 253, 210, 105, 1, 253, 228, - 105, 1, 253, 186, 105, 1, 253, 222, 105, 1, 253, 126, 105, 1, 253, 133, - 105, 1, 253, 212, 105, 1, 253, 201, 105, 1, 3, 253, 196, 105, 1, 253, - 196, 105, 1, 253, 232, 105, 1, 253, 195, 105, 1, 253, 200, 105, 1, 87, - 105, 1, 253, 225, 105, 1, 253, 131, 105, 1, 253, 166, 105, 1, 253, 150, - 105, 1, 253, 197, 105, 1, 253, 173, 105, 1, 219, 105, 1, 253, 141, 105, - 1, 253, 129, 105, 1, 253, 214, 105, 1, 254, 34, 105, 1, 253, 147, 105, 1, - 253, 236, 105, 1, 253, 243, 105, 1, 253, 239, 105, 1, 253, 168, 105, 1, - 253, 242, 105, 1, 253, 175, 105, 1, 253, 184, 105, 1, 254, 1, 105, 1, - 253, 208, 105, 1, 222, 105, 1, 253, 180, 105, 1, 253, 154, 105, 1, 253, - 206, 105, 1, 253, 181, 105, 1, 3, 216, 105, 1, 216, 105, 1, 3, 253, 161, - 105, 1, 253, 161, 105, 1, 3, 253, 162, 105, 1, 253, 162, 105, 1, 253, - 130, 105, 1, 253, 209, 105, 1, 253, 185, 105, 1, 253, 194, 105, 1, 253, - 160, 105, 1, 3, 253, 138, 105, 1, 253, 138, 105, 1, 253, 187, 105, 1, - 253, 170, 105, 1, 253, 177, 105, 1, 197, 105, 1, 254, 49, 105, 1, 3, 201, - 105, 1, 3, 253, 172, 50, 226, 254, 240, 59, 243, 1, 69, 50, 226, 254, - 233, 75, 243, 1, 69, 226, 254, 240, 59, 243, 1, 69, 226, 254, 233, 75, - 243, 1, 69, 105, 235, 77, 69, 105, 240, 59, 235, 77, 69, 105, 238, 112, - 247, 233, 226, 254, 45, 238, 93, 42, 1, 3, 67, 42, 1, 67, 42, 1, 3, 71, - 42, 1, 71, 42, 1, 3, 79, 42, 1, 79, 42, 1, 3, 72, 42, 1, 72, 42, 1, 3, - 73, 42, 1, 73, 42, 1, 201, 42, 1, 253, 139, 42, 1, 253, 215, 42, 1, 254, - 6, 42, 1, 253, 203, 42, 1, 253, 235, 42, 1, 253, 172, 42, 1, 254, 5, 42, - 1, 253, 190, 42, 1, 253, 234, 42, 1, 253, 132, 42, 1, 253, 163, 42, 1, - 253, 198, 42, 1, 254, 17, 42, 1, 253, 211, 42, 1, 254, 18, 42, 1, 253, - 210, 42, 1, 253, 228, 42, 1, 253, 186, 42, 1, 253, 222, 42, 1, 253, 126, - 42, 1, 253, 133, 42, 1, 253, 212, 42, 1, 253, 201, 42, 1, 3, 253, 196, - 42, 1, 253, 196, 42, 1, 253, 232, 42, 1, 253, 195, 42, 1, 253, 200, 42, - 1, 87, 42, 1, 253, 225, 42, 1, 253, 131, 42, 1, 253, 166, 42, 1, 253, - 150, 42, 1, 253, 197, 42, 1, 253, 173, 42, 1, 219, 42, 1, 253, 141, 42, - 1, 253, 129, 42, 1, 253, 214, 42, 1, 254, 34, 42, 1, 253, 147, 42, 1, - 253, 236, 42, 1, 253, 243, 42, 1, 253, 239, 42, 1, 253, 168, 42, 1, 253, - 242, 42, 1, 253, 175, 42, 1, 253, 184, 42, 1, 254, 1, 42, 1, 253, 208, - 42, 1, 222, 42, 1, 253, 180, 42, 1, 253, 154, 42, 1, 253, 206, 42, 1, - 253, 181, 42, 1, 3, 216, 42, 1, 216, 42, 1, 3, 253, 161, 42, 1, 253, 161, - 42, 1, 3, 253, 162, 42, 1, 253, 162, 42, 1, 253, 130, 42, 1, 253, 209, - 42, 1, 253, 185, 42, 1, 253, 194, 42, 1, 253, 160, 42, 1, 3, 253, 138, - 42, 1, 253, 138, 42, 1, 253, 187, 42, 1, 253, 170, 42, 1, 253, 177, 42, - 1, 197, 42, 1, 254, 49, 42, 1, 3, 201, 42, 1, 3, 253, 172, 42, 1, 253, - 171, 42, 1, 254, 48, 42, 1, 254, 12, 42, 1, 254, 13, 42, 240, 1, 248, 40, - 226, 254, 235, 138, 243, 1, 69, 42, 235, 77, 69, 42, 240, 59, 235, 77, - 69, 42, 238, 112, 246, 19, 155, 1, 217, 155, 1, 223, 155, 1, 173, 155, 1, - 255, 19, 155, 1, 209, 155, 1, 214, 155, 1, 197, 155, 1, 162, 155, 1, 210, - 155, 1, 255, 15, 155, 1, 192, 155, 1, 221, 155, 1, 255, 20, 155, 1, 206, - 155, 1, 255, 11, 155, 1, 254, 151, 155, 1, 254, 72, 155, 1, 144, 155, 1, - 255, 17, 155, 1, 255, 18, 155, 1, 193, 155, 1, 67, 155, 1, 73, 155, 1, - 72, 155, 1, 254, 36, 155, 1, 253, 149, 155, 1, 254, 89, 155, 1, 253, 151, - 155, 1, 254, 10, 155, 1, 254, 19, 155, 1, 253, 202, 155, 1, 248, 124, - 155, 1, 248, 108, 155, 1, 254, 4, 155, 1, 71, 155, 1, 79, 155, 1, 254, - 101, 155, 1, 179, 155, 1, 254, 26, 155, 1, 254, 168, 23, 1, 238, 99, 23, - 1, 232, 87, 23, 1, 232, 91, 23, 1, 240, 80, 23, 1, 232, 93, 23, 1, 232, - 94, 23, 1, 238, 102, 23, 1, 232, 101, 23, 1, 240, 85, 23, 1, 231, 98, 23, - 1, 232, 96, 23, 1, 232, 97, 23, 1, 233, 74, 23, 1, 231, 43, 23, 1, 231, - 42, 23, 1, 232, 85, 23, 1, 240, 78, 23, 1, 240, 83, 23, 1, 233, 79, 23, - 1, 233, 66, 23, 1, 243, 34, 23, 1, 234, 32, 23, 1, 240, 75, 23, 1, 240, - 71, 23, 1, 233, 77, 23, 1, 236, 195, 23, 1, 236, 198, 23, 1, 236, 205, - 23, 1, 236, 201, 23, 1, 240, 74, 23, 1, 67, 23, 1, 253, 178, 23, 1, 216, - 23, 1, 249, 18, 23, 1, 254, 59, 23, 1, 72, 23, 1, 249, 22, 23, 1, 253, - 254, 23, 1, 73, 23, 1, 253, 138, 23, 1, 249, 12, 23, 1, 253, 193, 23, 1, - 253, 162, 23, 1, 79, 23, 1, 249, 14, 23, 1, 253, 170, 23, 1, 253, 187, - 23, 1, 253, 161, 23, 1, 254, 61, 23, 1, 253, 189, 23, 1, 71, 23, 238, - 114, 23, 1, 233, 105, 23, 1, 231, 97, 23, 1, 233, 90, 23, 1, 231, 47, 23, - 1, 226, 245, 23, 1, 231, 111, 23, 1, 226, 255, 23, 1, 231, 54, 23, 1, - 226, 246, 23, 1, 232, 92, 23, 1, 233, 86, 23, 1, 231, 46, 23, 1, 231, 40, - 23, 1, 231, 109, 23, 1, 231, 110, 23, 1, 226, 243, 23, 1, 226, 244, 23, - 1, 232, 106, 23, 1, 231, 52, 23, 1, 231, 41, 23, 1, 226, 235, 23, 1, 232, - 99, 23, 1, 233, 102, 23, 1, 232, 100, 23, 1, 233, 76, 23, 1, 233, 101, - 23, 1, 236, 234, 23, 1, 233, 78, 23, 1, 235, 115, 23, 1, 231, 58, 23, 1, - 227, 0, 23, 1, 227, 9, 23, 1, 233, 104, 23, 1, 232, 102, 23, 1, 240, 255, - 23, 1, 238, 233, 23, 1, 244, 58, 23, 1, 238, 234, 23, 1, 241, 0, 23, 1, - 244, 60, 23, 1, 240, 156, 23, 1, 238, 247, 80, 234, 4, 239, 123, 69, 80, - 234, 4, 238, 75, 69, 80, 234, 4, 253, 125, 69, 80, 234, 4, 171, 69, 80, - 234, 4, 204, 69, 80, 234, 4, 248, 58, 69, 80, 234, 4, 253, 159, 69, 80, - 234, 4, 240, 1, 69, 80, 234, 4, 240, 17, 69, 80, 234, 4, 243, 41, 69, 80, - 234, 4, 240, 87, 69, 80, 234, 4, 243, 129, 69, 80, 234, 4, 240, 137, 69, - 80, 234, 4, 241, 148, 69, 80, 234, 4, 243, 168, 69, 80, 234, 4, 254, 111, - 69, 155, 1, 253, 243, 155, 1, 254, 17, 155, 1, 254, 7, 155, 1, 253, 235, - 155, 1, 253, 164, 155, 1, 250, 224, 155, 1, 253, 156, 155, 1, 249, 130, - 155, 1, 254, 177, 155, 1, 249, 238, 155, 1, 251, 105, 155, 1, 252, 254, - 155, 1, 254, 175, 155, 1, 252, 18, 155, 1, 244, 73, 155, 1, 244, 86, 155, - 1, 254, 32, 155, 1, 254, 43, 155, 1, 252, 59, 155, 1, 245, 229, 155, 30, - 1, 223, 155, 30, 1, 214, 155, 30, 1, 255, 15, 155, 30, 1, 192, 7, 240, 5, - 214, 7, 240, 5, 255, 3, 7, 240, 5, 255, 5, 7, 240, 5, 250, 137, 7, 240, - 5, 254, 128, 7, 240, 5, 251, 96, 7, 240, 5, 251, 93, 7, 240, 5, 254, 97, - 7, 240, 5, 245, 219, 7, 240, 5, 247, 134, 7, 240, 5, 251, 94, 7, 240, 5, - 245, 220, 7, 240, 5, 245, 202, 7, 240, 5, 251, 95, 7, 240, 5, 245, 221, - 7, 240, 5, 197, 42, 1, 3, 253, 203, 42, 1, 3, 253, 198, 42, 1, 3, 253, - 211, 42, 1, 3, 87, 42, 1, 3, 253, 150, 42, 1, 3, 219, 42, 1, 3, 253, 214, - 42, 1, 3, 253, 236, 42, 1, 3, 253, 168, 42, 1, 3, 253, 184, 42, 1, 3, - 253, 154, 42, 1, 3, 253, 130, 42, 1, 3, 253, 209, 42, 1, 3, 253, 185, 42, - 1, 3, 253, 194, 42, 1, 3, 253, 160, 82, 23, 238, 99, 82, 23, 240, 80, 82, - 23, 238, 102, 82, 23, 240, 85, 82, 23, 240, 78, 82, 23, 240, 83, 82, 23, - 243, 34, 82, 23, 240, 75, 82, 23, 240, 71, 82, 23, 236, 195, 82, 23, 236, - 198, 82, 23, 236, 205, 82, 23, 236, 201, 82, 23, 240, 74, 82, 23, 240, - 193, 67, 82, 23, 243, 233, 67, 82, 23, 240, 246, 67, 82, 23, 243, 254, - 67, 82, 23, 243, 226, 67, 82, 23, 243, 242, 67, 82, 23, 249, 164, 67, 82, - 23, 243, 100, 67, 82, 23, 243, 90, 67, 82, 23, 238, 169, 67, 82, 23, 238, - 194, 67, 82, 23, 238, 227, 67, 82, 23, 238, 206, 67, 82, 23, 243, 195, - 67, 82, 23, 243, 90, 79, 82, 240, 99, 99, 242, 39, 82, 240, 99, 99, 117, - 253, 236, 82, 110, 127, 82, 110, 111, 82, 110, 166, 82, 110, 177, 82, - 110, 176, 82, 110, 187, 82, 110, 203, 82, 110, 195, 82, 110, 202, 82, - 110, 248, 53, 82, 110, 243, 30, 82, 110, 243, 27, 82, 110, 240, 105, 82, - 110, 244, 52, 82, 110, 240, 199, 82, 110, 240, 49, 82, 110, 248, 136, 82, - 110, 240, 238, 82, 110, 243, 191, 82, 110, 237, 41, 82, 110, 243, 230, - 82, 110, 237, 43, 82, 110, 234, 53, 82, 110, 229, 61, 82, 110, 240, 195, - 82, 110, 234, 247, 82, 110, 244, 241, 82, 110, 240, 239, 82, 110, 234, - 66, 82, 110, 233, 84, 82, 110, 235, 140, 82, 110, 235, 116, 82, 110, 236, - 20, 82, 110, 242, 239, 82, 110, 244, 6, 82, 110, 240, 215, 233, 94, 52, - 29, 61, 240, 48, 127, 29, 61, 240, 48, 111, 29, 61, 240, 48, 166, 29, 61, - 240, 48, 177, 29, 61, 240, 48, 176, 29, 61, 240, 48, 187, 29, 61, 240, - 48, 203, 29, 61, 240, 48, 195, 29, 61, 240, 48, 202, 29, 61, 238, 101, - 29, 61, 240, 53, 127, 29, 61, 240, 53, 111, 29, 61, 240, 53, 166, 29, 61, - 240, 53, 177, 29, 61, 240, 53, 176, 29, 23, 238, 99, 29, 23, 240, 80, 29, - 23, 238, 102, 29, 23, 240, 85, 29, 23, 240, 78, 29, 23, 240, 83, 29, 23, - 243, 34, 29, 23, 240, 75, 29, 23, 240, 71, 29, 23, 236, 195, 29, 23, 236, - 198, 29, 23, 236, 205, 29, 23, 236, 201, 29, 23, 240, 74, 29, 23, 240, - 193, 67, 29, 23, 243, 233, 67, 29, 23, 240, 246, 67, 29, 23, 243, 254, - 67, 29, 23, 243, 226, 67, 29, 23, 243, 242, 67, 29, 23, 249, 164, 67, 29, - 23, 243, 100, 67, 29, 23, 243, 90, 67, 29, 23, 238, 169, 67, 29, 23, 238, - 194, 67, 29, 23, 238, 227, 67, 29, 23, 238, 206, 67, 29, 23, 243, 195, - 67, 29, 240, 99, 99, 239, 20, 29, 240, 99, 99, 241, 190, 29, 23, 243, - 100, 79, 240, 99, 237, 44, 91, 29, 110, 127, 29, 110, 111, 29, 110, 166, - 29, 110, 177, 29, 110, 176, 29, 110, 187, 29, 110, 203, 29, 110, 195, 29, - 110, 202, 29, 110, 248, 53, 29, 110, 243, 30, 29, 110, 243, 27, 29, 110, - 240, 105, 29, 110, 244, 52, 29, 110, 240, 199, 29, 110, 240, 49, 29, 110, - 248, 136, 29, 110, 240, 238, 29, 110, 243, 191, 29, 110, 237, 41, 29, - 110, 243, 230, 29, 110, 237, 43, 29, 110, 234, 53, 29, 110, 229, 61, 29, - 110, 240, 195, 29, 110, 239, 186, 29, 110, 246, 62, 29, 110, 239, 68, 29, - 110, 236, 120, 29, 110, 234, 188, 29, 110, 242, 65, 29, 110, 234, 95, 29, - 110, 245, 232, 29, 110, 242, 239, 29, 110, 245, 27, 29, 110, 237, 93, 29, - 110, 245, 146, 29, 110, 238, 129, 29, 110, 251, 207, 29, 110, 242, 220, - 29, 110, 225, 29, 110, 236, 59, 29, 110, 236, 91, 29, 110, 240, 239, 29, - 110, 234, 66, 29, 110, 233, 84, 29, 110, 235, 140, 29, 110, 235, 116, 29, - 110, 242, 11, 29, 61, 240, 53, 187, 29, 61, 240, 53, 203, 29, 61, 240, - 53, 195, 29, 61, 240, 53, 202, 29, 61, 240, 136, 29, 61, 243, 6, 127, 29, - 61, 243, 6, 111, 29, 61, 243, 6, 166, 29, 61, 243, 6, 177, 29, 61, 243, - 6, 176, 29, 61, 243, 6, 187, 29, 61, 243, 6, 203, 29, 61, 243, 6, 195, - 29, 61, 243, 6, 202, 29, 61, 240, 50, 80, 145, 12, 28, 237, 183, 80, 145, - 12, 28, 236, 19, 80, 145, 12, 28, 241, 229, 80, 145, 12, 28, 241, 12, 80, - 145, 12, 28, 251, 222, 80, 145, 12, 28, 245, 253, 80, 145, 12, 28, 245, - 252, 80, 145, 12, 28, 238, 253, 80, 145, 12, 28, 234, 252, 80, 145, 12, - 28, 237, 224, 80, 145, 12, 28, 236, 65, 80, 145, 12, 28, 235, 200, 31, - 254, 171, 31, 250, 227, 31, 254, 160, 239, 118, 236, 51, 52, 29, 42, 67, - 29, 42, 71, 29, 42, 79, 29, 42, 72, 29, 42, 73, 29, 42, 201, 29, 42, 253, - 215, 29, 42, 253, 203, 29, 42, 253, 172, 29, 42, 253, 190, 29, 42, 253, - 132, 29, 42, 253, 198, 29, 42, 253, 211, 29, 42, 253, 210, 29, 42, 253, - 186, 29, 42, 253, 126, 29, 42, 253, 212, 29, 42, 253, 196, 29, 42, 253, - 195, 29, 42, 87, 29, 42, 253, 131, 29, 42, 253, 166, 29, 42, 253, 150, - 29, 42, 253, 197, 29, 42, 253, 173, 29, 42, 219, 29, 42, 253, 214, 29, - 42, 253, 236, 29, 42, 253, 168, 29, 42, 253, 184, 29, 42, 222, 29, 42, - 253, 180, 29, 42, 253, 154, 29, 42, 253, 206, 29, 42, 253, 181, 29, 42, - 216, 29, 42, 253, 161, 29, 42, 253, 162, 29, 42, 253, 130, 29, 42, 253, - 209, 29, 42, 253, 185, 29, 42, 253, 194, 29, 42, 253, 160, 29, 42, 253, - 138, 29, 42, 253, 187, 29, 42, 253, 170, 29, 42, 253, 177, 31, 238, 246, - 31, 238, 251, 31, 241, 10, 31, 244, 68, 31, 239, 99, 31, 245, 230, 31, - 252, 255, 31, 236, 15, 31, 241, 91, 31, 246, 232, 31, 246, 233, 31, 241, - 192, 31, 237, 187, 31, 237, 188, 31, 241, 124, 31, 241, 123, 31, 245, - 124, 31, 241, 137, 31, 239, 112, 31, 237, 165, 31, 246, 16, 31, 233, 213, - 31, 232, 180, 31, 234, 214, 31, 239, 87, 31, 234, 198, 31, 234, 216, 31, - 237, 192, 31, 241, 196, 31, 239, 110, 31, 241, 205, 31, 237, 254, 31, - 236, 95, 31, 238, 7, 31, 242, 101, 31, 242, 102, 31, 241, 70, 31, 245, - 63, 31, 245, 73, 31, 252, 227, 31, 246, 105, 31, 242, 24, 31, 241, 146, - 31, 236, 67, 31, 242, 46, 31, 237, 69, 31, 234, 233, 31, 239, 161, 31, - 246, 251, 31, 244, 223, 31, 236, 36, 31, 239, 95, 31, 235, 184, 31, 241, - 170, 31, 234, 199, 31, 246, 242, 31, 239, 159, 31, 239, 93, 31, 242, 55, - 31, 242, 52, 31, 241, 26, 31, 239, 164, 31, 239, 11, 31, 251, 77, 31, - 242, 64, 31, 241, 167, 31, 245, 200, 31, 237, 197, 31, 241, 225, 31, 241, - 224, 31, 239, 129, 31, 237, 199, 31, 237, 210, 31, 246, 88, 31, 234, 223, - 31, 243, 106, 31, 237, 207, 31, 237, 206, 31, 242, 190, 31, 242, 191, 31, - 247, 237, 31, 237, 252, 31, 247, 32, 31, 242, 90, 31, 237, 253, 31, 247, - 29, 31, 236, 92, 31, 242, 183, 80, 145, 12, 28, 248, 52, 242, 217, 80, - 145, 12, 28, 248, 52, 127, 80, 145, 12, 28, 248, 52, 111, 80, 145, 12, - 28, 248, 52, 166, 80, 145, 12, 28, 248, 52, 177, 80, 145, 12, 28, 248, - 52, 176, 80, 145, 12, 28, 248, 52, 187, 80, 145, 12, 28, 248, 52, 203, - 80, 145, 12, 28, 248, 52, 195, 80, 145, 12, 28, 248, 52, 202, 80, 145, - 12, 28, 248, 52, 248, 53, 80, 145, 12, 28, 248, 52, 238, 91, 80, 145, 12, - 28, 248, 52, 238, 97, 80, 145, 12, 28, 248, 52, 235, 85, 80, 145, 12, 28, - 248, 52, 235, 82, 80, 145, 12, 28, 248, 52, 236, 207, 80, 145, 12, 28, - 248, 52, 236, 202, 80, 145, 12, 28, 248, 52, 234, 22, 80, 145, 12, 28, - 248, 52, 235, 81, 80, 145, 12, 28, 248, 52, 235, 83, 80, 145, 12, 28, - 248, 52, 238, 77, 80, 145, 12, 28, 248, 52, 233, 110, 80, 145, 12, 28, - 248, 52, 233, 111, 80, 145, 12, 28, 248, 52, 231, 114, 80, 145, 12, 28, - 248, 52, 232, 111, 31, 251, 82, 31, 253, 133, 31, 253, 151, 31, 125, 31, - 254, 219, 31, 254, 222, 31, 254, 156, 31, 255, 53, 236, 191, 31, 255, 53, - 240, 94, 31, 254, 101, 31, 254, 37, 248, 170, 239, 89, 31, 254, 37, 248, - 170, 239, 213, 31, 254, 37, 248, 170, 238, 21, 31, 254, 37, 248, 170, - 241, 232, 31, 232, 123, 31, 255, 87, 244, 79, 31, 253, 131, 31, 255, 27, - 67, 31, 222, 31, 201, 31, 254, 182, 31, 254, 199, 31, 254, 166, 31, 250, - 143, 31, 246, 7, 31, 254, 224, 31, 254, 211, 31, 255, 27, 255, 19, 31, - 255, 27, 210, 31, 254, 202, 31, 254, 106, 31, 254, 173, 31, 251, 147, 31, - 251, 230, 31, 251, 20, 31, 252, 220, 31, 255, 27, 162, 31, 254, 204, 31, - 254, 155, 31, 254, 186, 31, 254, 164, 31, 254, 215, 31, 255, 27, 173, 31, - 254, 205, 31, 254, 152, 31, 254, 187, 31, 255, 61, 236, 191, 31, 255, 52, - 236, 191, 31, 255, 108, 236, 191, 31, 255, 50, 236, 191, 31, 255, 61, - 240, 94, 31, 255, 52, 240, 94, 31, 255, 108, 240, 94, 31, 255, 50, 240, - 94, 31, 255, 108, 248, 59, 193, 31, 255, 108, 248, 59, 255, 99, 236, 191, - 31, 253, 129, 31, 251, 163, 31, 249, 115, 31, 251, 28, 31, 252, 126, 31, - 254, 71, 248, 59, 193, 31, 254, 71, 248, 59, 255, 99, 236, 191, 31, 254, - 229, 31, 254, 216, 31, 255, 27, 193, 31, 254, 206, 31, 254, 230, 31, 254, - 115, 31, 255, 27, 179, 31, 254, 207, 31, 254, 189, 31, 255, 84, 243, 106, - 31, 254, 231, 31, 254, 217, 31, 255, 27, 255, 16, 31, 254, 208, 31, 254, - 108, 31, 255, 85, 243, 106, 31, 255, 109, 249, 126, 31, 255, 108, 249, - 126, 31, 254, 32, 31, 254, 147, 31, 254, 149, 31, 254, 150, 31, 255, 105, - 248, 59, 254, 106, 31, 253, 224, 31, 254, 154, 31, 254, 170, 31, 219, 31, - 254, 97, 31, 253, 247, 31, 254, 107, 31, 255, 50, 237, 83, 31, 254, 188, - 31, 254, 194, 31, 254, 195, 31, 251, 203, 31, 254, 197, 31, 255, 80, 240, - 147, 31, 251, 233, 31, 251, 240, 31, 254, 225, 31, 254, 226, 31, 252, 75, - 31, 254, 228, 31, 254, 241, 31, 254, 127, 31, 255, 2, 31, 255, 110, 248, - 59, 173, 31, 134, 248, 59, 173, 80, 145, 12, 28, 253, 137, 127, 80, 145, - 12, 28, 253, 137, 111, 80, 145, 12, 28, 253, 137, 166, 80, 145, 12, 28, - 253, 137, 177, 80, 145, 12, 28, 253, 137, 176, 80, 145, 12, 28, 253, 137, - 187, 80, 145, 12, 28, 253, 137, 203, 80, 145, 12, 28, 253, 137, 195, 80, - 145, 12, 28, 253, 137, 202, 80, 145, 12, 28, 253, 137, 248, 53, 80, 145, - 12, 28, 253, 137, 238, 91, 80, 145, 12, 28, 253, 137, 238, 97, 80, 145, - 12, 28, 253, 137, 235, 85, 80, 145, 12, 28, 253, 137, 235, 82, 80, 145, - 12, 28, 253, 137, 236, 207, 80, 145, 12, 28, 253, 137, 236, 202, 80, 145, - 12, 28, 253, 137, 234, 22, 80, 145, 12, 28, 253, 137, 235, 81, 80, 145, - 12, 28, 253, 137, 235, 83, 80, 145, 12, 28, 253, 137, 238, 77, 80, 145, - 12, 28, 253, 137, 233, 110, 80, 145, 12, 28, 253, 137, 233, 111, 80, 145, - 12, 28, 253, 137, 231, 114, 80, 145, 12, 28, 253, 137, 232, 111, 80, 145, - 12, 28, 253, 137, 233, 45, 80, 145, 12, 28, 253, 137, 233, 255, 80, 145, - 12, 28, 253, 137, 232, 64, 80, 145, 12, 28, 253, 137, 232, 63, 80, 145, - 12, 28, 253, 137, 233, 46, 80, 145, 12, 28, 253, 137, 238, 101, 80, 145, - 12, 28, 253, 137, 233, 252, 31, 251, 7, 156, 28, 253, 145, 237, 94, 238, - 139, 156, 28, 253, 145, 236, 86, 240, 49, 156, 28, 234, 112, 255, 31, - 253, 145, 234, 97, 156, 28, 238, 48, 241, 113, 156, 28, 237, 51, 156, 28, - 235, 191, 156, 28, 253, 145, 244, 84, 156, 28, 238, 189, 235, 153, 156, - 28, 3, 238, 222, 156, 28, 236, 130, 156, 28, 242, 51, 156, 28, 233, 247, - 156, 28, 233, 201, 156, 28, 243, 58, 233, 224, 156, 28, 237, 212, 156, - 28, 233, 197, 156, 28, 234, 54, 156, 28, 253, 37, 255, 34, 253, 145, 237, - 102, 156, 28, 235, 166, 156, 28, 231, 63, 156, 28, 241, 32, 238, 27, 156, - 28, 241, 139, 156, 28, 236, 104, 241, 11, 156, 28, 238, 211, 156, 28, - 234, 208, 156, 28, 243, 58, 238, 222, 156, 28, 246, 91, 237, 0, 156, 28, - 243, 58, 231, 53, 156, 28, 253, 145, 238, 236, 240, 105, 156, 28, 253, - 145, 237, 87, 243, 27, 156, 28, 234, 207, 156, 28, 236, 9, 156, 28, 237, - 251, 156, 28, 243, 58, 240, 210, 156, 28, 236, 81, 156, 28, 235, 198, - 147, 253, 145, 240, 9, 156, 28, 253, 145, 239, 66, 156, 28, 233, 73, 156, - 28, 232, 189, 156, 28, 232, 128, 156, 28, 235, 201, 156, 28, 235, 127, - 156, 28, 231, 119, 156, 28, 241, 65, 153, 243, 224, 156, 28, 235, 124, - 235, 153, 156, 28, 239, 170, 239, 235, 156, 28, 233, 221, 156, 28, 253, - 145, 247, 193, 156, 28, 233, 231, 156, 28, 253, 145, 235, 117, 156, 28, - 253, 145, 237, 67, 237, 48, 156, 28, 253, 145, 238, 193, 247, 123, 235, - 102, 156, 28, 232, 131, 156, 28, 253, 145, 237, 203, 239, 125, 156, 28, - 234, 89, 156, 28, 253, 145, 236, 139, 156, 28, 253, 145, 241, 125, 243, - 82, 156, 28, 253, 145, 241, 188, 243, 213, 156, 28, 233, 135, 156, 28, - 233, 216, 156, 28, 245, 228, 242, 158, 156, 28, 3, 231, 53, 156, 28, 244, - 70, 233, 69, 156, 28, 241, 27, 233, 69, 6, 4, 254, 179, 6, 4, 254, 180, - 6, 4, 71, 6, 4, 254, 176, 6, 4, 251, 102, 6, 4, 251, 103, 6, 4, 253, 237, - 6, 4, 251, 101, 6, 4, 254, 20, 6, 4, 254, 144, 6, 4, 67, 6, 4, 254, 141, - 6, 4, 253, 1, 6, 4, 254, 252, 6, 4, 253, 0, 6, 4, 254, 67, 6, 4, 254, - 220, 6, 4, 73, 6, 4, 254, 120, 6, 4, 254, 161, 6, 4, 72, 6, 4, 254, 14, - 6, 4, 250, 125, 6, 4, 250, 126, 6, 4, 254, 34, 6, 4, 250, 124, 6, 4, 244, - 221, 6, 4, 244, 222, 6, 4, 250, 122, 6, 4, 244, 220, 6, 4, 250, 104, 6, - 4, 250, 105, 6, 4, 253, 141, 6, 4, 250, 103, 6, 4, 244, 235, 6, 4, 250, - 131, 6, 4, 244, 234, 6, 4, 250, 130, 6, 4, 248, 92, 6, 4, 254, 1, 6, 4, - 250, 129, 6, 4, 250, 119, 6, 4, 253, 242, 6, 4, 250, 116, 6, 4, 250, 133, - 6, 4, 250, 134, 6, 4, 253, 243, 6, 4, 250, 132, 6, 4, 244, 236, 6, 4, - 249, 35, 6, 4, 250, 140, 6, 4, 250, 141, 6, 4, 254, 82, 6, 4, 250, 138, - 6, 4, 244, 238, 6, 4, 250, 139, 6, 4, 252, 68, 6, 4, 252, 69, 6, 4, 253, - 147, 6, 4, 252, 67, 6, 4, 246, 250, 6, 4, 252, 65, 6, 4, 246, 249, 6, 4, - 252, 61, 6, 4, 252, 62, 6, 4, 253, 129, 6, 4, 252, 60, 6, 4, 247, 0, 6, - 4, 252, 78, 6, 4, 246, 255, 6, 4, 252, 73, 6, 4, 252, 74, 6, 4, 253, 208, - 6, 4, 252, 72, 6, 4, 249, 142, 6, 4, 252, 81, 6, 4, 253, 239, 6, 4, 252, - 79, 6, 4, 247, 1, 6, 4, 252, 80, 6, 4, 249, 144, 6, 4, 252, 84, 6, 4, - 254, 232, 6, 4, 252, 82, 6, 4, 247, 3, 6, 4, 252, 83, 6, 4, 244, 200, 6, - 4, 244, 201, 6, 4, 250, 108, 6, 4, 244, 199, 6, 4, 241, 21, 6, 4, 241, - 22, 6, 4, 244, 198, 6, 4, 241, 20, 6, 4, 244, 194, 6, 4, 244, 195, 6, 4, - 250, 106, 6, 4, 244, 193, 6, 4, 241, 24, 6, 4, 244, 205, 6, 4, 241, 23, - 6, 4, 244, 203, 6, 4, 244, 204, 6, 4, 250, 109, 6, 4, 244, 202, 6, 4, - 244, 197, 6, 4, 250, 107, 6, 4, 244, 196, 6, 4, 243, 145, 6, 4, 244, 208, - 6, 4, 250, 110, 6, 4, 244, 206, 6, 4, 241, 25, 6, 4, 244, 207, 6, 4, 244, - 210, 6, 4, 244, 211, 6, 4, 250, 111, 6, 4, 244, 209, 6, 4, 246, 110, 6, - 4, 246, 111, 6, 4, 252, 3, 6, 4, 246, 109, 6, 4, 242, 0, 6, 4, 243, 232, - 6, 4, 241, 255, 6, 4, 246, 107, 6, 4, 246, 108, 6, 4, 252, 2, 6, 4, 246, - 106, 6, 4, 246, 113, 6, 4, 246, 114, 6, 4, 252, 4, 6, 4, 246, 112, 6, 4, - 246, 117, 6, 4, 246, 118, 6, 4, 252, 5, 6, 4, 246, 115, 6, 4, 242, 1, 6, - 4, 246, 116, 6, 4, 246, 121, 6, 4, 246, 122, 6, 4, 252, 6, 6, 4, 246, - 119, 6, 4, 242, 2, 6, 4, 246, 120, 6, 4, 245, 173, 6, 4, 245, 174, 6, 4, - 251, 71, 6, 4, 245, 172, 6, 4, 241, 158, 6, 4, 245, 171, 6, 4, 241, 157, - 6, 4, 245, 169, 6, 4, 245, 170, 6, 4, 251, 70, 6, 4, 245, 168, 6, 4, 241, - 160, 6, 4, 245, 178, 6, 4, 241, 159, 6, 4, 245, 176, 6, 4, 245, 177, 6, - 4, 249, 82, 6, 4, 245, 175, 6, 4, 245, 181, 6, 4, 245, 182, 6, 4, 251, - 72, 6, 4, 245, 179, 6, 4, 241, 161, 6, 4, 245, 180, 6, 4, 245, 185, 6, 4, - 251, 73, 6, 4, 245, 183, 6, 4, 241, 162, 6, 4, 245, 184, 6, 4, 251, 237, - 6, 4, 251, 238, 6, 4, 253, 180, 6, 4, 251, 236, 6, 4, 246, 83, 6, 4, 251, - 231, 6, 4, 246, 82, 6, 4, 251, 220, 6, 4, 251, 221, 6, 4, 222, 6, 4, 251, - 218, 6, 4, 246, 97, 6, 4, 246, 98, 6, 4, 251, 243, 6, 4, 246, 96, 6, 4, - 251, 241, 6, 4, 251, 242, 6, 4, 253, 181, 6, 4, 249, 114, 6, 4, 251, 226, - 6, 4, 253, 206, 6, 4, 251, 246, 6, 4, 251, 247, 6, 4, 253, 154, 6, 4, - 251, 244, 6, 4, 246, 100, 6, 4, 251, 245, 6, 4, 251, 250, 6, 4, 251, 251, - 6, 4, 254, 209, 6, 4, 251, 249, 6, 4, 250, 247, 6, 4, 250, 248, 6, 4, - 253, 245, 6, 4, 250, 246, 6, 4, 250, 235, 6, 4, 250, 236, 6, 4, 253, 179, - 6, 4, 250, 234, 6, 4, 250, 251, 6, 4, 254, 63, 6, 4, 250, 250, 6, 4, 250, - 253, 6, 4, 250, 254, 6, 4, 254, 93, 6, 4, 250, 252, 6, 4, 245, 93, 6, 4, - 249, 64, 6, 4, 251, 3, 6, 4, 251, 4, 6, 4, 254, 165, 6, 4, 251, 2, 6, 4, - 253, 14, 6, 4, 253, 15, 6, 4, 254, 48, 6, 4, 253, 13, 6, 4, 247, 187, 6, - 4, 247, 188, 6, 4, 253, 12, 6, 4, 247, 186, 6, 4, 253, 8, 6, 4, 253, 9, - 6, 4, 253, 171, 6, 4, 253, 7, 6, 4, 253, 18, 6, 4, 253, 20, 6, 4, 254, - 13, 6, 4, 253, 17, 6, 4, 253, 11, 6, 4, 249, 193, 6, 4, 253, 22, 6, 4, - 253, 23, 6, 4, 254, 49, 6, 4, 253, 21, 6, 4, 247, 189, 6, 4, 249, 197, 6, - 4, 253, 27, 6, 4, 253, 28, 6, 4, 255, 1, 6, 4, 253, 25, 6, 4, 247, 190, - 6, 4, 253, 26, 6, 4, 250, 196, 6, 4, 250, 197, 6, 4, 253, 201, 6, 4, 250, - 195, 6, 4, 245, 66, 6, 4, 250, 194, 6, 4, 245, 65, 6, 4, 250, 184, 6, 4, - 250, 187, 6, 4, 253, 133, 6, 4, 250, 182, 6, 4, 245, 75, 6, 4, 250, 209, - 6, 4, 248, 40, 6, 4, 250, 205, 6, 4, 253, 225, 6, 4, 250, 204, 6, 4, 250, - 191, 6, 4, 253, 200, 6, 4, 250, 190, 6, 4, 250, 212, 6, 4, 250, 213, 6, - 4, 253, 232, 6, 4, 250, 210, 6, 4, 245, 76, 6, 4, 250, 211, 6, 4, 252, - 223, 6, 4, 252, 224, 6, 4, 253, 212, 6, 4, 252, 222, 6, 4, 247, 149, 6, - 4, 248, 139, 6, 4, 247, 148, 6, 4, 249, 174, 6, 4, 252, 212, 6, 4, 253, - 126, 6, 4, 252, 209, 6, 4, 247, 174, 6, 4, 247, 175, 6, 4, 252, 233, 6, - 4, 247, 173, 6, 4, 249, 184, 6, 4, 252, 228, 6, 4, 87, 6, 4, 249, 3, 6, - 4, 252, 217, 6, 4, 253, 195, 6, 4, 252, 214, 6, 4, 252, 236, 6, 4, 252, - 237, 6, 4, 253, 196, 6, 4, 252, 234, 6, 4, 247, 176, 6, 4, 252, 235, 6, - 4, 245, 47, 6, 4, 245, 48, 6, 4, 249, 51, 6, 4, 245, 46, 6, 4, 241, 77, - 6, 4, 245, 45, 6, 4, 241, 76, 6, 4, 245, 39, 6, 4, 245, 40, 6, 4, 248, - 75, 6, 4, 245, 38, 6, 4, 241, 79, 6, 4, 245, 53, 6, 4, 241, 78, 6, 4, - 245, 51, 6, 4, 245, 52, 6, 4, 248, 204, 6, 4, 245, 50, 6, 4, 245, 43, 6, - 4, 249, 50, 6, 4, 245, 42, 6, 4, 245, 55, 6, 4, 245, 56, 6, 4, 249, 52, - 6, 4, 245, 54, 6, 4, 241, 80, 6, 4, 243, 163, 6, 4, 246, 130, 6, 4, 246, - 131, 6, 4, 252, 9, 6, 4, 246, 129, 6, 4, 242, 3, 6, 4, 246, 128, 6, 4, - 246, 124, 6, 4, 246, 125, 6, 4, 252, 7, 6, 4, 246, 123, 6, 4, 246, 133, - 6, 4, 246, 134, 6, 4, 252, 10, 6, 4, 246, 132, 6, 4, 246, 127, 6, 4, 252, - 8, 6, 4, 246, 126, 6, 4, 246, 137, 6, 4, 246, 138, 6, 4, 252, 11, 6, 4, - 246, 135, 6, 4, 242, 4, 6, 4, 246, 136, 6, 4, 245, 193, 6, 4, 245, 194, - 6, 4, 251, 75, 6, 4, 245, 192, 6, 4, 241, 164, 6, 4, 241, 165, 6, 4, 245, - 191, 6, 4, 241, 163, 6, 4, 245, 187, 6, 4, 245, 188, 6, 4, 249, 83, 6, 4, - 245, 186, 6, 4, 241, 166, 6, 4, 245, 198, 6, 4, 245, 196, 6, 4, 245, 197, - 6, 4, 245, 195, 6, 4, 245, 190, 6, 4, 251, 74, 6, 4, 245, 189, 6, 4, 245, - 199, 6, 4, 252, 24, 6, 4, 252, 25, 6, 4, 253, 166, 6, 4, 252, 23, 6, 4, - 246, 155, 6, 4, 252, 21, 6, 4, 246, 154, 6, 4, 252, 1, 6, 4, 253, 131, 6, - 4, 251, 255, 6, 4, 246, 195, 6, 4, 252, 41, 6, 4, 246, 194, 6, 4, 248, - 233, 6, 4, 252, 35, 6, 4, 253, 173, 6, 4, 252, 33, 6, 4, 252, 15, 6, 4, - 253, 197, 6, 4, 252, 13, 6, 4, 252, 44, 6, 4, 252, 45, 6, 4, 253, 150, 6, - 4, 252, 42, 6, 4, 246, 196, 6, 4, 252, 43, 6, 4, 245, 155, 6, 4, 245, - 156, 6, 4, 251, 66, 6, 4, 245, 154, 6, 4, 241, 152, 6, 4, 245, 153, 6, 4, - 241, 151, 6, 4, 245, 149, 6, 4, 245, 150, 6, 4, 251, 64, 6, 4, 245, 148, - 6, 4, 241, 154, 6, 4, 245, 159, 6, 4, 241, 153, 6, 4, 245, 158, 6, 4, - 251, 67, 6, 4, 245, 157, 6, 4, 245, 152, 6, 4, 251, 65, 6, 4, 245, 151, - 6, 4, 245, 162, 6, 4, 245, 163, 6, 4, 251, 68, 6, 4, 245, 160, 6, 4, 241, - 155, 6, 4, 245, 161, 6, 4, 245, 166, 6, 4, 245, 167, 6, 4, 251, 69, 6, 4, - 245, 164, 6, 4, 241, 156, 6, 4, 245, 165, 6, 4, 251, 200, 6, 4, 251, 201, - 6, 4, 253, 251, 6, 4, 251, 198, 6, 4, 246, 49, 6, 4, 246, 50, 6, 4, 249, - 105, 6, 4, 246, 48, 6, 4, 251, 185, 6, 4, 251, 186, 6, 4, 253, 134, 6, 4, - 251, 183, 6, 4, 246, 57, 6, 4, 246, 58, 6, 4, 251, 209, 6, 4, 246, 56, 6, - 4, 251, 206, 6, 4, 251, 208, 6, 4, 253, 216, 6, 4, 251, 205, 6, 4, 251, - 191, 6, 4, 253, 250, 6, 4, 251, 189, 6, 4, 251, 212, 6, 4, 251, 213, 6, - 4, 254, 8, 6, 4, 251, 210, 6, 4, 246, 59, 6, 4, 251, 211, 6, 4, 251, 215, - 6, 4, 251, 216, 6, 4, 254, 110, 6, 4, 251, 214, 6, 4, 246, 60, 6, 4, 249, - 109, 6, 4, 251, 23, 6, 4, 251, 24, 6, 4, 254, 6, 6, 4, 251, 22, 6, 4, - 245, 122, 6, 4, 245, 123, 6, 4, 251, 21, 6, 4, 245, 121, 6, 4, 251, 10, - 6, 4, 251, 11, 6, 4, 253, 139, 6, 4, 251, 8, 6, 4, 245, 131, 6, 4, 245, - 132, 6, 4, 251, 31, 6, 4, 245, 130, 6, 4, 249, 78, 6, 4, 251, 27, 6, 4, - 253, 234, 6, 4, 251, 26, 6, 4, 251, 15, 6, 4, 251, 17, 6, 4, 254, 5, 6, - 4, 249, 69, 6, 4, 251, 34, 6, 4, 251, 35, 6, 4, 253, 235, 6, 4, 251, 32, - 6, 4, 245, 133, 6, 4, 251, 33, 6, 4, 249, 95, 6, 4, 251, 152, 6, 4, 253, - 215, 6, 4, 251, 151, 6, 4, 246, 15, 6, 4, 251, 148, 6, 4, 246, 14, 6, 4, - 251, 138, 6, 4, 251, 140, 6, 4, 201, 6, 4, 251, 137, 6, 4, 246, 21, 6, 4, - 251, 165, 6, 4, 246, 20, 6, 4, 251, 161, 6, 4, 251, 162, 6, 4, 253, 190, - 6, 4, 251, 160, 6, 4, 251, 143, 6, 4, 251, 144, 6, 4, 253, 172, 6, 4, - 251, 142, 6, 4, 251, 168, 6, 4, 251, 169, 6, 4, 253, 203, 6, 4, 251, 166, - 6, 4, 246, 23, 6, 4, 251, 167, 6, 4, 245, 108, 6, 4, 245, 109, 6, 4, 249, - 72, 6, 4, 241, 129, 6, 4, 245, 107, 6, 4, 241, 128, 6, 4, 245, 101, 6, 4, - 245, 102, 6, 4, 249, 70, 6, 4, 245, 100, 6, 4, 241, 131, 6, 4, 241, 132, - 6, 4, 243, 181, 6, 4, 241, 130, 6, 4, 245, 110, 6, 4, 245, 111, 6, 4, - 249, 73, 6, 4, 243, 180, 6, 4, 245, 105, 6, 4, 245, 106, 6, 4, 249, 71, - 6, 4, 245, 104, 6, 4, 245, 114, 6, 4, 245, 115, 6, 4, 249, 74, 6, 4, 245, - 112, 6, 4, 241, 133, 6, 4, 245, 113, 6, 4, 241, 238, 6, 4, 246, 72, 6, 4, - 246, 68, 6, 4, 246, 69, 6, 4, 251, 227, 6, 4, 246, 67, 6, 4, 241, 240, 6, - 4, 246, 76, 6, 4, 241, 239, 6, 4, 246, 74, 6, 4, 246, 75, 6, 4, 248, 167, - 6, 4, 246, 73, 6, 4, 246, 71, 6, 4, 251, 228, 6, 4, 246, 70, 6, 4, 246, - 79, 6, 4, 246, 80, 6, 4, 251, 229, 6, 4, 246, 77, 6, 4, 241, 241, 6, 4, - 246, 78, 6, 4, 243, 196, 6, 4, 245, 216, 6, 4, 251, 91, 6, 4, 245, 215, - 6, 4, 241, 172, 6, 4, 241, 173, 6, 4, 245, 214, 6, 4, 241, 171, 6, 4, - 245, 210, 6, 4, 245, 211, 6, 4, 251, 89, 6, 4, 245, 209, 6, 4, 241, 175, - 6, 4, 241, 176, 6, 4, 243, 198, 6, 4, 241, 174, 6, 4, 245, 217, 6, 4, - 245, 218, 6, 4, 251, 92, 6, 4, 243, 197, 6, 4, 245, 213, 6, 4, 251, 90, - 6, 4, 245, 212, 6, 4, 242, 7, 6, 4, 246, 146, 6, 4, 242, 6, 6, 4, 246, - 142, 6, 4, 246, 143, 6, 4, 248, 50, 6, 4, 246, 141, 6, 4, 242, 9, 6, 4, - 242, 10, 6, 4, 246, 153, 6, 4, 246, 151, 6, 4, 246, 152, 6, 4, 248, 172, - 6, 4, 246, 150, 6, 4, 246, 145, 6, 4, 252, 17, 6, 4, 246, 144, 6, 4, 251, - 63, 6, 4, 245, 145, 6, 4, 248, 160, 6, 4, 248, 214, 6, 4, 251, 48, 6, 4, - 219, 6, 4, 251, 47, 6, 4, 245, 206, 6, 4, 245, 207, 6, 4, 251, 83, 6, 4, - 245, 205, 6, 4, 251, 80, 6, 4, 251, 81, 6, 4, 253, 184, 6, 4, 251, 79, 6, - 4, 251, 55, 6, 4, 253, 168, 6, 4, 251, 53, 6, 4, 253, 30, 6, 4, 253, 31, - 6, 4, 253, 138, 6, 4, 253, 29, 6, 4, 247, 200, 6, 4, 253, 39, 6, 4, 247, - 199, 6, 4, 253, 38, 6, 4, 253, 177, 6, 4, 253, 36, 6, 4, 253, 33, 6, 4, - 253, 170, 6, 4, 253, 32, 6, 4, 253, 106, 6, 4, 253, 107, 6, 4, 254, 17, - 6, 4, 253, 105, 6, 4, 248, 10, 6, 4, 253, 104, 6, 4, 248, 9, 6, 4, 253, - 99, 6, 4, 253, 100, 6, 4, 253, 163, 6, 4, 253, 98, 6, 4, 248, 12, 6, 4, - 253, 114, 6, 4, 248, 11, 6, 4, 249, 221, 6, 4, 253, 112, 6, 4, 253, 222, - 6, 4, 253, 111, 6, 4, 253, 102, 6, 4, 253, 228, 6, 4, 253, 101, 6, 4, - 253, 115, 6, 4, 253, 116, 6, 4, 254, 18, 6, 4, 249, 222, 6, 4, 248, 13, - 6, 4, 249, 223, 6, 4, 253, 120, 6, 4, 253, 121, 6, 4, 255, 13, 6, 4, 253, - 118, 6, 4, 248, 14, 6, 4, 253, 119, 6, 4, 250, 163, 6, 4, 250, 164, 6, 4, - 254, 55, 6, 4, 249, 40, 6, 4, 245, 19, 6, 4, 245, 20, 6, 4, 250, 161, 6, - 4, 245, 18, 6, 4, 250, 146, 6, 4, 250, 147, 6, 4, 253, 152, 6, 4, 249, - 38, 6, 4, 245, 28, 6, 4, 250, 170, 6, 4, 243, 157, 6, 4, 250, 167, 6, 4, - 250, 168, 6, 4, 253, 224, 6, 4, 250, 166, 6, 4, 250, 157, 6, 4, 254, 54, - 6, 4, 250, 156, 6, 4, 250, 172, 6, 4, 250, 173, 6, 4, 254, 84, 6, 4, 249, - 43, 6, 4, 245, 29, 6, 4, 250, 171, 6, 4, 249, 48, 6, 4, 250, 176, 6, 4, - 254, 85, 6, 4, 249, 47, 6, 4, 245, 30, 6, 4, 250, 175, 6, 4, 248, 24, 6, - 4, 248, 25, 6, 4, 249, 226, 6, 4, 248, 23, 6, 4, 241, 1, 6, 4, 242, 211, - 6, 4, 248, 22, 6, 4, 242, 210, 6, 4, 248, 17, 6, 4, 248, 18, 6, 4, 249, - 224, 6, 4, 248, 16, 6, 4, 248, 27, 6, 4, 249, 227, 6, 4, 248, 26, 6, 4, - 248, 21, 6, 4, 249, 225, 6, 4, 248, 20, 6, 4, 248, 30, 6, 4, 249, 228, 6, - 4, 248, 28, 6, 4, 242, 212, 6, 4, 248, 29, 6, 4, 248, 33, 6, 4, 248, 34, - 6, 4, 253, 122, 6, 4, 248, 31, 6, 4, 242, 213, 6, 4, 248, 32, 6, 4, 246, - 219, 6, 4, 246, 220, 6, 4, 252, 49, 6, 4, 246, 218, 6, 4, 242, 34, 6, 4, - 246, 217, 6, 4, 242, 33, 6, 4, 246, 214, 6, 4, 246, 215, 6, 4, 252, 47, - 6, 4, 246, 213, 6, 4, 242, 35, 6, 4, 246, 223, 6, 4, 246, 222, 6, 4, 246, - 221, 6, 4, 246, 216, 6, 4, 252, 48, 6, 4, 246, 225, 6, 4, 252, 50, 6, 4, - 243, 239, 6, 4, 242, 36, 6, 4, 246, 224, 6, 4, 246, 228, 6, 4, 246, 229, - 6, 4, 252, 51, 6, 4, 246, 226, 6, 4, 242, 37, 6, 4, 246, 227, 6, 4, 252, - 180, 6, 4, 187, 6, 4, 253, 198, 6, 4, 252, 179, 6, 4, 247, 88, 6, 4, 252, - 176, 6, 4, 247, 87, 6, 4, 252, 167, 6, 4, 252, 168, 6, 4, 253, 132, 6, 4, - 252, 166, 6, 4, 247, 126, 6, 4, 252, 193, 6, 4, 247, 125, 6, 4, 252, 186, - 6, 4, 252, 188, 6, 4, 253, 186, 6, 4, 252, 185, 6, 4, 252, 172, 6, 4, - 253, 210, 6, 4, 252, 171, 6, 4, 252, 196, 6, 4, 252, 197, 6, 4, 253, 211, - 6, 4, 252, 194, 6, 4, 247, 128, 6, 4, 252, 195, 6, 4, 252, 200, 6, 4, - 252, 201, 6, 4, 254, 243, 6, 4, 252, 198, 6, 4, 247, 130, 6, 4, 252, 199, - 6, 4, 247, 108, 6, 4, 247, 109, 6, 4, 248, 249, 6, 4, 247, 107, 6, 4, - 242, 129, 6, 4, 247, 106, 6, 4, 242, 128, 6, 4, 247, 101, 6, 4, 247, 102, - 6, 4, 248, 66, 6, 4, 247, 100, 6, 4, 247, 111, 6, 4, 247, 112, 6, 4, 248, - 250, 6, 4, 247, 110, 6, 4, 247, 105, 6, 4, 249, 168, 6, 4, 247, 104, 6, - 4, 247, 114, 6, 4, 247, 115, 6, 4, 248, 251, 6, 4, 247, 113, 6, 4, 247, - 118, 6, 4, 247, 119, 6, 4, 252, 189, 6, 4, 247, 116, 6, 4, 242, 130, 6, - 4, 247, 117, 6, 4, 247, 247, 6, 4, 247, 248, 6, 4, 248, 99, 6, 4, 247, - 246, 6, 4, 242, 204, 6, 4, 247, 255, 6, 4, 242, 203, 6, 4, 247, 253, 6, - 4, 247, 254, 6, 4, 249, 218, 6, 4, 247, 252, 6, 4, 247, 250, 6, 4, 247, - 251, 6, 4, 248, 123, 6, 4, 247, 249, 6, 4, 248, 2, 6, 4, 248, 3, 6, 4, - 249, 219, 6, 4, 248, 0, 6, 4, 242, 205, 6, 4, 248, 1, 6, 4, 248, 7, 6, 4, - 248, 8, 6, 4, 253, 103, 6, 4, 248, 5, 6, 4, 242, 206, 6, 4, 248, 6, 6, 4, - 244, 255, 6, 4, 245, 0, 6, 4, 248, 57, 6, 4, 244, 254, 6, 4, 241, 57, 6, - 4, 241, 58, 6, 4, 245, 9, 6, 4, 241, 56, 6, 4, 245, 7, 6, 4, 245, 8, 6, - 4, 248, 125, 6, 4, 245, 6, 6, 4, 245, 2, 6, 4, 245, 3, 6, 4, 248, 88, 6, - 4, 245, 1, 6, 4, 245, 12, 6, 4, 248, 200, 6, 4, 245, 10, 6, 4, 241, 59, - 6, 4, 245, 11, 6, 4, 245, 16, 6, 4, 245, 17, 6, 4, 250, 160, 6, 4, 245, - 14, 6, 4, 241, 60, 6, 4, 245, 15, 6, 4, 247, 35, 6, 4, 248, 96, 6, 4, - 242, 87, 6, 4, 247, 43, 6, 4, 247, 41, 6, 4, 247, 42, 6, 4, 249, 157, 6, - 4, 247, 40, 6, 4, 247, 38, 6, 4, 247, 39, 6, 4, 252, 147, 6, 4, 247, 37, - 6, 4, 247, 46, 6, 4, 247, 47, 6, 4, 252, 148, 6, 4, 247, 44, 6, 4, 242, - 88, 6, 4, 247, 45, 6, 4, 247, 50, 6, 4, 247, 51, 6, 4, 252, 149, 6, 4, - 247, 48, 6, 4, 242, 89, 6, 4, 247, 49, 6, 4, 246, 178, 6, 4, 246, 179, 6, - 4, 249, 123, 6, 4, 246, 177, 6, 4, 246, 184, 6, 4, 252, 37, 6, 4, 246, - 183, 6, 4, 246, 181, 6, 4, 246, 182, 6, 4, 252, 36, 6, 4, 246, 180, 6, 4, - 246, 187, 6, 4, 246, 188, 6, 4, 252, 38, 6, 4, 246, 185, 6, 4, 242, 25, - 6, 4, 246, 186, 6, 4, 246, 191, 6, 4, 246, 192, 6, 4, 252, 39, 6, 4, 246, - 189, 6, 4, 242, 26, 6, 4, 246, 190, 6, 4, 244, 8, 6, 4, 247, 69, 6, 4, - 248, 46, 6, 4, 247, 68, 6, 4, 242, 110, 6, 4, 247, 79, 6, 4, 242, 109, 6, - 4, 247, 77, 6, 4, 247, 78, 6, 4, 248, 110, 6, 4, 244, 13, 6, 4, 247, 71, - 6, 4, 247, 72, 6, 4, 248, 118, 6, 4, 247, 70, 6, 4, 247, 81, 6, 4, 247, - 82, 6, 4, 248, 248, 6, 4, 247, 80, 6, 4, 242, 111, 6, 4, 244, 15, 6, 4, - 247, 85, 6, 4, 247, 86, 6, 4, 249, 163, 6, 4, 247, 83, 6, 4, 242, 112, 6, - 4, 247, 84, 6, 4, 249, 152, 6, 4, 252, 130, 6, 4, 253, 130, 6, 4, 248, - 244, 6, 4, 247, 55, 6, 4, 252, 152, 6, 4, 247, 54, 6, 4, 252, 145, 6, 4, - 252, 146, 6, 4, 253, 160, 6, 4, 252, 144, 6, 4, 252, 135, 6, 4, 253, 194, - 6, 4, 252, 133, 6, 4, 252, 155, 6, 4, 252, 156, 6, 4, 253, 185, 6, 4, - 252, 153, 6, 4, 247, 56, 6, 4, 252, 154, 6, 4, 252, 161, 6, 4, 252, 162, - 6, 4, 254, 125, 6, 4, 252, 159, 6, 4, 247, 58, 6, 4, 252, 160, 6, 4, 251, - 118, 6, 4, 251, 119, 6, 4, 254, 7, 6, 4, 251, 117, 6, 4, 245, 236, 6, 4, - 245, 237, 6, 4, 251, 116, 6, 4, 245, 235, 6, 4, 245, 255, 6, 4, 246, 0, - 6, 4, 251, 126, 6, 4, 245, 254, 6, 4, 248, 115, 6, 4, 251, 124, 6, 4, - 253, 248, 6, 4, 251, 123, 6, 4, 251, 129, 6, 4, 251, 130, 6, 4, 254, 25, - 6, 4, 251, 127, 6, 4, 246, 1, 6, 4, 251, 128, 6, 4, 251, 134, 6, 4, 251, - 135, 6, 4, 254, 181, 6, 4, 251, 132, 6, 4, 246, 2, 6, 4, 251, 133, 6, 4, - 252, 96, 6, 4, 252, 97, 6, 4, 254, 28, 6, 4, 252, 95, 6, 4, 247, 13, 6, - 4, 247, 14, 6, 4, 252, 94, 6, 4, 247, 12, 6, 4, 247, 17, 6, 4, 247, 18, - 6, 4, 249, 149, 6, 4, 247, 16, 6, 4, 249, 148, 6, 4, 252, 102, 6, 4, 254, - 45, 6, 4, 252, 101, 6, 4, 252, 109, 6, 4, 252, 111, 6, 4, 254, 29, 6, 4, - 252, 107, 6, 4, 247, 19, 6, 4, 252, 108, 6, 4, 252, 121, 6, 4, 252, 123, - 6, 4, 254, 234, 6, 4, 252, 119, 6, 4, 247, 25, 6, 4, 252, 120, 6, 4, 245, - 240, 6, 4, 245, 241, 6, 4, 249, 86, 6, 4, 245, 239, 6, 4, 241, 183, 6, 4, - 241, 184, 6, 4, 243, 202, 6, 4, 241, 182, 6, 4, 241, 186, 6, 4, 245, 245, - 6, 4, 241, 185, 6, 4, 245, 243, 6, 4, 245, 244, 6, 4, 249, 87, 6, 4, 245, - 242, 6, 4, 243, 203, 6, 4, 245, 248, 6, 4, 249, 88, 6, 4, 245, 246, 6, 4, - 241, 187, 6, 4, 245, 247, 6, 4, 245, 250, 6, 4, 245, 251, 6, 4, 249, 89, - 6, 4, 245, 249, 6, 4, 246, 159, 6, 4, 246, 160, 6, 4, 252, 26, 6, 4, 246, - 158, 6, 4, 242, 14, 6, 4, 242, 15, 6, 4, 246, 157, 6, 4, 242, 13, 6, 4, - 242, 16, 6, 4, 246, 164, 6, 4, 246, 162, 6, 4, 246, 163, 6, 4, 252, 27, - 6, 4, 246, 161, 6, 4, 246, 167, 6, 4, 252, 28, 6, 4, 246, 165, 6, 4, 242, - 17, 6, 4, 246, 166, 6, 4, 246, 170, 6, 4, 246, 171, 6, 4, 252, 29, 6, 4, - 246, 168, 6, 4, 242, 18, 6, 4, 246, 169, 6, 4, 246, 203, 6, 4, 246, 204, - 6, 4, 248, 178, 6, 4, 243, 237, 6, 4, 242, 29, 6, 4, 242, 30, 6, 4, 246, - 202, 6, 4, 242, 28, 6, 4, 242, 32, 6, 4, 246, 208, 6, 4, 242, 31, 6, 4, - 246, 206, 6, 4, 246, 207, 6, 4, 248, 133, 6, 4, 243, 238, 6, 4, 246, 210, - 6, 4, 246, 211, 6, 4, 249, 125, 6, 4, 246, 209, 6, 4, 253, 45, 6, 4, 253, - 46, 6, 4, 253, 188, 6, 4, 253, 44, 6, 4, 247, 202, 6, 4, 247, 203, 6, 4, - 253, 43, 6, 4, 247, 201, 6, 4, 247, 205, 6, 4, 253, 52, 6, 4, 253, 50, 6, - 4, 253, 51, 6, 4, 254, 133, 6, 4, 253, 48, 6, 4, 253, 62, 6, 4, 253, 64, - 6, 4, 255, 7, 6, 4, 253, 60, 6, 4, 247, 210, 6, 4, 253, 61, 6, 4, 249, - 209, 6, 4, 253, 83, 6, 4, 253, 189, 6, 4, 253, 82, 6, 4, 247, 228, 6, 4, - 247, 229, 6, 4, 253, 80, 6, 4, 247, 227, 6, 4, 247, 240, 6, 4, 247, 241, - 6, 4, 253, 88, 6, 4, 247, 239, 6, 4, 249, 211, 6, 4, 253, 86, 6, 4, 253, - 162, 6, 4, 253, 85, 6, 4, 253, 91, 6, 4, 253, 92, 6, 4, 253, 161, 6, 4, - 253, 89, 6, 4, 247, 242, 6, 4, 253, 90, 6, 4, 253, 95, 6, 4, 253, 96, 6, - 4, 254, 77, 6, 4, 253, 93, 6, 4, 247, 243, 6, 4, 253, 94, 6, 25, 249, - 148, 6, 25, 253, 251, 6, 25, 249, 95, 6, 25, 243, 237, 6, 25, 249, 47, 6, - 25, 248, 249, 6, 25, 243, 180, 6, 25, 249, 69, 6, 25, 253, 180, 6, 25, - 243, 196, 6, 25, 249, 109, 6, 25, 243, 145, 6, 25, 249, 114, 6, 25, 253, - 162, 6, 25, 249, 142, 6, 25, 243, 198, 6, 25, 249, 174, 6, 25, 253, 139, - 6, 25, 249, 222, 6, 25, 249, 48, 6, 25, 243, 163, 6, 25, 249, 35, 6, 25, - 243, 181, 6, 25, 243, 238, 6, 25, 253, 196, 6, 25, 254, 120, 6, 25, 243, - 203, 6, 25, 249, 221, 6, 25, 249, 144, 6, 25, 249, 82, 6, 25, 249, 209, - 6, 25, 249, 197, 6, 25, 249, 163, 6, 25, 249, 193, 6, 25, 253, 163, 6, - 25, 253, 248, 6, 25, 243, 239, 6, 25, 249, 89, 6, 25, 249, 78, 6, 25, - 243, 202, 6, 25, 253, 177, 6, 25, 253, 232, 6, 25, 244, 15, 6, 25, 249, - 105, 6, 25, 254, 85, 6, 25, 243, 157, 6, 25, 249, 40, 6, 25, 243, 197, 6, - 25, 244, 8, 6, 25, 249, 223, 6, 25, 244, 13, 6, 25, 248, 88, 6, 25, 241, - 1, 6, 25, 243, 232, 6, 25, 253, 172, 49, 1, 238, 85, 188, 254, 15, 243, - 243, 49, 1, 238, 85, 188, 248, 122, 243, 243, 49, 1, 238, 85, 188, 254, - 15, 240, 222, 49, 1, 238, 85, 188, 248, 122, 240, 222, 49, 1, 238, 85, - 188, 254, 15, 254, 29, 49, 1, 238, 85, 188, 248, 122, 254, 29, 49, 1, - 238, 85, 188, 254, 15, 253, 185, 49, 1, 238, 85, 188, 248, 122, 253, 185, - 49, 1, 234, 27, 240, 4, 188, 125, 49, 1, 200, 240, 4, 188, 125, 49, 1, - 254, 40, 240, 4, 188, 125, 49, 1, 170, 240, 4, 188, 125, 49, 1, 235, 87, - 240, 4, 188, 125, 49, 1, 234, 27, 240, 4, 235, 64, 188, 125, 49, 1, 200, - 240, 4, 235, 64, 188, 125, 49, 1, 254, 40, 240, 4, 235, 64, 188, 125, 49, - 1, 170, 240, 4, 235, 64, 188, 125, 49, 1, 235, 87, 240, 4, 235, 64, 188, - 125, 49, 1, 234, 27, 235, 64, 188, 125, 49, 1, 200, 235, 64, 188, 125, - 49, 1, 254, 40, 235, 64, 188, 125, 49, 1, 170, 235, 64, 188, 125, 49, 1, - 235, 87, 235, 64, 188, 125, 239, 253, 242, 214, 1, 67, 239, 253, 242, - 214, 1, 71, 239, 253, 242, 214, 21, 236, 10, 239, 253, 242, 214, 1, 79, - 239, 253, 242, 214, 1, 72, 239, 253, 242, 214, 1, 73, 239, 253, 242, 214, - 21, 237, 170, 239, 253, 242, 214, 1, 253, 190, 239, 253, 242, 214, 1, - 248, 220, 239, 253, 242, 214, 1, 253, 234, 239, 253, 242, 214, 1, 249, - 75, 239, 253, 242, 214, 21, 235, 61, 239, 253, 242, 214, 1, 253, 224, - 239, 253, 242, 214, 1, 248, 125, 239, 253, 242, 214, 1, 253, 248, 239, - 253, 242, 214, 1, 251, 114, 239, 253, 242, 214, 1, 249, 6, 239, 253, 242, - 214, 1, 243, 131, 239, 253, 242, 214, 1, 248, 204, 239, 253, 242, 214, 1, - 245, 44, 239, 253, 242, 214, 1, 87, 239, 253, 242, 214, 1, 248, 97, 239, - 253, 242, 214, 1, 253, 225, 239, 253, 242, 214, 1, 250, 193, 239, 253, - 242, 214, 1, 253, 173, 239, 253, 242, 214, 1, 253, 208, 239, 253, 242, - 214, 1, 248, 238, 239, 253, 242, 214, 1, 254, 1, 239, 253, 242, 214, 1, - 250, 120, 239, 253, 242, 214, 1, 253, 181, 239, 253, 242, 214, 1, 253, - 160, 239, 253, 242, 214, 1, 253, 216, 239, 253, 242, 214, 1, 249, 157, - 239, 253, 242, 214, 1, 253, 186, 239, 253, 242, 214, 1, 253, 184, 239, - 253, 242, 214, 33, 21, 67, 239, 253, 242, 214, 33, 21, 71, 239, 253, 242, - 214, 33, 21, 79, 239, 253, 242, 214, 33, 21, 72, 239, 253, 242, 214, 33, - 21, 253, 156, 239, 253, 242, 214, 240, 120, 238, 200, 239, 253, 242, 214, - 240, 120, 238, 201, 239, 253, 242, 214, 240, 120, 239, 127, 239, 253, - 242, 214, 240, 120, 239, 128, 7, 9, 229, 68, 7, 9, 229, 69, 7, 9, 229, - 70, 7, 9, 229, 71, 7, 9, 229, 72, 7, 9, 229, 73, 7, 9, 229, 74, 7, 9, - 229, 75, 7, 9, 229, 76, 7, 9, 229, 77, 7, 9, 229, 78, 7, 9, 229, 79, 7, - 9, 229, 80, 7, 9, 229, 81, 7, 9, 229, 82, 7, 9, 229, 83, 7, 9, 229, 84, - 7, 9, 229, 85, 7, 9, 229, 86, 7, 9, 229, 87, 7, 9, 229, 88, 7, 9, 229, - 89, 7, 9, 229, 90, 7, 9, 229, 91, 7, 9, 229, 92, 7, 9, 229, 93, 7, 9, - 229, 94, 7, 9, 229, 95, 7, 9, 229, 96, 7, 9, 229, 97, 7, 9, 229, 98, 7, - 9, 229, 99, 7, 9, 229, 100, 7, 9, 229, 101, 7, 9, 229, 102, 7, 9, 229, - 103, 7, 9, 229, 104, 7, 9, 229, 105, 7, 9, 229, 106, 7, 9, 229, 107, 7, - 9, 229, 108, 7, 9, 229, 109, 7, 9, 229, 110, 7, 9, 229, 111, 7, 9, 229, - 112, 7, 9, 229, 113, 7, 9, 229, 114, 7, 9, 229, 115, 7, 9, 229, 116, 7, - 9, 229, 117, 7, 9, 229, 118, 7, 9, 229, 119, 7, 9, 229, 120, 7, 9, 229, - 121, 7, 9, 229, 122, 7, 9, 229, 123, 7, 9, 229, 124, 7, 9, 229, 125, 7, - 9, 229, 126, 7, 9, 229, 127, 7, 9, 229, 128, 7, 9, 229, 129, 7, 9, 229, - 130, 7, 9, 229, 131, 7, 9, 229, 132, 7, 9, 229, 133, 7, 9, 229, 134, 7, - 9, 229, 135, 7, 9, 229, 136, 7, 9, 229, 137, 7, 9, 229, 138, 7, 9, 229, - 139, 7, 9, 229, 140, 7, 9, 229, 141, 7, 9, 229, 142, 7, 9, 229, 143, 7, - 9, 229, 144, 7, 9, 229, 145, 7, 9, 229, 146, 7, 9, 229, 147, 7, 9, 229, - 148, 7, 9, 229, 149, 7, 9, 229, 150, 7, 9, 229, 151, 7, 9, 229, 152, 7, - 9, 229, 153, 7, 9, 229, 154, 7, 9, 229, 155, 7, 9, 229, 156, 7, 9, 229, - 157, 7, 9, 229, 158, 7, 9, 229, 159, 7, 9, 229, 160, 7, 9, 229, 161, 7, - 9, 229, 162, 7, 9, 229, 163, 7, 9, 229, 164, 7, 9, 229, 165, 7, 9, 229, - 166, 7, 9, 229, 167, 7, 9, 229, 168, 7, 9, 229, 169, 7, 9, 229, 170, 7, - 9, 229, 171, 7, 9, 229, 172, 7, 9, 229, 173, 7, 9, 229, 174, 7, 9, 229, - 175, 7, 9, 229, 176, 7, 9, 229, 177, 7, 9, 229, 178, 7, 9, 229, 179, 7, - 9, 229, 180, 7, 9, 229, 181, 7, 9, 229, 182, 7, 9, 229, 183, 7, 9, 229, - 184, 7, 9, 229, 185, 7, 9, 229, 186, 7, 9, 229, 187, 7, 9, 229, 188, 7, - 9, 229, 189, 7, 9, 229, 190, 7, 9, 229, 191, 7, 9, 229, 192, 7, 9, 229, - 193, 7, 9, 229, 194, 7, 9, 229, 195, 7, 9, 229, 196, 7, 9, 229, 197, 7, - 9, 229, 198, 7, 9, 229, 199, 7, 9, 229, 200, 7, 9, 229, 201, 7, 9, 229, - 202, 7, 9, 229, 203, 7, 9, 229, 204, 7, 9, 229, 205, 7, 9, 229, 206, 7, - 9, 229, 207, 7, 9, 229, 208, 7, 9, 229, 209, 7, 9, 229, 210, 7, 9, 229, - 211, 7, 9, 229, 212, 7, 9, 229, 213, 7, 9, 229, 214, 7, 9, 229, 215, 7, - 9, 229, 216, 7, 9, 229, 217, 7, 9, 229, 218, 7, 9, 229, 219, 7, 9, 229, - 220, 7, 9, 229, 221, 7, 9, 229, 222, 7, 9, 229, 223, 7, 9, 229, 224, 7, - 9, 229, 225, 7, 9, 229, 226, 7, 9, 229, 227, 7, 9, 229, 228, 7, 9, 229, - 229, 7, 9, 229, 230, 7, 9, 229, 231, 7, 9, 229, 232, 7, 9, 229, 233, 7, - 9, 229, 234, 7, 9, 229, 235, 7, 9, 229, 236, 7, 9, 229, 237, 7, 9, 229, - 238, 7, 9, 229, 239, 7, 9, 229, 240, 7, 9, 229, 241, 7, 9, 229, 242, 7, - 9, 229, 243, 7, 9, 229, 244, 7, 9, 229, 245, 7, 9, 229, 246, 7, 9, 229, - 247, 7, 9, 229, 248, 7, 9, 229, 249, 7, 9, 229, 250, 7, 9, 229, 251, 7, - 9, 229, 252, 7, 9, 229, 253, 7, 9, 229, 254, 7, 9, 229, 255, 7, 9, 230, - 0, 7, 9, 230, 1, 7, 9, 230, 2, 7, 9, 230, 3, 7, 9, 230, 4, 7, 9, 230, 5, - 7, 9, 230, 6, 7, 9, 230, 7, 7, 9, 230, 8, 7, 9, 230, 9, 7, 9, 230, 10, 7, - 9, 230, 11, 7, 9, 230, 12, 7, 9, 230, 13, 7, 9, 230, 14, 7, 9, 230, 15, - 7, 9, 230, 16, 7, 9, 230, 17, 7, 9, 230, 18, 7, 9, 230, 19, 7, 9, 230, - 20, 7, 9, 230, 21, 7, 9, 230, 22, 7, 9, 230, 23, 7, 9, 230, 24, 7, 9, - 230, 25, 7, 9, 230, 26, 7, 9, 230, 27, 7, 9, 230, 28, 7, 9, 230, 29, 7, - 9, 230, 30, 7, 9, 230, 31, 7, 9, 230, 32, 7, 9, 230, 33, 7, 9, 230, 34, - 7, 9, 230, 35, 7, 9, 230, 36, 7, 9, 230, 37, 7, 9, 230, 38, 7, 9, 230, - 39, 7, 9, 230, 40, 7, 9, 230, 41, 7, 9, 230, 42, 7, 9, 230, 43, 7, 9, - 230, 44, 7, 9, 230, 45, 7, 9, 230, 46, 7, 9, 230, 47, 7, 9, 230, 48, 7, - 9, 230, 49, 7, 9, 230, 50, 7, 9, 230, 51, 7, 9, 230, 52, 7, 9, 230, 53, - 7, 9, 230, 54, 7, 9, 230, 55, 7, 9, 230, 56, 7, 9, 230, 57, 7, 9, 230, - 58, 7, 9, 230, 59, 7, 9, 230, 60, 7, 9, 230, 61, 7, 9, 230, 62, 7, 9, - 230, 63, 7, 9, 230, 64, 7, 9, 230, 65, 7, 9, 230, 66, 7, 9, 230, 67, 7, - 9, 230, 68, 7, 9, 230, 69, 7, 9, 230, 70, 7, 9, 230, 71, 7, 9, 230, 72, - 7, 9, 230, 73, 7, 9, 230, 74, 7, 9, 230, 75, 7, 9, 230, 76, 7, 9, 230, - 77, 7, 9, 230, 78, 7, 9, 230, 79, 7, 9, 230, 80, 7, 9, 230, 81, 7, 9, - 230, 82, 7, 9, 230, 83, 7, 9, 230, 84, 7, 9, 230, 85, 7, 9, 230, 86, 7, - 9, 230, 87, 7, 9, 230, 88, 7, 9, 230, 89, 7, 9, 230, 90, 7, 9, 230, 91, - 7, 9, 230, 92, 7, 9, 230, 93, 7, 9, 230, 94, 7, 9, 230, 95, 7, 9, 230, - 96, 7, 9, 230, 97, 7, 9, 230, 98, 7, 9, 230, 99, 7, 9, 230, 100, 7, 9, - 230, 101, 7, 9, 230, 102, 7, 9, 230, 103, 7, 9, 230, 104, 7, 9, 230, 105, - 7, 9, 230, 106, 7, 9, 230, 107, 7, 9, 230, 108, 7, 9, 230, 109, 7, 9, - 230, 110, 7, 9, 230, 111, 7, 9, 230, 112, 7, 9, 230, 113, 7, 9, 230, 114, - 7, 9, 230, 115, 7, 9, 230, 116, 7, 9, 230, 117, 7, 9, 230, 118, 7, 9, - 230, 119, 7, 9, 230, 120, 7, 9, 230, 121, 7, 9, 230, 122, 7, 9, 230, 123, - 7, 9, 230, 124, 7, 9, 230, 125, 7, 9, 230, 126, 7, 9, 230, 127, 7, 9, - 230, 128, 7, 9, 230, 129, 7, 9, 230, 130, 7, 9, 230, 131, 7, 9, 230, 132, - 7, 9, 230, 133, 7, 9, 230, 134, 7, 9, 230, 135, 7, 9, 230, 136, 7, 9, - 230, 137, 7, 9, 230, 138, 7, 9, 230, 139, 7, 9, 230, 140, 7, 9, 230, 141, - 7, 9, 230, 142, 7, 9, 230, 143, 7, 9, 230, 144, 7, 9, 230, 145, 7, 9, - 230, 146, 7, 9, 230, 147, 7, 9, 230, 148, 7, 9, 230, 149, 7, 9, 230, 150, - 7, 9, 230, 151, 7, 9, 230, 152, 7, 9, 230, 153, 7, 9, 230, 154, 7, 9, - 230, 155, 7, 9, 230, 156, 7, 9, 230, 157, 7, 9, 230, 158, 7, 9, 230, 159, - 7, 9, 230, 160, 7, 9, 230, 161, 7, 9, 230, 162, 7, 9, 230, 163, 7, 9, - 230, 164, 7, 9, 230, 165, 7, 9, 230, 166, 7, 9, 230, 167, 7, 9, 230, 168, - 7, 9, 230, 169, 7, 9, 230, 170, 7, 9, 230, 171, 7, 9, 230, 172, 7, 9, - 230, 173, 7, 9, 230, 174, 7, 9, 230, 175, 7, 9, 230, 176, 7, 9, 230, 177, - 7, 9, 230, 178, 7, 9, 230, 179, 7, 9, 230, 180, 7, 9, 230, 181, 7, 9, - 230, 182, 7, 9, 230, 183, 7, 9, 230, 184, 7, 9, 230, 185, 7, 9, 230, 186, - 7, 9, 230, 187, 7, 9, 230, 188, 7, 9, 230, 189, 7, 9, 230, 190, 7, 9, - 230, 191, 7, 9, 230, 192, 7, 9, 230, 193, 7, 9, 230, 194, 7, 9, 230, 195, - 7, 9, 230, 196, 7, 9, 230, 197, 7, 9, 230, 198, 7, 9, 230, 199, 7, 9, - 230, 200, 7, 9, 230, 201, 7, 9, 230, 202, 7, 9, 230, 203, 7, 9, 230, 204, - 7, 9, 230, 205, 7, 9, 230, 206, 7, 9, 230, 207, 7, 9, 230, 208, 7, 9, - 230, 209, 7, 9, 230, 210, 7, 9, 230, 211, 7, 9, 230, 212, 7, 9, 230, 213, - 7, 9, 230, 214, 7, 9, 230, 215, 7, 9, 230, 216, 7, 9, 230, 217, 7, 9, - 230, 218, 7, 9, 230, 219, 7, 9, 230, 220, 7, 9, 230, 221, 7, 9, 230, 222, - 7, 9, 230, 223, 7, 9, 230, 224, 7, 9, 230, 225, 7, 9, 230, 226, 7, 9, - 230, 227, 7, 9, 230, 228, 7, 9, 230, 229, 7, 9, 230, 230, 7, 9, 230, 231, - 7, 9, 230, 232, 7, 9, 230, 233, 7, 9, 230, 234, 7, 9, 230, 235, 7, 9, - 230, 236, 7, 9, 230, 237, 7, 9, 230, 238, 7, 9, 230, 239, 7, 9, 230, 240, - 7, 9, 230, 241, 7, 9, 230, 242, 7, 9, 230, 243, 7, 9, 230, 244, 7, 9, - 230, 245, 7, 9, 230, 246, 7, 9, 230, 247, 7, 9, 230, 248, 7, 9, 230, 249, - 7, 9, 230, 250, 7, 9, 230, 251, 7, 9, 230, 252, 7, 9, 230, 253, 7, 9, - 230, 254, 7, 9, 230, 255, 7, 9, 231, 0, 7, 9, 231, 1, 7, 9, 231, 2, 7, 9, - 231, 3, 7, 9, 231, 4, 7, 9, 231, 5, 7, 9, 231, 6, 7, 9, 231, 7, 7, 9, - 231, 8, 7, 9, 231, 9, 7, 9, 231, 10, 7, 9, 231, 11, 7, 9, 231, 12, 7, 9, - 231, 13, 7, 9, 231, 14, 7, 9, 231, 15, 7, 9, 231, 16, 7, 9, 231, 17, 7, - 9, 231, 18, 7, 9, 231, 19, 7, 9, 231, 20, 7, 9, 231, 21, 7, 9, 231, 22, - 8, 3, 18, 254, 162, 8, 3, 18, 253, 245, 8, 3, 18, 254, 163, 8, 3, 18, - 250, 241, 8, 3, 18, 250, 242, 8, 3, 18, 183, 255, 99, 214, 8, 3, 18, 254, - 242, 100, 3, 18, 254, 39, 248, 175, 100, 3, 18, 254, 39, 248, 208, 100, - 3, 18, 254, 39, 248, 216, 100, 3, 18, 255, 0, 248, 175, 100, 3, 18, 254, - 39, 249, 17, 68, 1, 254, 50, 2, 240, 187, 68, 242, 232, 231, 144, 239, - 241, 68, 18, 238, 126, 254, 50, 254, 50, 240, 118, 68, 1, 233, 68, 243, - 144, 68, 1, 248, 98, 243, 3, 68, 1, 248, 98, 240, 165, 68, 1, 248, 98, - 253, 168, 68, 1, 248, 98, 248, 116, 68, 1, 248, 98, 240, 139, 68, 1, 248, - 98, 30, 248, 166, 68, 1, 248, 98, 243, 253, 68, 1, 248, 98, 249, 175, 68, - 1, 233, 68, 248, 49, 52, 68, 1, 248, 102, 2, 248, 102, 248, 40, 68, 1, - 248, 102, 2, 254, 73, 248, 40, 68, 1, 248, 102, 2, 240, 133, 19, 248, - 102, 248, 40, 68, 1, 248, 102, 2, 240, 133, 19, 254, 73, 248, 40, 68, 1, - 83, 2, 240, 118, 68, 1, 83, 2, 238, 149, 68, 1, 83, 2, 240, 140, 68, 1, - 254, 53, 2, 238, 61, 68, 1, 243, 184, 2, 238, 61, 68, 1, 243, 162, 2, - 238, 61, 68, 1, 255, 76, 2, 240, 140, 68, 1, 254, 76, 2, 238, 61, 68, 1, - 247, 244, 2, 238, 61, 68, 1, 254, 247, 2, 238, 61, 68, 1, 254, 50, 2, - 238, 61, 68, 1, 30, 253, 135, 2, 238, 61, 68, 1, 253, 135, 2, 238, 61, - 68, 1, 246, 38, 2, 238, 61, 68, 1, 254, 201, 2, 238, 61, 68, 1, 254, 114, - 2, 238, 61, 68, 1, 242, 94, 2, 238, 61, 68, 1, 30, 255, 38, 2, 238, 61, - 68, 1, 255, 38, 2, 238, 61, 68, 1, 247, 161, 2, 238, 61, 68, 1, 254, 233, - 2, 238, 61, 68, 1, 252, 134, 2, 238, 61, 68, 1, 248, 102, 2, 238, 61, 68, - 1, 254, 245, 2, 238, 61, 68, 1, 254, 76, 2, 240, 188, 68, 1, 254, 53, 2, - 243, 70, 68, 1, 253, 135, 2, 243, 70, 68, 1, 255, 38, 2, 243, 70, 68, 18, - 83, 240, 139, 11, 1, 83, 244, 49, 39, 13, 11, 1, 83, 244, 49, 30, 13, 11, - 1, 248, 147, 39, 13, 11, 1, 248, 147, 30, 13, 11, 1, 248, 147, 54, 13, - 11, 1, 248, 147, 113, 13, 11, 1, 254, 44, 39, 13, 11, 1, 254, 44, 30, 13, - 11, 1, 254, 44, 54, 13, 11, 1, 254, 44, 113, 13, 11, 1, 243, 52, 39, 13, - 11, 1, 243, 52, 30, 13, 11, 1, 243, 52, 54, 13, 11, 1, 243, 52, 113, 13, - 11, 1, 240, 124, 39, 13, 11, 1, 240, 124, 30, 13, 11, 1, 240, 124, 54, - 13, 11, 1, 240, 124, 113, 13, 11, 1, 243, 75, 39, 13, 11, 1, 243, 75, 30, - 13, 11, 1, 243, 75, 54, 13, 11, 1, 243, 75, 113, 13, 11, 1, 248, 189, 39, - 13, 11, 1, 248, 189, 30, 13, 11, 1, 248, 189, 54, 13, 11, 1, 248, 189, - 113, 13, 11, 1, 254, 47, 39, 13, 11, 1, 254, 47, 30, 13, 11, 1, 254, 47, - 54, 13, 11, 1, 254, 47, 113, 13, 11, 1, 243, 69, 39, 13, 11, 1, 243, 69, - 30, 13, 11, 1, 243, 69, 54, 13, 11, 1, 243, 69, 113, 13, 11, 1, 248, 152, - 39, 13, 11, 1, 248, 152, 30, 13, 11, 1, 248, 152, 54, 13, 11, 1, 248, - 152, 113, 13, 11, 1, 248, 177, 39, 13, 11, 1, 248, 177, 30, 13, 11, 1, - 248, 177, 54, 13, 11, 1, 248, 177, 113, 13, 11, 1, 243, 47, 39, 13, 11, - 1, 243, 47, 30, 13, 11, 1, 243, 47, 54, 13, 11, 1, 243, 47, 113, 13, 11, - 1, 238, 123, 39, 13, 11, 1, 238, 123, 30, 13, 11, 1, 238, 123, 54, 13, - 11, 1, 238, 123, 113, 13, 11, 1, 240, 166, 39, 13, 11, 1, 240, 166, 30, - 13, 11, 1, 243, 161, 39, 13, 11, 1, 243, 161, 30, 13, 11, 1, 254, 87, 39, - 13, 11, 1, 254, 87, 30, 13, 11, 1, 249, 49, 39, 13, 11, 1, 249, 49, 30, - 13, 11, 1, 254, 103, 39, 13, 11, 1, 254, 103, 30, 13, 11, 1, 249, 156, - 39, 13, 11, 1, 249, 156, 30, 13, 11, 1, 243, 21, 39, 13, 11, 1, 243, 21, - 30, 13, 11, 1, 243, 21, 54, 13, 11, 1, 243, 21, 113, 13, 11, 1, 253, 246, - 39, 13, 11, 1, 253, 246, 30, 13, 11, 1, 253, 246, 54, 13, 11, 1, 253, - 246, 113, 13, 11, 1, 248, 159, 39, 13, 11, 1, 248, 159, 30, 13, 11, 1, - 248, 159, 54, 13, 11, 1, 248, 159, 113, 13, 11, 1, 243, 67, 39, 13, 11, - 1, 243, 67, 30, 13, 11, 1, 243, 67, 54, 13, 11, 1, 243, 67, 113, 13, 11, - 1, 198, 240, 182, 39, 13, 11, 1, 198, 240, 182, 30, 13, 11, 1, 243, 71, - 39, 13, 11, 1, 243, 71, 30, 13, 11, 1, 243, 71, 54, 13, 11, 1, 243, 71, - 113, 13, 11, 1, 253, 124, 2, 57, 60, 39, 13, 11, 1, 253, 124, 2, 57, 60, - 30, 13, 11, 1, 253, 124, 248, 128, 39, 13, 11, 1, 253, 124, 248, 128, 30, - 13, 11, 1, 253, 124, 248, 128, 54, 13, 11, 1, 253, 124, 248, 128, 113, - 13, 11, 1, 253, 124, 233, 65, 39, 13, 11, 1, 253, 124, 233, 65, 30, 13, - 11, 1, 253, 124, 233, 65, 54, 13, 11, 1, 253, 124, 233, 65, 113, 13, 11, - 1, 57, 240, 92, 39, 13, 11, 1, 57, 240, 92, 30, 13, 11, 1, 57, 240, 92, - 2, 143, 60, 39, 13, 11, 1, 57, 240, 92, 2, 143, 60, 30, 13, 11, 1, 255, - 44, 39, 13, 11, 1, 255, 44, 30, 13, 11, 1, 255, 44, 54, 13, 11, 1, 255, - 44, 113, 13, 11, 1, 132, 39, 13, 11, 1, 132, 30, 13, 11, 1, 255, 33, 39, - 13, 11, 1, 255, 33, 30, 13, 11, 1, 255, 36, 39, 13, 11, 1, 255, 36, 30, - 13, 11, 1, 132, 2, 143, 60, 39, 13, 11, 1, 255, 65, 39, 13, 11, 1, 255, - 65, 30, 13, 11, 1, 238, 73, 255, 33, 39, 13, 11, 1, 238, 73, 255, 33, 30, - 13, 11, 1, 238, 73, 255, 36, 39, 13, 11, 1, 238, 73, 255, 36, 30, 13, 11, - 1, 157, 39, 13, 11, 1, 157, 30, 13, 11, 1, 157, 54, 13, 11, 1, 157, 113, - 13, 11, 1, 240, 104, 240, 192, 238, 73, 83, 150, 54, 13, 11, 1, 240, 104, - 240, 192, 238, 73, 83, 150, 113, 13, 11, 18, 57, 2, 143, 60, 2, 83, 39, - 13, 11, 18, 57, 2, 143, 60, 2, 83, 30, 13, 11, 18, 57, 2, 143, 60, 2, - 255, 30, 39, 13, 11, 18, 57, 2, 143, 60, 2, 255, 30, 30, 13, 11, 18, 57, - 2, 143, 60, 2, 253, 220, 39, 13, 11, 18, 57, 2, 143, 60, 2, 253, 220, 30, - 13, 11, 18, 57, 2, 143, 60, 2, 132, 39, 13, 11, 18, 57, 2, 143, 60, 2, - 132, 30, 13, 11, 18, 57, 2, 143, 60, 2, 255, 33, 39, 13, 11, 18, 57, 2, - 143, 60, 2, 255, 33, 30, 13, 11, 18, 57, 2, 143, 60, 2, 255, 36, 39, 13, - 11, 18, 57, 2, 143, 60, 2, 255, 36, 30, 13, 11, 18, 57, 2, 143, 60, 2, - 157, 39, 13, 11, 18, 57, 2, 143, 60, 2, 157, 30, 13, 11, 18, 57, 2, 143, - 60, 2, 157, 54, 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, - 150, 39, 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, 150, 30, - 13, 11, 18, 240, 104, 238, 73, 57, 2, 143, 60, 2, 83, 150, 54, 13, 11, 1, - 243, 26, 57, 39, 13, 11, 1, 243, 26, 57, 30, 13, 11, 1, 243, 26, 57, 54, - 13, 11, 1, 243, 26, 57, 113, 13, 11, 18, 57, 2, 143, 60, 2, 103, 39, 13, + 72, 105, 1, 72, 105, 1, 3, 73, 105, 1, 73, 105, 1, 201, 105, 1, 247, 208, + 105, 1, 240, 168, 105, 1, 247, 96, 105, 1, 240, 92, 105, 1, 247, 32, 105, + 1, 240, 219, 105, 1, 247, 173, 105, 1, 240, 127, 105, 1, 247, 72, 105, 1, + 234, 8, 105, 1, 227, 102, 105, 1, 232, 51, 105, 1, 227, 41, 105, 1, 231, + 62, 105, 1, 227, 19, 105, 1, 233, 203, 105, 1, 227, 86, 105, 1, 231, 216, + 105, 1, 227, 27, 105, 1, 230, 182, 105, 1, 251, 102, 105, 1, 230, 15, + 105, 1, 250, 202, 105, 1, 3, 229, 106, 105, 1, 229, 106, 105, 1, 249, 70, + 105, 1, 230, 131, 105, 1, 251, 2, 105, 1, 87, 105, 1, 250, 116, 105, 1, + 238, 91, 105, 1, 237, 209, 105, 1, 237, 83, 105, 1, 238, 9, 105, 1, 237, + 138, 105, 1, 219, 105, 1, 253, 166, 105, 1, 236, 142, 105, 1, 246, 169, + 105, 1, 253, 43, 105, 1, 236, 8, 105, 1, 246, 37, 105, 1, 252, 217, 105, + 1, 235, 124, 105, 1, 246, 210, 105, 1, 253, 91, 105, 1, 236, 80, 105, 1, + 246, 67, 105, 1, 253, 4, 105, 1, 235, 207, 105, 1, 222, 105, 1, 238, 226, + 105, 1, 238, 141, 105, 1, 239, 40, 105, 1, 238, 175, 105, 1, 3, 216, 105, + 1, 216, 105, 1, 3, 227, 142, 105, 1, 227, 142, 105, 1, 3, 227, 167, 105, + 1, 227, 167, 105, 1, 234, 236, 105, 1, 234, 145, 105, 1, 234, 43, 105, 1, + 234, 203, 105, 1, 234, 91, 105, 1, 3, 228, 143, 105, 1, 228, 143, 105, 1, + 228, 92, 105, 1, 228, 112, 105, 1, 228, 82, 105, 1, 197, 105, 1, 228, + 159, 105, 1, 3, 201, 105, 1, 3, 240, 219, 50, 240, 232, 228, 171, 231, + 202, 69, 50, 240, 232, 232, 181, 231, 202, 69, 240, 232, 228, 171, 231, + 202, 69, 240, 232, 232, 181, 231, 202, 69, 105, 241, 119, 69, 105, 228, + 171, 241, 119, 69, 105, 250, 167, 227, 154, 240, 232, 45, 245, 248, 42, + 1, 3, 67, 42, 1, 67, 42, 1, 3, 71, 42, 1, 71, 42, 1, 3, 79, 42, 1, 79, + 42, 1, 3, 72, 42, 1, 72, 42, 1, 3, 73, 42, 1, 73, 42, 1, 201, 42, 1, 247, + 208, 42, 1, 240, 168, 42, 1, 247, 96, 42, 1, 240, 92, 42, 1, 247, 32, 42, + 1, 240, 219, 42, 1, 247, 173, 42, 1, 240, 127, 42, 1, 247, 72, 42, 1, + 234, 8, 42, 1, 227, 102, 42, 1, 232, 51, 42, 1, 227, 41, 42, 1, 231, 62, + 42, 1, 227, 19, 42, 1, 233, 203, 42, 1, 227, 86, 42, 1, 231, 216, 42, 1, + 227, 27, 42, 1, 230, 182, 42, 1, 251, 102, 42, 1, 230, 15, 42, 1, 250, + 202, 42, 1, 3, 229, 106, 42, 1, 229, 106, 42, 1, 249, 70, 42, 1, 230, + 131, 42, 1, 251, 2, 42, 1, 87, 42, 1, 250, 116, 42, 1, 238, 91, 42, 1, + 237, 209, 42, 1, 237, 83, 42, 1, 238, 9, 42, 1, 237, 138, 42, 1, 219, 42, + 1, 253, 166, 42, 1, 236, 142, 42, 1, 246, 169, 42, 1, 253, 43, 42, 1, + 236, 8, 42, 1, 246, 37, 42, 1, 252, 217, 42, 1, 235, 124, 42, 1, 246, + 210, 42, 1, 253, 91, 42, 1, 236, 80, 42, 1, 246, 67, 42, 1, 253, 4, 42, + 1, 235, 207, 42, 1, 222, 42, 1, 238, 226, 42, 1, 238, 141, 42, 1, 239, + 40, 42, 1, 238, 175, 42, 1, 3, 216, 42, 1, 216, 42, 1, 3, 227, 142, 42, + 1, 227, 142, 42, 1, 3, 227, 167, 42, 1, 227, 167, 42, 1, 234, 236, 42, 1, + 234, 145, 42, 1, 234, 43, 42, 1, 234, 203, 42, 1, 234, 91, 42, 1, 3, 228, + 143, 42, 1, 228, 143, 42, 1, 228, 92, 42, 1, 228, 112, 42, 1, 228, 82, + 42, 1, 197, 42, 1, 228, 159, 42, 1, 3, 201, 42, 1, 3, 240, 219, 42, 1, + 228, 233, 42, 1, 228, 193, 42, 1, 228, 212, 42, 1, 228, 173, 42, 238, + 223, 250, 100, 240, 232, 235, 145, 231, 202, 69, 42, 241, 119, 69, 42, + 228, 171, 241, 119, 69, 42, 250, 167, 240, 106, 155, 1, 217, 155, 1, 223, + 155, 1, 173, 155, 1, 248, 140, 155, 1, 209, 155, 1, 214, 155, 1, 197, + 155, 1, 162, 155, 1, 210, 155, 1, 241, 12, 155, 1, 192, 155, 1, 221, 155, + 1, 235, 93, 155, 1, 206, 155, 1, 227, 77, 155, 1, 252, 97, 155, 1, 232, + 148, 155, 1, 144, 155, 1, 227, 103, 155, 1, 252, 178, 155, 1, 193, 155, + 1, 67, 155, 1, 73, 155, 1, 72, 155, 1, 249, 15, 155, 1, 255, 55, 155, 1, + 249, 13, 155, 1, 254, 144, 155, 1, 236, 167, 155, 1, 255, 8, 155, 1, 248, + 234, 155, 1, 255, 2, 155, 1, 248, 224, 155, 1, 248, 196, 155, 1, 71, 155, + 1, 79, 155, 1, 241, 118, 155, 1, 179, 155, 1, 237, 244, 155, 1, 247, 76, + 23, 1, 240, 149, 23, 1, 231, 157, 23, 1, 240, 147, 23, 1, 237, 203, 23, + 1, 237, 202, 23, 1, 237, 201, 23, 1, 230, 4, 23, 1, 231, 152, 23, 1, 234, + 140, 23, 1, 234, 136, 23, 1, 234, 134, 23, 1, 234, 128, 23, 1, 234, 125, + 23, 1, 234, 123, 23, 1, 234, 129, 23, 1, 234, 139, 23, 1, 238, 218, 23, + 1, 235, 255, 23, 1, 231, 155, 23, 1, 235, 247, 23, 1, 232, 24, 23, 1, + 231, 153, 23, 1, 241, 226, 23, 1, 252, 11, 23, 1, 231, 160, 23, 1, 252, + 61, 23, 1, 240, 177, 23, 1, 230, 55, 23, 1, 236, 23, 23, 1, 246, 164, 23, + 1, 67, 23, 1, 255, 75, 23, 1, 216, 23, 1, 227, 248, 23, 1, 248, 213, 23, + 1, 72, 23, 1, 227, 204, 23, 1, 227, 211, 23, 1, 73, 23, 1, 228, 143, 23, + 1, 228, 140, 23, 1, 236, 234, 23, 1, 227, 167, 23, 1, 79, 23, 1, 228, + 106, 23, 1, 228, 112, 23, 1, 228, 92, 23, 1, 227, 142, 23, 1, 248, 171, + 23, 1, 227, 186, 23, 1, 71, 23, 248, 63, 23, 1, 231, 156, 23, 1, 237, + 195, 23, 1, 237, 197, 23, 1, 237, 199, 23, 1, 234, 135, 23, 1, 234, 122, + 23, 1, 234, 126, 23, 1, 234, 130, 23, 1, 234, 120, 23, 1, 238, 213, 23, + 1, 238, 211, 23, 1, 238, 214, 23, 1, 240, 244, 23, 1, 235, 251, 23, 1, + 235, 240, 23, 1, 235, 245, 23, 1, 235, 243, 23, 1, 235, 253, 23, 1, 235, + 241, 23, 1, 240, 242, 23, 1, 240, 240, 23, 1, 232, 18, 23, 1, 232, 16, + 23, 1, 232, 9, 23, 1, 232, 14, 23, 1, 232, 22, 23, 1, 236, 123, 23, 1, + 231, 158, 23, 1, 227, 196, 23, 1, 227, 194, 23, 1, 227, 195, 23, 1, 240, + 243, 23, 1, 231, 159, 23, 1, 227, 201, 23, 1, 227, 164, 23, 1, 227, 163, + 23, 1, 227, 166, 23, 1, 227, 135, 23, 1, 227, 136, 23, 1, 227, 138, 23, + 1, 254, 208, 23, 1, 254, 204, 80, 254, 250, 239, 185, 69, 80, 254, 250, + 234, 158, 69, 80, 254, 250, 236, 210, 69, 80, 254, 250, 171, 69, 80, 254, + 250, 204, 69, 80, 254, 250, 248, 0, 69, 80, 254, 250, 229, 208, 69, 80, + 254, 250, 238, 223, 69, 80, 254, 250, 252, 250, 69, 80, 254, 250, 248, + 56, 69, 80, 254, 250, 233, 199, 69, 80, 254, 250, 230, 51, 69, 80, 254, + 250, 247, 250, 69, 80, 254, 250, 246, 202, 69, 80, 254, 250, 249, 33, 69, + 80, 254, 250, 239, 82, 69, 155, 1, 252, 217, 155, 1, 227, 41, 155, 1, + 241, 86, 155, 1, 247, 32, 155, 1, 249, 22, 155, 1, 248, 222, 155, 1, 236, + 202, 155, 1, 236, 205, 155, 1, 241, 133, 155, 1, 254, 251, 155, 1, 241, + 170, 155, 1, 229, 5, 155, 1, 241, 203, 155, 1, 237, 230, 155, 1, 255, 50, + 155, 1, 254, 140, 155, 1, 255, 15, 155, 1, 236, 218, 155, 1, 236, 207, + 155, 1, 241, 167, 155, 30, 1, 223, 155, 30, 1, 214, 155, 30, 1, 241, 12, + 155, 30, 1, 192, 7, 231, 79, 214, 7, 231, 79, 228, 101, 7, 231, 79, 228, + 47, 7, 231, 79, 252, 190, 7, 231, 79, 231, 13, 7, 231, 79, 245, 238, 7, + 231, 79, 245, 242, 7, 231, 79, 246, 41, 7, 231, 79, 245, 239, 7, 231, 79, + 230, 184, 7, 231, 79, 245, 241, 7, 231, 79, 245, 237, 7, 231, 79, 246, + 39, 7, 231, 79, 245, 240, 7, 231, 79, 245, 236, 7, 231, 79, 197, 42, 1, + 3, 240, 92, 42, 1, 3, 232, 51, 42, 1, 3, 231, 62, 42, 1, 3, 87, 42, 1, 3, + 237, 83, 42, 1, 3, 219, 42, 1, 3, 246, 169, 42, 1, 3, 246, 37, 42, 1, 3, + 246, 210, 42, 1, 3, 246, 67, 42, 1, 3, 238, 141, 42, 1, 3, 234, 236, 42, + 1, 3, 234, 145, 42, 1, 3, 234, 43, 42, 1, 3, 234, 203, 42, 1, 3, 234, 91, + 82, 23, 240, 149, 82, 23, 237, 203, 82, 23, 230, 4, 82, 23, 234, 140, 82, + 23, 238, 218, 82, 23, 235, 255, 82, 23, 232, 24, 82, 23, 241, 226, 82, + 23, 252, 11, 82, 23, 252, 61, 82, 23, 240, 177, 82, 23, 230, 55, 82, 23, + 236, 23, 82, 23, 246, 164, 82, 23, 240, 150, 67, 82, 23, 237, 204, 67, + 82, 23, 230, 5, 67, 82, 23, 234, 141, 67, 82, 23, 238, 219, 67, 82, 23, + 236, 0, 67, 82, 23, 232, 25, 67, 82, 23, 241, 227, 67, 82, 23, 252, 12, + 67, 82, 23, 252, 62, 67, 82, 23, 240, 178, 67, 82, 23, 230, 56, 67, 82, + 23, 236, 24, 67, 82, 23, 246, 165, 67, 82, 23, 252, 12, 79, 82, 240, 110, + 99, 236, 224, 82, 240, 110, 99, 117, 246, 37, 82, 110, 127, 82, 110, 111, + 82, 110, 166, 82, 110, 177, 82, 110, 176, 82, 110, 187, 82, 110, 203, 82, + 110, 195, 82, 110, 202, 82, 110, 230, 112, 82, 110, 238, 159, 82, 110, + 248, 57, 82, 110, 228, 122, 82, 110, 228, 76, 82, 110, 239, 5, 82, 110, + 249, 32, 82, 110, 231, 35, 82, 110, 231, 95, 82, 110, 246, 216, 82, 110, + 231, 214, 82, 110, 238, 78, 82, 110, 231, 188, 82, 110, 248, 62, 82, 110, + 251, 201, 82, 110, 240, 35, 82, 110, 234, 172, 82, 110, 252, 168, 82, + 110, 231, 65, 82, 110, 231, 25, 82, 110, 248, 216, 82, 110, 234, 166, 82, + 110, 255, 26, 82, 110, 248, 86, 82, 110, 234, 164, 82, 110, 232, 182, 82, + 110, 234, 202, 236, 100, 52, 29, 61, 229, 80, 127, 29, 61, 229, 80, 111, + 29, 61, 229, 80, 166, 29, 61, 229, 80, 177, 29, 61, 229, 80, 176, 29, 61, + 229, 80, 187, 29, 61, 229, 80, 203, 29, 61, 229, 80, 195, 29, 61, 229, + 80, 202, 29, 61, 230, 44, 29, 61, 230, 45, 127, 29, 61, 230, 45, 111, 29, + 61, 230, 45, 166, 29, 61, 230, 45, 177, 29, 61, 230, 45, 176, 29, 23, + 240, 149, 29, 23, 237, 203, 29, 23, 230, 4, 29, 23, 234, 140, 29, 23, + 238, 218, 29, 23, 235, 255, 29, 23, 232, 24, 29, 23, 241, 226, 29, 23, + 252, 11, 29, 23, 252, 61, 29, 23, 240, 177, 29, 23, 230, 55, 29, 23, 236, + 23, 29, 23, 246, 164, 29, 23, 240, 150, 67, 29, 23, 237, 204, 67, 29, 23, + 230, 5, 67, 29, 23, 234, 141, 67, 29, 23, 238, 219, 67, 29, 23, 236, 0, + 67, 29, 23, 232, 25, 67, 29, 23, 241, 227, 67, 29, 23, 252, 12, 67, 29, + 23, 252, 62, 67, 29, 23, 240, 178, 67, 29, 23, 230, 56, 67, 29, 23, 236, + 24, 67, 29, 23, 246, 165, 67, 29, 240, 110, 99, 252, 89, 29, 240, 110, + 99, 241, 33, 29, 23, 241, 227, 79, 240, 110, 231, 115, 91, 29, 110, 127, + 29, 110, 111, 29, 110, 166, 29, 110, 177, 29, 110, 176, 29, 110, 187, 29, + 110, 203, 29, 110, 195, 29, 110, 202, 29, 110, 230, 112, 29, 110, 238, + 159, 29, 110, 248, 57, 29, 110, 228, 122, 29, 110, 228, 76, 29, 110, 239, + 5, 29, 110, 249, 32, 29, 110, 231, 35, 29, 110, 231, 95, 29, 110, 246, + 216, 29, 110, 231, 214, 29, 110, 238, 78, 29, 110, 231, 188, 29, 110, + 248, 62, 29, 110, 251, 201, 29, 110, 240, 35, 29, 110, 233, 197, 29, 110, + 239, 84, 29, 110, 248, 93, 29, 110, 231, 42, 29, 110, 248, 158, 29, 110, + 235, 154, 29, 110, 254, 148, 29, 110, 241, 120, 29, 110, 234, 164, 29, + 110, 251, 177, 29, 110, 251, 168, 29, 110, 246, 158, 29, 110, 252, 107, + 29, 110, 239, 141, 29, 110, 239, 248, 29, 110, 225, 29, 110, 239, 34, 29, + 110, 234, 180, 29, 110, 231, 65, 29, 110, 231, 25, 29, 110, 248, 216, 29, + 110, 234, 166, 29, 110, 255, 26, 29, 110, 237, 192, 29, 61, 230, 45, 187, + 29, 61, 230, 45, 203, 29, 61, 230, 45, 195, 29, 61, 230, 45, 202, 29, 61, + 248, 2, 29, 61, 248, 3, 127, 29, 61, 248, 3, 111, 29, 61, 248, 3, 166, + 29, 61, 248, 3, 177, 29, 61, 248, 3, 176, 29, 61, 248, 3, 187, 29, 61, + 248, 3, 203, 29, 61, 248, 3, 195, 29, 61, 248, 3, 202, 29, 61, 248, 74, + 80, 145, 12, 28, 241, 103, 80, 145, 12, 28, 248, 103, 80, 145, 12, 28, + 239, 67, 80, 145, 12, 28, 254, 214, 80, 145, 12, 28, 239, 47, 80, 145, + 12, 28, 241, 31, 80, 145, 12, 28, 241, 32, 80, 145, 12, 28, 254, 141, 80, + 145, 12, 28, 232, 165, 80, 145, 12, 28, 236, 236, 80, 145, 12, 28, 237, + 110, 80, 145, 12, 28, 250, 253, 31, 246, 178, 31, 248, 193, 31, 248, 165, + 239, 195, 239, 208, 52, 29, 42, 67, 29, 42, 71, 29, 42, 79, 29, 42, 72, + 29, 42, 73, 29, 42, 201, 29, 42, 240, 168, 29, 42, 240, 92, 29, 42, 240, + 219, 29, 42, 240, 127, 29, 42, 234, 8, 29, 42, 232, 51, 29, 42, 231, 62, + 29, 42, 233, 203, 29, 42, 231, 216, 29, 42, 230, 182, 29, 42, 230, 15, + 29, 42, 229, 106, 29, 42, 230, 131, 29, 42, 87, 29, 42, 238, 91, 29, 42, + 237, 209, 29, 42, 237, 83, 29, 42, 238, 9, 29, 42, 237, 138, 29, 42, 219, + 29, 42, 246, 169, 29, 42, 246, 37, 29, 42, 246, 210, 29, 42, 246, 67, 29, + 42, 222, 29, 42, 238, 226, 29, 42, 238, 141, 29, 42, 239, 40, 29, 42, + 238, 175, 29, 42, 216, 29, 42, 227, 142, 29, 42, 227, 167, 29, 42, 234, + 236, 29, 42, 234, 145, 29, 42, 234, 43, 29, 42, 234, 203, 29, 42, 234, + 91, 29, 42, 228, 143, 29, 42, 228, 92, 29, 42, 228, 112, 29, 42, 228, 82, + 31, 254, 233, 31, 254, 169, 31, 254, 246, 31, 255, 101, 31, 241, 171, 31, + 241, 145, 31, 229, 3, 31, 248, 180, 31, 249, 20, 31, 236, 204, 31, 236, + 200, 31, 241, 1, 31, 240, 239, 31, 240, 238, 31, 247, 187, 31, 247, 192, + 31, 247, 90, 31, 247, 86, 31, 240, 45, 31, 247, 84, 31, 240, 156, 31, + 240, 155, 31, 240, 154, 31, 240, 153, 31, 247, 20, 31, 247, 19, 31, 240, + 83, 31, 240, 85, 31, 240, 216, 31, 240, 108, 31, 240, 114, 31, 233, 252, + 31, 233, 234, 31, 232, 7, 31, 232, 170, 31, 232, 169, 31, 251, 99, 31, + 250, 216, 31, 250, 101, 31, 229, 220, 31, 238, 74, 31, 237, 111, 31, 246, + 239, 31, 236, 138, 31, 236, 137, 31, 253, 164, 31, 236, 5, 31, 235, 234, + 31, 235, 235, 31, 253, 25, 31, 246, 36, 31, 246, 35, 31, 252, 199, 31, + 246, 25, 31, 246, 193, 31, 236, 40, 31, 236, 62, 31, 246, 182, 31, 236, + 60, 31, 236, 72, 31, 253, 82, 31, 235, 197, 31, 252, 252, 31, 246, 60, + 31, 235, 193, 31, 246, 56, 31, 246, 57, 31, 239, 93, 31, 239, 90, 31, + 239, 96, 31, 239, 57, 31, 239, 76, 31, 238, 203, 31, 238, 186, 31, 238, + 185, 31, 239, 26, 31, 239, 24, 31, 239, 27, 31, 228, 2, 31, 228, 0, 31, + 227, 134, 31, 234, 101, 31, 234, 105, 31, 234, 29, 31, 234, 24, 31, 234, + 179, 31, 234, 178, 31, 228, 121, 80, 145, 12, 28, 246, 45, 227, 80, 80, + 145, 12, 28, 246, 45, 127, 80, 145, 12, 28, 246, 45, 111, 80, 145, 12, + 28, 246, 45, 166, 80, 145, 12, 28, 246, 45, 177, 80, 145, 12, 28, 246, + 45, 176, 80, 145, 12, 28, 246, 45, 187, 80, 145, 12, 28, 246, 45, 203, + 80, 145, 12, 28, 246, 45, 195, 80, 145, 12, 28, 246, 45, 202, 80, 145, + 12, 28, 246, 45, 230, 112, 80, 145, 12, 28, 246, 45, 248, 245, 80, 145, + 12, 28, 246, 45, 229, 81, 80, 145, 12, 28, 246, 45, 230, 46, 80, 145, 12, + 28, 246, 45, 247, 251, 80, 145, 12, 28, 246, 45, 248, 78, 80, 145, 12, + 28, 246, 45, 232, 0, 80, 145, 12, 28, 246, 45, 232, 156, 80, 145, 12, 28, + 246, 45, 249, 9, 80, 145, 12, 28, 246, 45, 237, 186, 80, 145, 12, 28, + 246, 45, 229, 79, 80, 145, 12, 28, 246, 45, 229, 73, 80, 145, 12, 28, + 246, 45, 229, 69, 80, 145, 12, 28, 246, 45, 229, 70, 80, 145, 12, 28, + 246, 45, 229, 75, 31, 246, 40, 31, 251, 102, 31, 254, 144, 31, 125, 31, + 236, 160, 31, 236, 82, 31, 250, 118, 31, 250, 119, 231, 169, 31, 250, + 119, 251, 142, 31, 241, 118, 31, 248, 195, 238, 79, 246, 194, 31, 248, + 195, 238, 79, 230, 200, 31, 248, 195, 238, 79, 230, 165, 31, 248, 195, + 238, 79, 239, 23, 31, 251, 170, 31, 236, 143, 255, 10, 31, 238, 91, 31, + 238, 142, 67, 31, 222, 31, 201, 31, 240, 221, 31, 239, 44, 31, 247, 177, + 31, 252, 170, 31, 240, 220, 31, 236, 35, 31, 237, 246, 31, 238, 142, 248, + 140, 31, 238, 142, 210, 31, 238, 253, 31, 240, 196, 31, 245, 243, 31, + 240, 169, 31, 238, 228, 31, 247, 98, 31, 230, 16, 31, 238, 142, 162, 31, + 238, 181, 31, 250, 126, 31, 240, 137, 31, 248, 23, 31, 237, 151, 31, 238, + 142, 173, 31, 238, 179, 31, 251, 227, 31, 240, 132, 31, 238, 180, 231, + 169, 31, 251, 228, 231, 169, 31, 239, 105, 231, 169, 31, 240, 133, 231, + 169, 31, 238, 180, 251, 142, 31, 251, 228, 251, 142, 31, 239, 105, 251, + 142, 31, 240, 133, 251, 142, 31, 239, 105, 236, 159, 193, 31, 239, 105, + 236, 159, 234, 11, 231, 169, 31, 236, 142, 31, 240, 103, 31, 238, 144, + 31, 247, 56, 31, 234, 230, 31, 234, 231, 236, 159, 193, 31, 234, 231, + 236, 159, 234, 11, 231, 169, 31, 235, 135, 31, 237, 84, 31, 238, 142, + 193, 31, 238, 143, 31, 235, 110, 31, 237, 62, 31, 238, 142, 179, 31, 238, + 111, 31, 240, 77, 31, 238, 112, 239, 26, 31, 235, 109, 31, 237, 61, 31, + 238, 142, 228, 144, 31, 238, 109, 31, 240, 75, 31, 238, 110, 239, 26, 31, + 241, 13, 236, 227, 31, 239, 105, 236, 227, 31, 255, 15, 31, 252, 241, 31, + 252, 135, 31, 252, 120, 31, 252, 179, 236, 159, 240, 196, 31, 251, 226, + 31, 251, 42, 31, 247, 9, 31, 219, 31, 246, 41, 31, 241, 192, 31, 240, + 144, 31, 240, 133, 252, 155, 31, 240, 94, 31, 239, 170, 31, 239, 169, 31, + 239, 163, 31, 239, 115, 31, 239, 45, 231, 231, 31, 238, 202, 31, 238, + 168, 31, 236, 34, 31, 235, 210, 31, 235, 179, 31, 235, 178, 31, 231, 164, + 31, 231, 14, 31, 228, 113, 31, 228, 234, 236, 159, 173, 31, 134, 236, + 159, 173, 80, 145, 12, 28, 251, 45, 127, 80, 145, 12, 28, 251, 45, 111, + 80, 145, 12, 28, 251, 45, 166, 80, 145, 12, 28, 251, 45, 177, 80, 145, + 12, 28, 251, 45, 176, 80, 145, 12, 28, 251, 45, 187, 80, 145, 12, 28, + 251, 45, 203, 80, 145, 12, 28, 251, 45, 195, 80, 145, 12, 28, 251, 45, + 202, 80, 145, 12, 28, 251, 45, 230, 112, 80, 145, 12, 28, 251, 45, 248, + 245, 80, 145, 12, 28, 251, 45, 229, 81, 80, 145, 12, 28, 251, 45, 230, + 46, 80, 145, 12, 28, 251, 45, 247, 251, 80, 145, 12, 28, 251, 45, 248, + 78, 80, 145, 12, 28, 251, 45, 232, 0, 80, 145, 12, 28, 251, 45, 232, 156, + 80, 145, 12, 28, 251, 45, 249, 9, 80, 145, 12, 28, 251, 45, 237, 186, 80, + 145, 12, 28, 251, 45, 229, 79, 80, 145, 12, 28, 251, 45, 229, 73, 80, + 145, 12, 28, 251, 45, 229, 69, 80, 145, 12, 28, 251, 45, 229, 70, 80, + 145, 12, 28, 251, 45, 229, 75, 80, 145, 12, 28, 251, 45, 229, 76, 80, + 145, 12, 28, 251, 45, 229, 71, 80, 145, 12, 28, 251, 45, 229, 72, 80, + 145, 12, 28, 251, 45, 229, 78, 80, 145, 12, 28, 251, 45, 229, 74, 80, + 145, 12, 28, 251, 45, 230, 44, 80, 145, 12, 28, 251, 45, 230, 43, 31, + 247, 200, 156, 28, 230, 77, 251, 160, 246, 201, 156, 28, 230, 77, 234, + 200, 249, 32, 156, 28, 250, 177, 254, 154, 230, 77, 253, 79, 156, 28, + 227, 152, 248, 19, 156, 28, 228, 138, 156, 28, 251, 202, 156, 28, 230, + 77, 254, 184, 156, 28, 246, 63, 229, 221, 156, 28, 3, 230, 158, 156, 28, + 229, 191, 156, 28, 236, 78, 156, 28, 231, 114, 156, 28, 248, 95, 156, 28, + 247, 45, 235, 186, 156, 28, 238, 171, 156, 28, 248, 215, 156, 28, 248, + 20, 156, 28, 228, 70, 236, 212, 230, 77, 250, 254, 156, 28, 254, 218, + 156, 28, 251, 188, 156, 28, 253, 20, 230, 25, 156, 28, 247, 54, 156, 28, + 231, 180, 254, 232, 156, 28, 234, 159, 156, 28, 241, 166, 156, 28, 247, + 45, 230, 158, 156, 28, 238, 148, 251, 172, 156, 28, 247, 45, 235, 161, + 156, 28, 230, 77, 255, 94, 228, 122, 156, 28, 230, 77, 251, 243, 248, 57, + 156, 28, 241, 178, 156, 28, 249, 63, 156, 28, 234, 162, 156, 28, 247, 45, + 235, 181, 156, 28, 235, 149, 156, 28, 251, 59, 147, 230, 77, 239, 200, + 156, 28, 230, 77, 248, 122, 156, 28, 236, 186, 156, 28, 236, 238, 156, + 28, 250, 232, 156, 28, 250, 250, 156, 28, 241, 188, 156, 28, 252, 234, + 156, 28, 251, 216, 153, 239, 28, 156, 28, 247, 183, 229, 221, 156, 28, + 235, 113, 228, 249, 156, 28, 236, 185, 156, 28, 230, 77, 228, 107, 156, + 28, 234, 154, 156, 28, 230, 77, 252, 141, 156, 28, 230, 77, 254, 180, + 230, 23, 156, 28, 230, 77, 240, 217, 231, 97, 238, 149, 156, 28, 250, + 215, 156, 28, 230, 77, 239, 59, 239, 94, 156, 28, 255, 95, 156, 28, 230, + 77, 228, 134, 156, 28, 230, 77, 247, 163, 228, 86, 156, 28, 230, 77, 241, + 37, 240, 28, 156, 28, 250, 145, 156, 28, 239, 196, 156, 28, 241, 169, + 229, 152, 156, 28, 3, 235, 161, 156, 28, 255, 65, 251, 208, 156, 28, 253, + 81, 251, 208, 6, 4, 241, 121, 6, 4, 241, 115, 6, 4, 71, 6, 4, 241, 134, + 6, 4, 241, 228, 6, 4, 241, 213, 6, 4, 241, 230, 6, 4, 241, 229, 6, 4, + 254, 153, 6, 4, 254, 130, 6, 4, 67, 6, 4, 254, 234, 6, 4, 229, 1, 6, 4, + 229, 4, 6, 4, 229, 2, 6, 4, 236, 172, 6, 4, 236, 151, 6, 4, 73, 6, 4, + 236, 196, 6, 4, 248, 159, 6, 4, 72, 6, 4, 228, 63, 6, 4, 253, 21, 6, 4, + 253, 18, 6, 4, 253, 43, 6, 4, 253, 28, 6, 4, 253, 37, 6, 4, 253, 36, 6, + 4, 253, 39, 6, 4, 253, 38, 6, 4, 253, 130, 6, 4, 253, 127, 6, 4, 253, + 166, 6, 4, 253, 145, 6, 4, 252, 203, 6, 4, 252, 207, 6, 4, 252, 204, 6, + 4, 252, 251, 6, 4, 252, 242, 6, 4, 253, 4, 6, 4, 252, 253, 6, 4, 253, 48, + 6, 4, 253, 91, 6, 4, 253, 60, 6, 4, 252, 197, 6, 4, 252, 195, 6, 4, 252, + 217, 6, 4, 252, 202, 6, 4, 252, 200, 6, 4, 252, 201, 6, 4, 252, 183, 6, + 4, 252, 182, 6, 4, 252, 188, 6, 4, 252, 186, 6, 4, 252, 184, 6, 4, 252, + 185, 6, 4, 235, 227, 6, 4, 235, 223, 6, 4, 236, 8, 6, 4, 235, 230, 6, 4, + 235, 239, 6, 4, 236, 3, 6, 4, 236, 1, 6, 4, 236, 94, 6, 4, 236, 85, 6, 4, + 236, 142, 6, 4, 236, 122, 6, 4, 235, 118, 6, 4, 235, 120, 6, 4, 235, 119, + 6, 4, 235, 183, 6, 4, 235, 180, 6, 4, 235, 207, 6, 4, 235, 190, 6, 4, + 235, 112, 6, 4, 235, 111, 6, 4, 235, 124, 6, 4, 235, 117, 6, 4, 235, 114, + 6, 4, 235, 116, 6, 4, 235, 96, 6, 4, 235, 95, 6, 4, 235, 100, 6, 4, 235, + 99, 6, 4, 235, 97, 6, 4, 235, 98, 6, 4, 253, 112, 6, 4, 253, 111, 6, 4, + 253, 118, 6, 4, 253, 113, 6, 4, 253, 115, 6, 4, 253, 114, 6, 4, 253, 117, + 6, 4, 253, 116, 6, 4, 253, 123, 6, 4, 253, 122, 6, 4, 253, 125, 6, 4, + 253, 124, 6, 4, 253, 103, 6, 4, 253, 105, 6, 4, 253, 104, 6, 4, 253, 108, + 6, 4, 253, 107, 6, 4, 253, 110, 6, 4, 253, 109, 6, 4, 253, 119, 6, 4, + 253, 121, 6, 4, 253, 120, 6, 4, 253, 99, 6, 4, 253, 98, 6, 4, 253, 106, + 6, 4, 253, 102, 6, 4, 253, 100, 6, 4, 253, 101, 6, 4, 253, 95, 6, 4, 253, + 94, 6, 4, 253, 97, 6, 4, 253, 96, 6, 4, 238, 50, 6, 4, 238, 49, 6, 4, + 238, 55, 6, 4, 238, 51, 6, 4, 238, 52, 6, 4, 238, 54, 6, 4, 238, 53, 6, + 4, 238, 57, 6, 4, 238, 56, 6, 4, 238, 59, 6, 4, 238, 58, 6, 4, 238, 46, + 6, 4, 238, 45, 6, 4, 238, 48, 6, 4, 238, 47, 6, 4, 238, 40, 6, 4, 238, + 39, 6, 4, 238, 44, 6, 4, 238, 43, 6, 4, 238, 41, 6, 4, 238, 42, 6, 4, + 238, 34, 6, 4, 238, 33, 6, 4, 238, 38, 6, 4, 238, 37, 6, 4, 238, 35, 6, + 4, 238, 36, 6, 4, 246, 109, 6, 4, 246, 108, 6, 4, 246, 114, 6, 4, 246, + 110, 6, 4, 246, 111, 6, 4, 246, 113, 6, 4, 246, 112, 6, 4, 246, 116, 6, + 4, 246, 115, 6, 4, 246, 118, 6, 4, 246, 117, 6, 4, 246, 100, 6, 4, 246, + 102, 6, 4, 246, 101, 6, 4, 246, 105, 6, 4, 246, 104, 6, 4, 246, 107, 6, + 4, 246, 106, 6, 4, 246, 96, 6, 4, 246, 95, 6, 4, 246, 103, 6, 4, 246, 99, + 6, 4, 246, 97, 6, 4, 246, 98, 6, 4, 246, 90, 6, 4, 246, 94, 6, 4, 246, + 93, 6, 4, 246, 91, 6, 4, 246, 92, 6, 4, 238, 183, 6, 4, 238, 182, 6, 4, + 238, 226, 6, 4, 238, 188, 6, 4, 238, 209, 6, 4, 238, 221, 6, 4, 238, 220, + 6, 4, 239, 52, 6, 4, 239, 49, 6, 4, 222, 6, 4, 239, 75, 6, 4, 238, 126, + 6, 4, 238, 125, 6, 4, 238, 128, 6, 4, 238, 127, 6, 4, 238, 153, 6, 4, + 238, 145, 6, 4, 238, 175, 6, 4, 238, 157, 6, 4, 238, 255, 6, 4, 239, 40, + 6, 4, 238, 116, 6, 4, 238, 113, 6, 4, 238, 141, 6, 4, 238, 122, 6, 4, + 238, 119, 6, 4, 238, 120, 6, 4, 238, 96, 6, 4, 238, 95, 6, 4, 238, 100, + 6, 4, 238, 98, 6, 4, 248, 50, 6, 4, 248, 46, 6, 4, 248, 81, 6, 4, 248, + 58, 6, 4, 248, 116, 6, 4, 248, 110, 6, 4, 248, 139, 6, 4, 248, 118, 6, 4, + 247, 249, 6, 4, 248, 21, 6, 4, 248, 13, 6, 4, 247, 221, 6, 4, 247, 220, + 6, 4, 247, 232, 6, 4, 247, 226, 6, 4, 247, 224, 6, 4, 247, 225, 6, 4, + 247, 211, 6, 4, 247, 210, 6, 4, 247, 214, 6, 4, 247, 212, 6, 4, 228, 175, + 6, 4, 228, 174, 6, 4, 228, 193, 6, 4, 228, 183, 6, 4, 228, 188, 6, 4, + 228, 186, 6, 4, 228, 190, 6, 4, 228, 189, 6, 4, 228, 219, 6, 4, 228, 215, + 6, 4, 228, 233, 6, 4, 228, 228, 6, 4, 228, 165, 6, 4, 228, 161, 6, 4, + 228, 173, 6, 4, 228, 166, 6, 4, 228, 194, 6, 4, 228, 205, 6, 4, 228, 154, + 6, 4, 228, 153, 6, 4, 228, 159, 6, 4, 228, 157, 6, 4, 228, 155, 6, 4, + 228, 156, 6, 4, 228, 147, 6, 4, 228, 146, 6, 4, 228, 151, 6, 4, 228, 150, + 6, 4, 228, 148, 6, 4, 228, 149, 6, 4, 250, 142, 6, 4, 250, 131, 6, 4, + 250, 202, 6, 4, 250, 157, 6, 4, 250, 182, 6, 4, 250, 186, 6, 4, 250, 185, + 6, 4, 251, 51, 6, 4, 251, 46, 6, 4, 251, 102, 6, 4, 251, 67, 6, 4, 249, + 66, 6, 4, 249, 67, 6, 4, 250, 100, 6, 4, 249, 84, 6, 4, 250, 116, 6, 4, + 250, 102, 6, 4, 250, 213, 6, 4, 251, 2, 6, 4, 250, 224, 6, 4, 249, 61, 6, + 4, 249, 59, 6, 4, 249, 70, 6, 4, 249, 65, 6, 4, 249, 62, 6, 4, 249, 64, + 6, 4, 229, 243, 6, 4, 229, 239, 6, 4, 230, 15, 6, 4, 229, 248, 6, 4, 230, + 9, 6, 4, 230, 11, 6, 4, 230, 10, 6, 4, 230, 150, 6, 4, 230, 139, 6, 4, + 230, 182, 6, 4, 230, 154, 6, 4, 229, 101, 6, 4, 229, 100, 6, 4, 229, 103, + 6, 4, 229, 102, 6, 4, 229, 201, 6, 4, 229, 199, 6, 4, 87, 6, 4, 229, 207, + 6, 4, 230, 92, 6, 4, 230, 131, 6, 4, 230, 109, 6, 4, 229, 90, 6, 4, 229, + 88, 6, 4, 229, 106, 6, 4, 229, 99, 6, 4, 229, 91, 6, 4, 229, 98, 6, 4, + 251, 19, 6, 4, 251, 18, 6, 4, 251, 24, 6, 4, 251, 20, 6, 4, 251, 21, 6, + 4, 251, 23, 6, 4, 251, 22, 6, 4, 251, 34, 6, 4, 251, 33, 6, 4, 251, 41, + 6, 4, 251, 35, 6, 4, 251, 9, 6, 4, 251, 11, 6, 4, 251, 10, 6, 4, 251, 14, + 6, 4, 251, 13, 6, 4, 251, 17, 6, 4, 251, 15, 6, 4, 251, 27, 6, 4, 251, + 30, 6, 4, 251, 28, 6, 4, 251, 5, 6, 4, 251, 4, 6, 4, 251, 12, 6, 4, 251, + 8, 6, 4, 251, 6, 6, 4, 251, 7, 6, 4, 238, 21, 6, 4, 238, 20, 6, 4, 238, + 25, 6, 4, 238, 22, 6, 4, 238, 23, 6, 4, 238, 24, 6, 4, 238, 30, 6, 4, + 238, 29, 6, 4, 238, 32, 6, 4, 238, 31, 6, 4, 238, 17, 6, 4, 238, 16, 6, + 4, 238, 19, 6, 4, 238, 18, 6, 4, 238, 26, 6, 4, 238, 28, 6, 4, 238, 27, + 6, 4, 238, 11, 6, 4, 238, 10, 6, 4, 238, 15, 6, 4, 238, 14, 6, 4, 238, + 12, 6, 4, 238, 13, 6, 4, 246, 76, 6, 4, 246, 75, 6, 4, 246, 82, 6, 4, + 246, 77, 6, 4, 246, 79, 6, 4, 246, 78, 6, 4, 246, 81, 6, 4, 246, 80, 6, + 4, 246, 87, 6, 4, 246, 86, 6, 4, 246, 89, 6, 4, 246, 88, 6, 4, 246, 70, + 6, 4, 246, 71, 6, 4, 246, 73, 6, 4, 246, 72, 6, 4, 246, 74, 6, 4, 246, + 83, 6, 4, 246, 85, 6, 4, 246, 84, 6, 4, 246, 69, 6, 4, 237, 180, 6, 4, + 237, 179, 6, 4, 237, 209, 6, 4, 237, 182, 6, 4, 237, 194, 6, 4, 237, 206, + 6, 4, 237, 205, 6, 4, 238, 62, 6, 4, 238, 91, 6, 4, 238, 72, 6, 4, 237, + 69, 6, 4, 237, 71, 6, 4, 237, 70, 6, 4, 237, 119, 6, 4, 237, 108, 6, 4, + 237, 138, 6, 4, 237, 126, 6, 4, 237, 248, 6, 4, 238, 9, 6, 4, 237, 254, + 6, 4, 237, 65, 6, 4, 237, 63, 6, 4, 237, 83, 6, 4, 237, 68, 6, 4, 237, + 66, 6, 4, 237, 67, 6, 4, 246, 138, 6, 4, 246, 137, 6, 4, 246, 143, 6, 4, + 246, 139, 6, 4, 246, 140, 6, 4, 246, 142, 6, 4, 246, 141, 6, 4, 246, 148, + 6, 4, 246, 147, 6, 4, 246, 150, 6, 4, 246, 149, 6, 4, 246, 130, 6, 4, + 246, 132, 6, 4, 246, 131, 6, 4, 246, 134, 6, 4, 246, 136, 6, 4, 246, 135, + 6, 4, 246, 144, 6, 4, 246, 146, 6, 4, 246, 145, 6, 4, 246, 126, 6, 4, + 246, 125, 6, 4, 246, 133, 6, 4, 246, 129, 6, 4, 246, 127, 6, 4, 246, 128, + 6, 4, 246, 120, 6, 4, 246, 119, 6, 4, 246, 124, 6, 4, 246, 123, 6, 4, + 246, 121, 6, 4, 246, 122, 6, 4, 239, 181, 6, 4, 239, 177, 6, 4, 239, 209, + 6, 4, 239, 184, 6, 4, 239, 203, 6, 4, 239, 202, 6, 4, 239, 205, 6, 4, + 239, 204, 6, 4, 240, 11, 6, 4, 240, 5, 6, 4, 240, 41, 6, 4, 240, 17, 6, + 4, 239, 130, 6, 4, 239, 129, 6, 4, 239, 132, 6, 4, 239, 131, 6, 4, 239, + 144, 6, 4, 239, 139, 6, 4, 239, 167, 6, 4, 239, 146, 6, 4, 239, 223, 6, + 4, 239, 254, 6, 4, 239, 230, 6, 4, 239, 125, 6, 4, 239, 124, 6, 4, 239, + 135, 6, 4, 239, 128, 6, 4, 239, 126, 6, 4, 239, 127, 6, 4, 239, 109, 6, + 4, 239, 108, 6, 4, 239, 114, 6, 4, 239, 112, 6, 4, 239, 110, 6, 4, 239, + 111, 6, 4, 247, 83, 6, 4, 247, 82, 6, 4, 247, 96, 6, 4, 247, 85, 6, 4, + 247, 92, 6, 4, 247, 91, 6, 4, 247, 94, 6, 4, 247, 93, 6, 4, 247, 185, 6, + 4, 247, 181, 6, 4, 247, 208, 6, 4, 247, 191, 6, 4, 247, 24, 6, 4, 247, + 23, 6, 4, 247, 26, 6, 4, 247, 25, 6, 4, 247, 59, 6, 4, 247, 57, 6, 4, + 247, 72, 6, 4, 247, 66, 6, 4, 247, 154, 6, 4, 247, 152, 6, 4, 247, 173, + 6, 4, 247, 160, 6, 4, 247, 17, 6, 4, 247, 16, 6, 4, 247, 32, 6, 4, 247, + 22, 6, 4, 247, 18, 6, 4, 247, 21, 6, 4, 240, 152, 6, 4, 240, 151, 6, 4, + 240, 168, 6, 4, 240, 158, 6, 4, 240, 164, 6, 4, 240, 166, 6, 4, 240, 165, + 6, 4, 240, 233, 6, 4, 240, 225, 6, 4, 201, 6, 4, 240, 250, 6, 4, 240, 88, + 6, 4, 240, 90, 6, 4, 240, 89, 6, 4, 240, 107, 6, 4, 240, 104, 6, 4, 240, + 127, 6, 4, 240, 113, 6, 4, 240, 203, 6, 4, 240, 201, 6, 4, 240, 219, 6, + 4, 240, 204, 6, 4, 240, 80, 6, 4, 240, 78, 6, 4, 240, 92, 6, 4, 240, 87, + 6, 4, 240, 82, 6, 4, 240, 86, 6, 4, 247, 136, 6, 4, 247, 135, 6, 4, 247, + 140, 6, 4, 247, 137, 6, 4, 247, 139, 6, 4, 247, 138, 6, 4, 247, 147, 6, + 4, 247, 146, 6, 4, 247, 150, 6, 4, 247, 148, 6, 4, 247, 127, 6, 4, 247, + 126, 6, 4, 247, 129, 6, 4, 247, 128, 6, 4, 247, 132, 6, 4, 247, 131, 6, + 4, 247, 134, 6, 4, 247, 133, 6, 4, 247, 142, 6, 4, 247, 141, 6, 4, 247, + 145, 6, 4, 247, 143, 6, 4, 247, 122, 6, 4, 247, 121, 6, 4, 247, 130, 6, + 4, 247, 125, 6, 4, 247, 123, 6, 4, 247, 124, 6, 4, 238, 244, 6, 4, 238, + 245, 6, 4, 238, 250, 6, 4, 238, 249, 6, 4, 238, 252, 6, 4, 238, 251, 6, + 4, 238, 235, 6, 4, 238, 237, 6, 4, 238, 236, 6, 4, 238, 240, 6, 4, 238, + 239, 6, 4, 238, 242, 6, 4, 238, 241, 6, 4, 238, 246, 6, 4, 238, 248, 6, + 4, 238, 247, 6, 4, 238, 231, 6, 4, 238, 230, 6, 4, 238, 238, 6, 4, 238, + 234, 6, 4, 238, 232, 6, 4, 238, 233, 6, 4, 246, 3, 6, 4, 246, 2, 6, 4, + 246, 9, 6, 4, 246, 4, 6, 4, 246, 6, 6, 4, 246, 5, 6, 4, 246, 8, 6, 4, + 246, 7, 6, 4, 246, 14, 6, 4, 246, 13, 6, 4, 246, 16, 6, 4, 246, 15, 6, 4, + 245, 251, 6, 4, 245, 250, 6, 4, 245, 253, 6, 4, 245, 252, 6, 4, 245, 255, + 6, 4, 245, 254, 6, 4, 246, 1, 6, 4, 246, 0, 6, 4, 246, 10, 6, 4, 246, 12, + 6, 4, 246, 11, 6, 4, 237, 226, 6, 4, 237, 228, 6, 4, 237, 227, 6, 4, 237, + 236, 6, 4, 237, 235, 6, 4, 237, 242, 6, 4, 237, 238, 6, 4, 237, 213, 6, + 4, 237, 212, 6, 4, 237, 214, 6, 4, 237, 217, 6, 4, 237, 216, 6, 4, 237, + 222, 6, 4, 237, 218, 6, 4, 237, 231, 6, 4, 237, 234, 6, 4, 237, 232, 6, + 4, 246, 153, 6, 4, 246, 159, 6, 4, 246, 166, 6, 4, 246, 220, 6, 4, 246, + 215, 6, 4, 219, 6, 4, 246, 228, 6, 4, 246, 27, 6, 4, 246, 26, 6, 4, 246, + 29, 6, 4, 246, 28, 6, 4, 246, 47, 6, 4, 246, 42, 6, 4, 246, 67, 6, 4, + 246, 55, 6, 4, 246, 179, 6, 4, 246, 210, 6, 4, 246, 188, 6, 4, 228, 125, + 6, 4, 228, 114, 6, 4, 228, 143, 6, 4, 228, 133, 6, 4, 228, 59, 6, 4, 228, + 61, 6, 4, 228, 60, 6, 4, 228, 68, 6, 4, 228, 82, 6, 4, 228, 73, 6, 4, + 228, 102, 6, 4, 228, 112, 6, 4, 228, 105, 6, 4, 227, 33, 6, 4, 227, 32, + 6, 4, 227, 41, 6, 4, 227, 34, 6, 4, 227, 38, 6, 4, 227, 40, 6, 4, 227, + 39, 6, 4, 227, 93, 6, 4, 227, 90, 6, 4, 227, 102, 6, 4, 227, 96, 6, 4, + 227, 16, 6, 4, 227, 18, 6, 4, 227, 17, 6, 4, 227, 23, 6, 4, 227, 22, 6, + 4, 227, 27, 6, 4, 227, 24, 6, 4, 227, 78, 6, 4, 227, 86, 6, 4, 227, 82, + 6, 4, 227, 12, 6, 4, 227, 11, 6, 4, 227, 19, 6, 4, 227, 15, 6, 4, 227, + 13, 6, 4, 227, 14, 6, 4, 227, 3, 6, 4, 227, 2, 6, 4, 227, 8, 6, 4, 227, + 6, 6, 4, 227, 4, 6, 4, 227, 5, 6, 4, 252, 1, 6, 4, 251, 254, 6, 4, 252, + 16, 6, 4, 252, 6, 6, 4, 252, 13, 6, 4, 252, 9, 6, 4, 252, 15, 6, 4, 252, + 14, 6, 4, 252, 144, 6, 4, 252, 138, 6, 4, 252, 176, 6, 4, 252, 156, 6, 4, + 251, 138, 6, 4, 251, 140, 6, 4, 251, 139, 6, 4, 251, 166, 6, 4, 251, 161, + 6, 4, 251, 226, 6, 4, 251, 179, 6, 4, 252, 98, 6, 4, 252, 119, 6, 4, 252, + 99, 6, 4, 251, 124, 6, 4, 251, 123, 6, 4, 251, 144, 6, 4, 251, 137, 6, 4, + 251, 127, 6, 4, 251, 136, 6, 4, 251, 106, 6, 4, 251, 105, 6, 4, 251, 114, + 6, 4, 251, 111, 6, 4, 251, 107, 6, 4, 251, 109, 6, 4, 226, 242, 6, 4, + 226, 241, 6, 4, 226, 248, 6, 4, 226, 243, 6, 4, 226, 245, 6, 4, 226, 244, + 6, 4, 226, 247, 6, 4, 226, 246, 6, 4, 226, 254, 6, 4, 226, 253, 6, 4, + 227, 1, 6, 4, 226, 255, 6, 4, 226, 238, 6, 4, 226, 240, 6, 4, 226, 239, + 6, 4, 226, 249, 6, 4, 226, 252, 6, 4, 226, 250, 6, 4, 226, 233, 6, 4, + 226, 237, 6, 4, 226, 236, 6, 4, 226, 234, 6, 4, 226, 235, 6, 4, 226, 228, + 6, 4, 226, 227, 6, 4, 226, 232, 6, 4, 226, 231, 6, 4, 226, 229, 6, 4, + 226, 230, 6, 4, 237, 15, 6, 4, 237, 14, 6, 4, 237, 20, 6, 4, 237, 16, 6, + 4, 237, 17, 6, 4, 237, 19, 6, 4, 237, 18, 6, 4, 237, 24, 6, 4, 237, 23, + 6, 4, 237, 26, 6, 4, 237, 25, 6, 4, 237, 9, 6, 4, 237, 10, 6, 4, 237, 12, + 6, 4, 237, 13, 6, 4, 237, 21, 6, 4, 237, 22, 6, 4, 237, 5, 6, 4, 237, 11, + 6, 4, 237, 8, 6, 4, 237, 6, 6, 4, 237, 7, 6, 4, 237, 0, 6, 4, 236, 255, + 6, 4, 237, 4, 6, 4, 237, 3, 6, 4, 237, 1, 6, 4, 237, 2, 6, 4, 232, 6, 6, + 4, 187, 6, 4, 232, 51, 6, 4, 232, 8, 6, 4, 232, 44, 6, 4, 232, 46, 6, 4, + 232, 45, 6, 4, 233, 229, 6, 4, 233, 226, 6, 4, 234, 8, 6, 4, 233, 231, 6, + 4, 231, 31, 6, 4, 231, 33, 6, 4, 231, 32, 6, 4, 231, 204, 6, 4, 231, 195, + 6, 4, 231, 216, 6, 4, 231, 205, 6, 4, 232, 152, 6, 4, 233, 203, 6, 4, + 232, 168, 6, 4, 231, 16, 6, 4, 231, 15, 6, 4, 231, 62, 6, 4, 231, 30, 6, + 4, 231, 18, 6, 4, 231, 23, 6, 4, 230, 194, 6, 4, 230, 193, 6, 4, 230, + 255, 6, 4, 230, 199, 6, 4, 230, 195, 6, 4, 230, 198, 6, 4, 231, 139, 6, + 4, 231, 138, 6, 4, 231, 144, 6, 4, 231, 140, 6, 4, 231, 141, 6, 4, 231, + 143, 6, 4, 231, 142, 6, 4, 231, 150, 6, 4, 231, 149, 6, 4, 231, 163, 6, + 4, 231, 151, 6, 4, 231, 135, 6, 4, 231, 134, 6, 4, 231, 137, 6, 4, 231, + 136, 6, 4, 231, 145, 6, 4, 231, 148, 6, 4, 231, 146, 6, 4, 231, 131, 6, + 4, 231, 130, 6, 4, 231, 133, 6, 4, 231, 132, 6, 4, 231, 125, 6, 4, 231, + 124, 6, 4, 231, 129, 6, 4, 231, 128, 6, 4, 231, 126, 6, 4, 231, 127, 6, + 4, 227, 71, 6, 4, 227, 70, 6, 4, 227, 76, 6, 4, 227, 73, 6, 4, 227, 54, + 6, 4, 227, 56, 6, 4, 227, 55, 6, 4, 227, 59, 6, 4, 227, 58, 6, 4, 227, + 61, 6, 4, 227, 60, 6, 4, 227, 65, 6, 4, 227, 64, 6, 4, 227, 68, 6, 4, + 227, 66, 6, 4, 227, 50, 6, 4, 227, 49, 6, 4, 227, 57, 6, 4, 227, 53, 6, + 4, 227, 51, 6, 4, 227, 52, 6, 4, 227, 43, 6, 4, 227, 42, 6, 4, 227, 47, + 6, 4, 227, 46, 6, 4, 227, 44, 6, 4, 227, 45, 6, 4, 252, 80, 6, 4, 252, + 77, 6, 4, 252, 96, 6, 4, 252, 85, 6, 4, 252, 30, 6, 4, 252, 29, 6, 4, + 252, 32, 6, 4, 252, 31, 6, 4, 252, 41, 6, 4, 252, 40, 6, 4, 252, 47, 6, + 4, 252, 43, 6, 4, 252, 67, 6, 4, 252, 65, 6, 4, 252, 75, 6, 4, 252, 69, + 6, 4, 252, 24, 6, 4, 252, 34, 6, 4, 252, 28, 6, 4, 252, 25, 6, 4, 252, + 27, 6, 4, 252, 18, 6, 4, 252, 17, 6, 4, 252, 22, 6, 4, 252, 21, 6, 4, + 252, 19, 6, 4, 252, 20, 6, 4, 234, 71, 6, 4, 234, 72, 6, 4, 234, 58, 6, + 4, 234, 59, 6, 4, 234, 62, 6, 4, 234, 61, 6, 4, 234, 64, 6, 4, 234, 63, + 6, 4, 234, 66, 6, 4, 234, 65, 6, 4, 234, 70, 6, 4, 234, 67, 6, 4, 234, + 54, 6, 4, 234, 53, 6, 4, 234, 60, 6, 4, 234, 57, 6, 4, 234, 55, 6, 4, + 234, 56, 6, 4, 234, 48, 6, 4, 234, 47, 6, 4, 234, 52, 6, 4, 234, 51, 6, + 4, 234, 49, 6, 4, 234, 50, 6, 4, 237, 105, 6, 4, 237, 104, 6, 4, 237, + 107, 6, 4, 237, 106, 6, 4, 237, 97, 6, 4, 237, 99, 6, 4, 237, 98, 6, 4, + 237, 101, 6, 4, 237, 100, 6, 4, 237, 103, 6, 4, 237, 102, 6, 4, 237, 92, + 6, 4, 237, 91, 6, 4, 237, 96, 6, 4, 237, 95, 6, 4, 237, 93, 6, 4, 237, + 94, 6, 4, 237, 86, 6, 4, 237, 85, 6, 4, 237, 90, 6, 4, 237, 89, 6, 4, + 237, 87, 6, 4, 237, 88, 6, 4, 232, 130, 6, 4, 232, 128, 6, 4, 232, 147, + 6, 4, 232, 135, 6, 4, 232, 70, 6, 4, 232, 72, 6, 4, 232, 71, 6, 4, 232, + 79, 6, 4, 232, 77, 6, 4, 232, 101, 6, 4, 232, 94, 6, 4, 232, 113, 6, 4, + 232, 111, 6, 4, 232, 126, 6, 4, 232, 115, 6, 4, 232, 66, 6, 4, 232, 65, + 6, 4, 232, 74, 6, 4, 232, 69, 6, 4, 232, 67, 6, 4, 232, 68, 6, 4, 232, + 53, 6, 4, 232, 52, 6, 4, 232, 57, 6, 4, 232, 56, 6, 4, 232, 54, 6, 4, + 232, 55, 6, 4, 234, 211, 6, 4, 234, 209, 6, 4, 234, 236, 6, 4, 234, 215, + 6, 4, 234, 32, 6, 4, 234, 34, 6, 4, 234, 33, 6, 4, 234, 79, 6, 4, 234, + 74, 6, 4, 234, 91, 6, 4, 234, 80, 6, 4, 234, 153, 6, 4, 234, 203, 6, 4, + 234, 177, 6, 4, 234, 25, 6, 4, 234, 23, 6, 4, 234, 43, 6, 4, 234, 31, 6, + 4, 234, 27, 6, 4, 234, 28, 6, 4, 234, 14, 6, 4, 234, 13, 6, 4, 234, 19, + 6, 4, 234, 17, 6, 4, 234, 15, 6, 4, 234, 16, 6, 4, 241, 78, 6, 4, 241, + 77, 6, 4, 241, 86, 6, 4, 241, 79, 6, 4, 241, 82, 6, 4, 241, 81, 6, 4, + 241, 84, 6, 4, 241, 83, 6, 4, 241, 28, 6, 4, 241, 27, 6, 4, 241, 30, 6, + 4, 241, 29, 6, 4, 241, 40, 6, 4, 241, 39, 6, 4, 241, 48, 6, 4, 241, 42, + 6, 4, 241, 22, 6, 4, 241, 21, 6, 4, 241, 36, 6, 4, 241, 26, 6, 4, 241, + 23, 6, 4, 241, 24, 6, 4, 241, 15, 6, 4, 241, 14, 6, 4, 241, 19, 6, 4, + 241, 18, 6, 4, 241, 16, 6, 4, 241, 17, 6, 4, 235, 51, 6, 4, 235, 50, 6, + 4, 235, 58, 6, 4, 235, 52, 6, 4, 235, 55, 6, 4, 235, 54, 6, 4, 235, 57, + 6, 4, 235, 56, 6, 4, 235, 14, 6, 4, 235, 11, 6, 4, 235, 16, 6, 4, 235, + 15, 6, 4, 235, 41, 6, 4, 235, 40, 6, 4, 235, 49, 6, 4, 235, 43, 6, 4, + 235, 6, 6, 4, 235, 2, 6, 4, 235, 38, 6, 4, 235, 10, 6, 4, 235, 8, 6, 4, + 235, 9, 6, 4, 234, 242, 6, 4, 234, 240, 6, 4, 234, 252, 6, 4, 234, 245, + 6, 4, 234, 243, 6, 4, 234, 244, 6, 4, 241, 67, 6, 4, 241, 66, 6, 4, 241, + 73, 6, 4, 241, 68, 6, 4, 241, 70, 6, 4, 241, 69, 6, 4, 241, 72, 6, 4, + 241, 71, 6, 4, 241, 58, 6, 4, 241, 60, 6, 4, 241, 59, 6, 4, 241, 63, 6, + 4, 241, 62, 6, 4, 241, 65, 6, 4, 241, 64, 6, 4, 241, 54, 6, 4, 241, 53, + 6, 4, 241, 61, 6, 4, 241, 57, 6, 4, 241, 55, 6, 4, 241, 56, 6, 4, 241, + 50, 6, 4, 241, 49, 6, 4, 241, 52, 6, 4, 241, 51, 6, 4, 237, 170, 6, 4, + 237, 169, 6, 4, 237, 176, 6, 4, 237, 171, 6, 4, 237, 173, 6, 4, 237, 172, + 6, 4, 237, 175, 6, 4, 237, 174, 6, 4, 237, 162, 6, 4, 237, 163, 6, 4, + 237, 166, 6, 4, 237, 165, 6, 4, 237, 168, 6, 4, 237, 167, 6, 4, 237, 158, + 6, 4, 237, 164, 6, 4, 237, 161, 6, 4, 237, 159, 6, 4, 237, 160, 6, 4, + 237, 153, 6, 4, 237, 152, 6, 4, 237, 157, 6, 4, 237, 156, 6, 4, 237, 154, + 6, 4, 237, 155, 6, 4, 237, 41, 6, 4, 237, 40, 6, 4, 237, 48, 6, 4, 237, + 43, 6, 4, 237, 45, 6, 4, 237, 44, 6, 4, 237, 47, 6, 4, 237, 46, 6, 4, + 237, 31, 6, 4, 237, 33, 6, 4, 237, 32, 6, 4, 237, 36, 6, 4, 237, 35, 6, + 4, 237, 39, 6, 4, 237, 37, 6, 4, 237, 29, 6, 4, 237, 28, 6, 4, 237, 34, + 6, 4, 237, 30, 6, 4, 228, 39, 6, 4, 228, 38, 6, 4, 228, 46, 6, 4, 228, + 41, 6, 4, 228, 43, 6, 4, 228, 42, 6, 4, 228, 45, 6, 4, 228, 44, 6, 4, + 228, 28, 6, 4, 228, 29, 6, 4, 228, 33, 6, 4, 228, 32, 6, 4, 228, 37, 6, + 4, 228, 35, 6, 4, 228, 11, 6, 4, 228, 9, 6, 4, 228, 21, 6, 4, 228, 14, 6, + 4, 228, 12, 6, 4, 228, 13, 6, 4, 227, 173, 6, 4, 227, 171, 6, 4, 227, + 186, 6, 4, 227, 174, 6, 4, 227, 181, 6, 4, 227, 180, 6, 4, 227, 183, 6, + 4, 227, 182, 6, 4, 227, 129, 6, 4, 227, 128, 6, 4, 227, 131, 6, 4, 227, + 130, 6, 4, 227, 153, 6, 4, 227, 150, 6, 4, 227, 167, 6, 4, 227, 155, 6, + 4, 227, 122, 6, 4, 227, 120, 6, 4, 227, 142, 6, 4, 227, 127, 6, 4, 227, + 125, 6, 4, 227, 126, 6, 4, 227, 106, 6, 4, 227, 105, 6, 4, 227, 111, 6, + 4, 227, 109, 6, 4, 227, 107, 6, 4, 227, 108, 6, 25, 235, 41, 6, 25, 239, + 209, 6, 25, 240, 152, 6, 25, 237, 43, 6, 25, 251, 111, 6, 25, 231, 144, + 6, 25, 247, 133, 6, 25, 247, 160, 6, 25, 238, 226, 6, 25, 246, 3, 6, 25, + 239, 111, 6, 25, 253, 99, 6, 25, 238, 157, 6, 25, 227, 167, 6, 25, 235, + 112, 6, 25, 245, 253, 6, 25, 230, 150, 6, 25, 247, 208, 6, 25, 227, 15, + 6, 25, 251, 106, 6, 25, 251, 7, 6, 25, 252, 201, 6, 25, 247, 129, 6, 25, + 237, 37, 6, 25, 229, 106, 6, 25, 236, 196, 6, 25, 241, 54, 6, 25, 227, + 23, 6, 25, 235, 96, 6, 25, 246, 107, 6, 25, 227, 173, 6, 25, 228, 156, 6, + 25, 232, 57, 6, 25, 228, 205, 6, 25, 227, 102, 6, 25, 241, 48, 6, 25, + 237, 8, 6, 25, 241, 52, 6, 25, 247, 59, 6, 25, 241, 72, 6, 25, 228, 82, + 6, 25, 249, 70, 6, 25, 232, 68, 6, 25, 239, 205, 6, 25, 251, 114, 6, 25, + 251, 139, 6, 25, 252, 6, 6, 25, 246, 0, 6, 25, 232, 130, 6, 25, 227, 14, + 6, 25, 232, 94, 6, 25, 252, 75, 6, 25, 226, 245, 6, 25, 238, 54, 6, 25, + 240, 219, 49, 1, 252, 56, 188, 227, 177, 235, 232, 49, 1, 252, 56, 188, + 227, 232, 235, 232, 49, 1, 252, 56, 188, 227, 177, 232, 136, 49, 1, 252, + 56, 188, 227, 232, 232, 136, 49, 1, 252, 56, 188, 227, 177, 235, 38, 49, + 1, 252, 56, 188, 227, 232, 235, 38, 49, 1, 252, 56, 188, 227, 177, 234, + 43, 49, 1, 252, 56, 188, 227, 232, 234, 43, 49, 1, 248, 148, 249, 98, + 188, 125, 49, 1, 200, 249, 98, 188, 125, 49, 1, 238, 224, 249, 98, 188, + 125, 49, 1, 170, 249, 98, 188, 125, 49, 1, 248, 147, 249, 98, 188, 125, + 49, 1, 248, 148, 249, 98, 239, 244, 188, 125, 49, 1, 200, 249, 98, 239, + 244, 188, 125, 49, 1, 238, 224, 249, 98, 239, 244, 188, 125, 49, 1, 170, + 249, 98, 239, 244, 188, 125, 49, 1, 248, 147, 249, 98, 239, 244, 188, + 125, 49, 1, 248, 148, 239, 244, 188, 125, 49, 1, 200, 239, 244, 188, 125, + 49, 1, 238, 224, 239, 244, 188, 125, 49, 1, 170, 239, 244, 188, 125, 49, + 1, 248, 147, 239, 244, 188, 125, 230, 254, 238, 82, 1, 67, 230, 254, 238, + 82, 1, 71, 230, 254, 238, 82, 21, 249, 57, 230, 254, 238, 82, 1, 79, 230, + 254, 238, 82, 1, 72, 230, 254, 238, 82, 1, 73, 230, 254, 238, 82, 21, + 246, 221, 230, 254, 238, 82, 1, 240, 127, 230, 254, 238, 82, 1, 240, 175, + 230, 254, 238, 82, 1, 247, 72, 230, 254, 238, 82, 1, 247, 103, 230, 254, + 238, 82, 21, 254, 236, 230, 254, 238, 82, 1, 251, 226, 230, 254, 238, 82, + 1, 252, 47, 230, 254, 238, 82, 1, 241, 48, 230, 254, 238, 82, 1, 241, 87, + 230, 254, 238, 82, 1, 229, 115, 230, 254, 238, 82, 1, 229, 117, 230, 254, + 238, 82, 1, 251, 17, 230, 254, 238, 82, 1, 251, 25, 230, 254, 238, 82, 1, + 87, 230, 254, 238, 82, 1, 230, 38, 230, 254, 238, 82, 1, 250, 116, 230, + 254, 238, 82, 1, 250, 203, 230, 254, 238, 82, 1, 237, 138, 230, 254, 238, + 82, 1, 235, 207, 230, 254, 238, 82, 1, 236, 17, 230, 254, 238, 82, 1, + 253, 4, 230, 254, 238, 82, 1, 253, 44, 230, 254, 238, 82, 1, 238, 175, + 230, 254, 238, 82, 1, 234, 91, 230, 254, 238, 82, 1, 239, 167, 230, 254, + 238, 82, 1, 234, 64, 230, 254, 238, 82, 1, 231, 216, 230, 254, 238, 82, + 1, 246, 67, 230, 254, 238, 82, 33, 21, 67, 230, 254, 238, 82, 33, 21, 71, + 230, 254, 238, 82, 33, 21, 79, 230, 254, 238, 82, 33, 21, 72, 230, 254, + 238, 82, 33, 21, 236, 202, 230, 254, 238, 82, 235, 203, 239, 65, 230, + 254, 238, 82, 235, 203, 239, 64, 230, 254, 238, 82, 235, 203, 239, 63, + 230, 254, 238, 82, 235, 203, 239, 62, 7, 9, 243, 187, 7, 9, 243, 186, 7, + 9, 243, 185, 7, 9, 243, 184, 7, 9, 243, 183, 7, 9, 243, 182, 7, 9, 243, + 181, 7, 9, 243, 180, 7, 9, 243, 179, 7, 9, 243, 178, 7, 9, 243, 177, 7, + 9, 243, 176, 7, 9, 243, 175, 7, 9, 243, 174, 7, 9, 243, 173, 7, 9, 243, + 172, 7, 9, 243, 171, 7, 9, 243, 170, 7, 9, 243, 169, 7, 9, 243, 168, 7, + 9, 243, 167, 7, 9, 243, 166, 7, 9, 243, 165, 7, 9, 243, 164, 7, 9, 243, + 163, 7, 9, 243, 162, 7, 9, 243, 161, 7, 9, 243, 160, 7, 9, 243, 159, 7, + 9, 243, 158, 7, 9, 243, 157, 7, 9, 243, 156, 7, 9, 243, 155, 7, 9, 243, + 154, 7, 9, 243, 153, 7, 9, 243, 152, 7, 9, 243, 151, 7, 9, 243, 150, 7, + 9, 243, 149, 7, 9, 243, 148, 7, 9, 243, 147, 7, 9, 243, 146, 7, 9, 243, + 145, 7, 9, 243, 144, 7, 9, 243, 143, 7, 9, 243, 142, 7, 9, 243, 141, 7, + 9, 243, 140, 7, 9, 243, 139, 7, 9, 243, 138, 7, 9, 243, 137, 7, 9, 243, + 136, 7, 9, 243, 135, 7, 9, 243, 134, 7, 9, 243, 133, 7, 9, 243, 132, 7, + 9, 243, 131, 7, 9, 243, 130, 7, 9, 243, 129, 7, 9, 243, 128, 7, 9, 243, + 127, 7, 9, 243, 126, 7, 9, 243, 125, 7, 9, 243, 124, 7, 9, 243, 123, 7, + 9, 243, 122, 7, 9, 243, 121, 7, 9, 243, 120, 7, 9, 243, 119, 7, 9, 243, + 118, 7, 9, 243, 117, 7, 9, 243, 116, 7, 9, 243, 115, 7, 9, 243, 114, 7, + 9, 243, 113, 7, 9, 243, 112, 7, 9, 243, 111, 7, 9, 243, 110, 7, 9, 243, + 109, 7, 9, 243, 108, 7, 9, 243, 107, 7, 9, 243, 106, 7, 9, 243, 105, 7, + 9, 243, 104, 7, 9, 243, 103, 7, 9, 243, 102, 7, 9, 243, 101, 7, 9, 243, + 100, 7, 9, 243, 99, 7, 9, 243, 98, 7, 9, 243, 97, 7, 9, 243, 96, 7, 9, + 243, 95, 7, 9, 243, 94, 7, 9, 243, 93, 7, 9, 243, 92, 7, 9, 243, 91, 7, + 9, 243, 90, 7, 9, 243, 89, 7, 9, 243, 88, 7, 9, 243, 87, 7, 9, 243, 86, + 7, 9, 243, 85, 7, 9, 243, 84, 7, 9, 243, 83, 7, 9, 243, 82, 7, 9, 243, + 81, 7, 9, 243, 80, 7, 9, 243, 79, 7, 9, 243, 78, 7, 9, 243, 77, 7, 9, + 243, 76, 7, 9, 243, 75, 7, 9, 243, 74, 7, 9, 243, 73, 7, 9, 243, 72, 7, + 9, 243, 71, 7, 9, 243, 70, 7, 9, 243, 69, 7, 9, 243, 68, 7, 9, 243, 67, + 7, 9, 243, 66, 7, 9, 243, 65, 7, 9, 243, 64, 7, 9, 243, 63, 7, 9, 243, + 62, 7, 9, 243, 61, 7, 9, 243, 60, 7, 9, 243, 59, 7, 9, 243, 58, 7, 9, + 243, 57, 7, 9, 243, 56, 7, 9, 243, 55, 7, 9, 243, 54, 7, 9, 243, 53, 7, + 9, 243, 52, 7, 9, 243, 51, 7, 9, 243, 50, 7, 9, 243, 49, 7, 9, 243, 48, + 7, 9, 243, 47, 7, 9, 243, 46, 7, 9, 243, 45, 7, 9, 243, 44, 7, 9, 243, + 43, 7, 9, 243, 42, 7, 9, 243, 41, 7, 9, 243, 40, 7, 9, 243, 39, 7, 9, + 243, 38, 7, 9, 243, 37, 7, 9, 243, 36, 7, 9, 243, 35, 7, 9, 243, 34, 7, + 9, 243, 33, 7, 9, 243, 32, 7, 9, 243, 31, 7, 9, 243, 30, 7, 9, 243, 29, + 7, 9, 243, 28, 7, 9, 243, 27, 7, 9, 243, 26, 7, 9, 243, 25, 7, 9, 243, + 24, 7, 9, 243, 23, 7, 9, 243, 22, 7, 9, 243, 21, 7, 9, 243, 20, 7, 9, + 243, 19, 7, 9, 243, 18, 7, 9, 243, 17, 7, 9, 243, 16, 7, 9, 243, 15, 7, + 9, 243, 14, 7, 9, 243, 13, 7, 9, 243, 12, 7, 9, 243, 11, 7, 9, 243, 10, + 7, 9, 243, 9, 7, 9, 243, 8, 7, 9, 243, 7, 7, 9, 243, 6, 7, 9, 243, 5, 7, + 9, 243, 4, 7, 9, 243, 3, 7, 9, 243, 2, 7, 9, 243, 1, 7, 9, 243, 0, 7, 9, + 242, 255, 7, 9, 242, 254, 7, 9, 242, 253, 7, 9, 242, 252, 7, 9, 242, 251, + 7, 9, 242, 250, 7, 9, 242, 249, 7, 9, 242, 248, 7, 9, 242, 247, 7, 9, + 242, 246, 7, 9, 242, 245, 7, 9, 242, 244, 7, 9, 242, 243, 7, 9, 242, 242, + 7, 9, 242, 241, 7, 9, 242, 240, 7, 9, 242, 239, 7, 9, 242, 238, 7, 9, + 242, 237, 7, 9, 242, 236, 7, 9, 242, 235, 7, 9, 242, 234, 7, 9, 242, 233, + 7, 9, 242, 232, 7, 9, 242, 231, 7, 9, 242, 230, 7, 9, 242, 229, 7, 9, + 242, 228, 7, 9, 242, 227, 7, 9, 242, 226, 7, 9, 242, 225, 7, 9, 242, 224, + 7, 9, 242, 223, 7, 9, 242, 222, 7, 9, 242, 221, 7, 9, 242, 220, 7, 9, + 242, 219, 7, 9, 242, 218, 7, 9, 242, 217, 7, 9, 242, 216, 7, 9, 242, 215, + 7, 9, 242, 214, 7, 9, 242, 213, 7, 9, 242, 212, 7, 9, 242, 211, 7, 9, + 242, 210, 7, 9, 242, 209, 7, 9, 242, 208, 7, 9, 242, 207, 7, 9, 242, 206, + 7, 9, 242, 205, 7, 9, 242, 204, 7, 9, 242, 203, 7, 9, 242, 202, 7, 9, + 242, 201, 7, 9, 242, 200, 7, 9, 242, 199, 7, 9, 242, 198, 7, 9, 242, 197, + 7, 9, 242, 196, 7, 9, 242, 195, 7, 9, 242, 194, 7, 9, 242, 193, 7, 9, + 242, 192, 7, 9, 242, 191, 7, 9, 242, 190, 7, 9, 242, 189, 7, 9, 242, 188, + 7, 9, 242, 187, 7, 9, 242, 186, 7, 9, 242, 185, 7, 9, 242, 184, 7, 9, + 242, 183, 7, 9, 242, 182, 7, 9, 242, 181, 7, 9, 242, 180, 7, 9, 242, 179, + 7, 9, 242, 178, 7, 9, 242, 177, 7, 9, 242, 176, 7, 9, 242, 175, 7, 9, + 242, 174, 7, 9, 242, 173, 7, 9, 242, 172, 7, 9, 242, 171, 7, 9, 242, 170, + 7, 9, 242, 169, 7, 9, 242, 168, 7, 9, 242, 167, 7, 9, 242, 166, 7, 9, + 242, 165, 7, 9, 242, 164, 7, 9, 242, 163, 7, 9, 242, 162, 7, 9, 242, 161, + 7, 9, 242, 160, 7, 9, 242, 159, 7, 9, 242, 158, 7, 9, 242, 157, 7, 9, + 242, 156, 7, 9, 242, 155, 7, 9, 242, 154, 7, 9, 242, 153, 7, 9, 242, 152, + 7, 9, 242, 151, 7, 9, 242, 150, 7, 9, 242, 149, 7, 9, 242, 148, 7, 9, + 242, 147, 7, 9, 242, 146, 7, 9, 242, 145, 7, 9, 242, 144, 7, 9, 242, 143, + 7, 9, 242, 142, 7, 9, 242, 141, 7, 9, 242, 140, 7, 9, 242, 139, 7, 9, + 242, 138, 7, 9, 242, 137, 7, 9, 242, 136, 7, 9, 242, 135, 7, 9, 242, 134, + 7, 9, 242, 133, 7, 9, 242, 132, 7, 9, 242, 131, 7, 9, 242, 130, 7, 9, + 242, 129, 7, 9, 242, 128, 7, 9, 242, 127, 7, 9, 242, 126, 7, 9, 242, 125, + 7, 9, 242, 124, 7, 9, 242, 123, 7, 9, 242, 122, 7, 9, 242, 121, 7, 9, + 242, 120, 7, 9, 242, 119, 7, 9, 242, 118, 7, 9, 242, 117, 7, 9, 242, 116, + 7, 9, 242, 115, 7, 9, 242, 114, 7, 9, 242, 113, 7, 9, 242, 112, 7, 9, + 242, 111, 7, 9, 242, 110, 7, 9, 242, 109, 7, 9, 242, 108, 7, 9, 242, 107, + 7, 9, 242, 106, 7, 9, 242, 105, 7, 9, 242, 104, 7, 9, 242, 103, 7, 9, + 242, 102, 7, 9, 242, 101, 7, 9, 242, 100, 7, 9, 242, 99, 7, 9, 242, 98, + 7, 9, 242, 97, 7, 9, 242, 96, 7, 9, 242, 95, 7, 9, 242, 94, 7, 9, 242, + 93, 7, 9, 242, 92, 7, 9, 242, 91, 7, 9, 242, 90, 7, 9, 242, 89, 7, 9, + 242, 88, 7, 9, 242, 87, 7, 9, 242, 86, 7, 9, 242, 85, 7, 9, 242, 84, 7, + 9, 242, 83, 7, 9, 242, 82, 7, 9, 242, 81, 7, 9, 242, 80, 7, 9, 242, 79, + 7, 9, 242, 78, 7, 9, 242, 77, 7, 9, 242, 76, 7, 9, 242, 75, 7, 9, 242, + 74, 7, 9, 242, 73, 7, 9, 242, 72, 7, 9, 242, 71, 7, 9, 242, 70, 7, 9, + 242, 69, 7, 9, 242, 68, 7, 9, 242, 67, 7, 9, 242, 66, 7, 9, 242, 65, 7, + 9, 242, 64, 7, 9, 242, 63, 7, 9, 242, 62, 7, 9, 242, 61, 7, 9, 242, 60, + 7, 9, 242, 59, 7, 9, 242, 58, 7, 9, 242, 57, 7, 9, 242, 56, 7, 9, 242, + 55, 7, 9, 242, 54, 7, 9, 242, 53, 7, 9, 242, 52, 7, 9, 242, 51, 7, 9, + 242, 50, 7, 9, 242, 49, 7, 9, 242, 48, 7, 9, 242, 47, 7, 9, 242, 46, 7, + 9, 242, 45, 7, 9, 242, 44, 7, 9, 242, 43, 7, 9, 242, 42, 7, 9, 242, 41, + 7, 9, 242, 40, 7, 9, 242, 39, 7, 9, 242, 38, 7, 9, 242, 37, 7, 9, 242, + 36, 7, 9, 242, 35, 7, 9, 242, 34, 7, 9, 242, 33, 7, 9, 242, 32, 7, 9, + 242, 31, 7, 9, 242, 30, 7, 9, 242, 29, 7, 9, 242, 28, 7, 9, 242, 27, 7, + 9, 242, 26, 7, 9, 242, 25, 7, 9, 242, 24, 7, 9, 242, 23, 7, 9, 242, 22, + 7, 9, 242, 21, 7, 9, 242, 20, 7, 9, 242, 19, 7, 9, 242, 18, 7, 9, 242, + 17, 7, 9, 242, 16, 7, 9, 242, 15, 7, 9, 242, 14, 7, 9, 242, 13, 7, 9, + 242, 12, 7, 9, 242, 11, 7, 9, 242, 10, 7, 9, 242, 9, 7, 9, 242, 8, 7, 9, + 242, 7, 7, 9, 242, 6, 7, 9, 242, 5, 7, 9, 242, 4, 7, 9, 242, 3, 7, 9, + 242, 2, 7, 9, 242, 1, 7, 9, 242, 0, 7, 9, 241, 255, 7, 9, 241, 254, 7, 9, + 241, 253, 7, 9, 241, 252, 7, 9, 241, 251, 7, 9, 241, 250, 7, 9, 241, 249, + 7, 9, 241, 248, 7, 9, 241, 247, 7, 9, 241, 246, 7, 9, 241, 245, 7, 9, + 241, 244, 7, 9, 241, 243, 7, 9, 241, 242, 7, 9, 241, 241, 7, 9, 241, 240, + 7, 9, 241, 239, 7, 9, 241, 238, 7, 9, 241, 237, 7, 9, 241, 236, 7, 9, + 241, 235, 7, 9, 241, 234, 7, 9, 241, 233, 8, 3, 18, 248, 85, 8, 3, 18, + 248, 81, 8, 3, 18, 248, 44, 8, 3, 18, 248, 84, 8, 3, 18, 248, 83, 8, 3, + 18, 183, 234, 11, 214, 8, 3, 18, 231, 123, 100, 3, 18, 239, 16, 237, 109, + 100, 3, 18, 239, 16, 249, 24, 100, 3, 18, 239, 16, 241, 172, 100, 3, 18, + 228, 196, 237, 109, 100, 3, 18, 239, 16, 228, 49, 68, 1, 227, 160, 2, + 246, 154, 68, 235, 202, 241, 35, 228, 223, 68, 18, 227, 184, 227, 160, + 227, 160, 236, 93, 68, 1, 255, 17, 254, 123, 68, 1, 228, 91, 255, 38, 68, + 1, 228, 91, 251, 78, 68, 1, 228, 91, 246, 210, 68, 1, 228, 91, 241, 5, + 68, 1, 228, 91, 240, 19, 68, 1, 228, 91, 30, 239, 20, 68, 1, 228, 91, + 234, 170, 68, 1, 228, 91, 230, 143, 68, 1, 255, 17, 235, 214, 52, 68, 1, + 232, 103, 2, 232, 103, 250, 100, 68, 1, 232, 103, 2, 232, 32, 250, 100, + 68, 1, 232, 103, 2, 251, 93, 19, 232, 103, 250, 100, 68, 1, 232, 103, 2, + 251, 93, 19, 232, 32, 250, 100, 68, 1, 83, 2, 236, 93, 68, 1, 83, 2, 235, + 80, 68, 1, 83, 2, 239, 74, 68, 1, 253, 56, 2, 251, 92, 68, 1, 247, 88, 2, + 251, 92, 68, 1, 251, 79, 2, 251, 92, 68, 1, 246, 211, 2, 239, 74, 68, 1, + 228, 217, 2, 251, 92, 68, 1, 227, 89, 2, 251, 92, 68, 1, 230, 103, 2, + 251, 92, 68, 1, 227, 160, 2, 251, 92, 68, 1, 30, 241, 6, 2, 251, 92, 68, + 1, 241, 6, 2, 251, 92, 68, 1, 240, 20, 2, 251, 92, 68, 1, 239, 21, 2, + 251, 92, 68, 1, 237, 75, 2, 251, 92, 68, 1, 233, 243, 2, 251, 92, 68, 1, + 30, 236, 81, 2, 251, 92, 68, 1, 236, 81, 2, 251, 92, 68, 1, 229, 146, 2, + 251, 92, 68, 1, 235, 47, 2, 251, 92, 68, 1, 234, 171, 2, 251, 92, 68, 1, + 232, 103, 2, 251, 92, 68, 1, 230, 144, 2, 251, 92, 68, 1, 228, 217, 2, + 246, 64, 68, 1, 253, 56, 2, 234, 226, 68, 1, 241, 6, 2, 234, 226, 68, 1, + 236, 81, 2, 234, 226, 68, 18, 83, 240, 19, 11, 1, 83, 228, 129, 39, 13, + 11, 1, 83, 228, 129, 30, 13, 11, 1, 253, 84, 39, 13, 11, 1, 253, 84, 30, + 13, 11, 1, 253, 84, 54, 13, 11, 1, 253, 84, 113, 13, 11, 1, 236, 71, 39, + 13, 11, 1, 236, 71, 30, 13, 11, 1, 236, 71, 54, 13, 11, 1, 236, 71, 113, + 13, 11, 1, 253, 76, 39, 13, 11, 1, 253, 76, 30, 13, 11, 1, 253, 76, 54, + 13, 11, 1, 253, 76, 113, 13, 11, 1, 229, 123, 39, 13, 11, 1, 229, 123, + 30, 13, 11, 1, 229, 123, 54, 13, 11, 1, 229, 123, 113, 13, 11, 1, 230, + 122, 39, 13, 11, 1, 230, 122, 30, 13, 11, 1, 230, 122, 54, 13, 11, 1, + 230, 122, 113, 13, 11, 1, 229, 125, 39, 13, 11, 1, 229, 125, 30, 13, 11, + 1, 229, 125, 54, 13, 11, 1, 229, 125, 113, 13, 11, 1, 228, 207, 39, 13, + 11, 1, 228, 207, 30, 13, 11, 1, 228, 207, 54, 13, 11, 1, 228, 207, 113, + 13, 11, 1, 236, 69, 39, 13, 11, 1, 236, 69, 30, 13, 11, 1, 236, 69, 54, + 13, 11, 1, 236, 69, 113, 13, 11, 1, 249, 53, 39, 13, 11, 1, 249, 53, 30, + 13, 11, 1, 249, 53, 54, 13, 11, 1, 249, 53, 113, 13, 11, 1, 237, 51, 39, + 13, 11, 1, 237, 51, 30, 13, 11, 1, 237, 51, 54, 13, 11, 1, 237, 51, 113, + 13, 11, 1, 230, 136, 39, 13, 11, 1, 230, 136, 30, 13, 11, 1, 230, 136, + 54, 13, 11, 1, 230, 136, 113, 13, 11, 1, 230, 134, 39, 13, 11, 1, 230, + 134, 30, 13, 11, 1, 230, 134, 54, 13, 11, 1, 230, 134, 113, 13, 11, 1, + 251, 39, 39, 13, 11, 1, 251, 39, 30, 13, 11, 1, 251, 89, 39, 13, 11, 1, + 251, 89, 30, 13, 11, 1, 249, 69, 39, 13, 11, 1, 249, 69, 30, 13, 11, 1, + 251, 37, 39, 13, 11, 1, 251, 37, 30, 13, 11, 1, 241, 95, 39, 13, 11, 1, + 241, 95, 30, 13, 11, 1, 234, 69, 39, 13, 11, 1, 234, 69, 30, 13, 11, 1, + 240, 213, 39, 13, 11, 1, 240, 213, 30, 13, 11, 1, 240, 213, 54, 13, 11, + 1, 240, 213, 113, 13, 11, 1, 247, 203, 39, 13, 11, 1, 247, 203, 30, 13, + 11, 1, 247, 203, 54, 13, 11, 1, 247, 203, 113, 13, 11, 1, 247, 29, 39, + 13, 11, 1, 247, 29, 30, 13, 11, 1, 247, 29, 54, 13, 11, 1, 247, 29, 113, + 13, 11, 1, 237, 221, 39, 13, 11, 1, 237, 221, 30, 13, 11, 1, 237, 221, + 54, 13, 11, 1, 237, 221, 113, 13, 11, 1, 198, 247, 100, 39, 13, 11, 1, + 198, 247, 100, 30, 13, 11, 1, 234, 94, 39, 13, 11, 1, 234, 94, 30, 13, + 11, 1, 234, 94, 54, 13, 11, 1, 234, 94, 113, 13, 11, 1, 246, 197, 2, 57, + 60, 39, 13, 11, 1, 246, 197, 2, 57, 60, 30, 13, 11, 1, 246, 197, 247, 70, + 39, 13, 11, 1, 246, 197, 247, 70, 30, 13, 11, 1, 246, 197, 247, 70, 54, + 13, 11, 1, 246, 197, 247, 70, 113, 13, 11, 1, 246, 197, 250, 114, 39, 13, + 11, 1, 246, 197, 250, 114, 30, 13, 11, 1, 246, 197, 250, 114, 54, 13, 11, + 1, 246, 197, 250, 114, 113, 13, 11, 1, 57, 253, 139, 39, 13, 11, 1, 57, + 253, 139, 30, 13, 11, 1, 57, 253, 139, 2, 143, 60, 39, 13, 11, 1, 57, + 253, 139, 2, 143, 60, 30, 13, 11, 1, 237, 245, 39, 13, 11, 1, 237, 245, + 30, 13, 11, 1, 237, 245, 54, 13, 11, 1, 237, 245, 113, 13, 11, 1, 132, + 39, 13, 11, 1, 132, 30, 13, 11, 1, 236, 235, 39, 13, 11, 1, 236, 235, 30, + 13, 11, 1, 227, 143, 39, 13, 11, 1, 227, 143, 30, 13, 11, 1, 132, 2, 143, + 60, 39, 13, 11, 1, 228, 213, 39, 13, 11, 1, 228, 213, 30, 13, 11, 1, 240, + 157, 236, 235, 39, 13, 11, 1, 240, 157, 236, 235, 30, 13, 11, 1, 240, + 157, 227, 143, 39, 13, 11, 1, 240, 157, 227, 143, 30, 13, 11, 1, 157, 39, + 13, 11, 1, 157, 30, 13, 11, 1, 157, 54, 13, 11, 1, 157, 113, 13, 11, 1, + 229, 28, 240, 222, 240, 157, 83, 150, 54, 13, 11, 1, 229, 28, 240, 222, + 240, 157, 83, 150, 113, 13, 11, 18, 57, 2, 143, 60, 2, 83, 39, 13, 11, + 18, 57, 2, 143, 60, 2, 83, 30, 13, 11, 18, 57, 2, 143, 60, 2, 255, 76, + 39, 13, 11, 18, 57, 2, 143, 60, 2, 255, 76, 30, 13, 11, 18, 57, 2, 143, + 60, 2, 228, 116, 39, 13, 11, 18, 57, 2, 143, 60, 2, 228, 116, 30, 13, 11, + 18, 57, 2, 143, 60, 2, 132, 39, 13, 11, 18, 57, 2, 143, 60, 2, 132, 30, + 13, 11, 18, 57, 2, 143, 60, 2, 236, 235, 39, 13, 11, 18, 57, 2, 143, 60, + 2, 236, 235, 30, 13, 11, 18, 57, 2, 143, 60, 2, 227, 143, 39, 13, 11, 18, + 57, 2, 143, 60, 2, 227, 143, 30, 13, 11, 18, 57, 2, 143, 60, 2, 157, 39, + 13, 11, 18, 57, 2, 143, 60, 2, 157, 30, 13, 11, 18, 57, 2, 143, 60, 2, + 157, 54, 13, 11, 18, 229, 28, 240, 157, 57, 2, 143, 60, 2, 83, 150, 39, + 13, 11, 18, 229, 28, 240, 157, 57, 2, 143, 60, 2, 83, 150, 30, 13, 11, + 18, 229, 28, 240, 157, 57, 2, 143, 60, 2, 83, 150, 54, 13, 11, 1, 248, + 117, 57, 39, 13, 11, 1, 248, 117, 57, 30, 13, 11, 1, 248, 117, 57, 54, + 13, 11, 1, 248, 117, 57, 113, 13, 11, 18, 57, 2, 143, 60, 2, 103, 39, 13, 11, 18, 57, 2, 143, 60, 2, 94, 39, 13, 11, 18, 57, 2, 143, 60, 2, 51, 39, 13, 11, 18, 57, 2, 143, 60, 2, 83, 150, 39, 13, 11, 18, 57, 2, 143, 60, - 2, 57, 39, 13, 11, 18, 253, 136, 2, 103, 39, 13, 11, 18, 253, 136, 2, 94, - 39, 13, 11, 18, 253, 136, 2, 164, 39, 13, 11, 18, 253, 136, 2, 51, 39, - 13, 11, 18, 253, 136, 2, 83, 150, 39, 13, 11, 18, 253, 136, 2, 57, 39, - 13, 11, 18, 253, 127, 2, 103, 39, 13, 11, 18, 253, 127, 2, 94, 39, 13, - 11, 18, 253, 127, 2, 164, 39, 13, 11, 18, 253, 127, 2, 51, 39, 13, 11, - 18, 253, 127, 2, 83, 150, 39, 13, 11, 18, 253, 127, 2, 57, 39, 13, 11, - 18, 248, 70, 2, 103, 39, 13, 11, 18, 248, 70, 2, 51, 39, 13, 11, 18, 248, - 70, 2, 83, 150, 39, 13, 11, 18, 248, 70, 2, 57, 39, 13, 11, 18, 103, 2, - 94, 39, 13, 11, 18, 103, 2, 51, 39, 13, 11, 18, 94, 2, 103, 39, 13, 11, - 18, 94, 2, 51, 39, 13, 11, 18, 164, 2, 103, 39, 13, 11, 18, 164, 2, 94, - 39, 13, 11, 18, 164, 2, 51, 39, 13, 11, 18, 248, 39, 2, 103, 39, 13, 11, - 18, 248, 39, 2, 94, 39, 13, 11, 18, 248, 39, 2, 164, 39, 13, 11, 18, 248, - 39, 2, 51, 39, 13, 11, 18, 253, 157, 2, 94, 39, 13, 11, 18, 253, 157, 2, - 51, 39, 13, 11, 18, 253, 155, 2, 103, 39, 13, 11, 18, 253, 155, 2, 94, - 39, 13, 11, 18, 253, 155, 2, 164, 39, 13, 11, 18, 253, 155, 2, 51, 39, - 13, 11, 18, 253, 169, 2, 94, 39, 13, 11, 18, 253, 169, 2, 51, 39, 13, 11, - 18, 253, 255, 2, 51, 39, 13, 11, 18, 253, 158, 2, 103, 39, 13, 11, 18, - 253, 158, 2, 51, 39, 13, 11, 18, 242, 240, 2, 103, 39, 13, 11, 18, 242, - 240, 2, 51, 39, 13, 11, 18, 253, 153, 2, 103, 39, 13, 11, 18, 253, 153, - 2, 94, 39, 13, 11, 18, 253, 153, 2, 164, 39, 13, 11, 18, 253, 153, 2, 51, - 39, 13, 11, 18, 253, 153, 2, 83, 150, 39, 13, 11, 18, 253, 153, 2, 57, - 39, 13, 11, 18, 253, 167, 2, 94, 39, 13, 11, 18, 253, 167, 2, 51, 39, 13, - 11, 18, 253, 167, 2, 83, 150, 39, 13, 11, 18, 253, 167, 2, 57, 39, 13, - 11, 18, 253, 135, 2, 83, 39, 13, 11, 18, 253, 135, 2, 103, 39, 13, 11, - 18, 253, 135, 2, 94, 39, 13, 11, 18, 253, 135, 2, 164, 39, 13, 11, 18, - 253, 135, 2, 182, 39, 13, 11, 18, 253, 135, 2, 51, 39, 13, 11, 18, 253, - 135, 2, 83, 150, 39, 13, 11, 18, 253, 135, 2, 57, 39, 13, 11, 18, 182, 2, - 103, 39, 13, 11, 18, 182, 2, 94, 39, 13, 11, 18, 182, 2, 164, 39, 13, 11, - 18, 182, 2, 51, 39, 13, 11, 18, 182, 2, 83, 150, 39, 13, 11, 18, 182, 2, - 57, 39, 13, 11, 18, 51, 2, 103, 39, 13, 11, 18, 51, 2, 94, 39, 13, 11, - 18, 51, 2, 164, 39, 13, 11, 18, 51, 2, 51, 39, 13, 11, 18, 51, 2, 83, - 150, 39, 13, 11, 18, 51, 2, 57, 39, 13, 11, 18, 198, 2, 103, 39, 13, 11, - 18, 198, 2, 94, 39, 13, 11, 18, 198, 2, 164, 39, 13, 11, 18, 198, 2, 51, - 39, 13, 11, 18, 198, 2, 83, 150, 39, 13, 11, 18, 198, 2, 57, 39, 13, 11, - 18, 253, 124, 2, 103, 39, 13, 11, 18, 253, 124, 2, 51, 39, 13, 11, 18, - 253, 124, 2, 83, 150, 39, 13, 11, 18, 253, 124, 2, 57, 39, 13, 11, 18, - 57, 2, 103, 39, 13, 11, 18, 57, 2, 94, 39, 13, 11, 18, 57, 2, 164, 39, - 13, 11, 18, 57, 2, 51, 39, 13, 11, 18, 57, 2, 83, 150, 39, 13, 11, 18, - 57, 2, 57, 39, 13, 11, 18, 249, 0, 2, 233, 49, 83, 39, 13, 11, 18, 253, - 143, 2, 233, 49, 83, 39, 13, 11, 18, 83, 150, 2, 233, 49, 83, 39, 13, 11, - 18, 240, 47, 2, 237, 1, 39, 13, 11, 18, 240, 47, 2, 237, 15, 39, 13, 11, - 18, 240, 47, 2, 243, 40, 39, 13, 11, 18, 240, 47, 2, 243, 56, 39, 13, 11, - 18, 240, 47, 2, 243, 63, 39, 13, 11, 18, 240, 47, 2, 233, 49, 83, 39, 13, - 11, 18, 57, 2, 143, 60, 2, 253, 143, 30, 13, 11, 18, 57, 2, 143, 60, 2, - 248, 104, 30, 13, 11, 18, 57, 2, 143, 60, 2, 51, 30, 13, 11, 18, 57, 2, - 143, 60, 2, 198, 30, 13, 11, 18, 57, 2, 143, 60, 2, 83, 150, 30, 13, 11, - 18, 57, 2, 143, 60, 2, 57, 30, 13, 11, 18, 253, 136, 2, 253, 143, 30, 13, - 11, 18, 253, 136, 2, 248, 104, 30, 13, 11, 18, 253, 136, 2, 51, 30, 13, - 11, 18, 253, 136, 2, 198, 30, 13, 11, 18, 253, 136, 2, 83, 150, 30, 13, - 11, 18, 253, 136, 2, 57, 30, 13, 11, 18, 253, 127, 2, 253, 143, 30, 13, - 11, 18, 253, 127, 2, 248, 104, 30, 13, 11, 18, 253, 127, 2, 51, 30, 13, - 11, 18, 253, 127, 2, 198, 30, 13, 11, 18, 253, 127, 2, 83, 150, 30, 13, - 11, 18, 253, 127, 2, 57, 30, 13, 11, 18, 248, 70, 2, 253, 143, 30, 13, - 11, 18, 248, 70, 2, 248, 104, 30, 13, 11, 18, 248, 70, 2, 51, 30, 13, 11, - 18, 248, 70, 2, 198, 30, 13, 11, 18, 248, 70, 2, 83, 150, 30, 13, 11, 18, - 248, 70, 2, 57, 30, 13, 11, 18, 253, 153, 2, 83, 150, 30, 13, 11, 18, - 253, 153, 2, 57, 30, 13, 11, 18, 253, 167, 2, 83, 150, 30, 13, 11, 18, - 253, 167, 2, 57, 30, 13, 11, 18, 253, 135, 2, 83, 30, 13, 11, 18, 253, - 135, 2, 182, 30, 13, 11, 18, 253, 135, 2, 51, 30, 13, 11, 18, 253, 135, - 2, 83, 150, 30, 13, 11, 18, 253, 135, 2, 57, 30, 13, 11, 18, 182, 2, 51, - 30, 13, 11, 18, 182, 2, 83, 150, 30, 13, 11, 18, 182, 2, 57, 30, 13, 11, - 18, 51, 2, 83, 30, 13, 11, 18, 51, 2, 51, 30, 13, 11, 18, 198, 2, 253, - 143, 30, 13, 11, 18, 198, 2, 248, 104, 30, 13, 11, 18, 198, 2, 51, 30, - 13, 11, 18, 198, 2, 198, 30, 13, 11, 18, 198, 2, 83, 150, 30, 13, 11, 18, - 198, 2, 57, 30, 13, 11, 18, 83, 150, 2, 233, 49, 83, 30, 13, 11, 18, 57, - 2, 253, 143, 30, 13, 11, 18, 57, 2, 248, 104, 30, 13, 11, 18, 57, 2, 51, - 30, 13, 11, 18, 57, 2, 198, 30, 13, 11, 18, 57, 2, 83, 150, 30, 13, 11, - 18, 57, 2, 57, 30, 13, 11, 18, 57, 2, 143, 60, 2, 103, 54, 13, 11, 18, - 57, 2, 143, 60, 2, 94, 54, 13, 11, 18, 57, 2, 143, 60, 2, 164, 54, 13, - 11, 18, 57, 2, 143, 60, 2, 51, 54, 13, 11, 18, 57, 2, 143, 60, 2, 253, - 124, 54, 13, 11, 18, 253, 136, 2, 103, 54, 13, 11, 18, 253, 136, 2, 94, - 54, 13, 11, 18, 253, 136, 2, 164, 54, 13, 11, 18, 253, 136, 2, 51, 54, - 13, 11, 18, 253, 136, 2, 253, 124, 54, 13, 11, 18, 253, 127, 2, 103, 54, - 13, 11, 18, 253, 127, 2, 94, 54, 13, 11, 18, 253, 127, 2, 164, 54, 13, - 11, 18, 253, 127, 2, 51, 54, 13, 11, 18, 253, 127, 2, 253, 124, 54, 13, - 11, 18, 248, 70, 2, 51, 54, 13, 11, 18, 103, 2, 94, 54, 13, 11, 18, 103, - 2, 51, 54, 13, 11, 18, 94, 2, 103, 54, 13, 11, 18, 94, 2, 51, 54, 13, 11, - 18, 164, 2, 103, 54, 13, 11, 18, 164, 2, 51, 54, 13, 11, 18, 248, 39, 2, - 103, 54, 13, 11, 18, 248, 39, 2, 94, 54, 13, 11, 18, 248, 39, 2, 164, 54, - 13, 11, 18, 248, 39, 2, 51, 54, 13, 11, 18, 253, 157, 2, 94, 54, 13, 11, - 18, 253, 157, 2, 164, 54, 13, 11, 18, 253, 157, 2, 51, 54, 13, 11, 18, - 253, 155, 2, 103, 54, 13, 11, 18, 253, 155, 2, 94, 54, 13, 11, 18, 253, - 155, 2, 164, 54, 13, 11, 18, 253, 155, 2, 51, 54, 13, 11, 18, 253, 169, - 2, 94, 54, 13, 11, 18, 253, 255, 2, 51, 54, 13, 11, 18, 253, 158, 2, 103, - 54, 13, 11, 18, 253, 158, 2, 51, 54, 13, 11, 18, 242, 240, 2, 103, 54, - 13, 11, 18, 242, 240, 2, 51, 54, 13, 11, 18, 253, 153, 2, 103, 54, 13, - 11, 18, 253, 153, 2, 94, 54, 13, 11, 18, 253, 153, 2, 164, 54, 13, 11, - 18, 253, 153, 2, 51, 54, 13, 11, 18, 253, 167, 2, 94, 54, 13, 11, 18, - 253, 167, 2, 51, 54, 13, 11, 18, 253, 135, 2, 103, 54, 13, 11, 18, 253, - 135, 2, 94, 54, 13, 11, 18, 253, 135, 2, 164, 54, 13, 11, 18, 253, 135, - 2, 182, 54, 13, 11, 18, 253, 135, 2, 51, 54, 13, 11, 18, 182, 2, 103, 54, - 13, 11, 18, 182, 2, 94, 54, 13, 11, 18, 182, 2, 164, 54, 13, 11, 18, 182, - 2, 51, 54, 13, 11, 18, 182, 2, 253, 124, 54, 13, 11, 18, 51, 2, 103, 54, - 13, 11, 18, 51, 2, 94, 54, 13, 11, 18, 51, 2, 164, 54, 13, 11, 18, 51, 2, - 51, 54, 13, 11, 18, 198, 2, 103, 54, 13, 11, 18, 198, 2, 94, 54, 13, 11, - 18, 198, 2, 164, 54, 13, 11, 18, 198, 2, 51, 54, 13, 11, 18, 198, 2, 253, - 124, 54, 13, 11, 18, 253, 124, 2, 103, 54, 13, 11, 18, 253, 124, 2, 51, - 54, 13, 11, 18, 253, 124, 2, 233, 49, 83, 54, 13, 11, 18, 57, 2, 103, 54, - 13, 11, 18, 57, 2, 94, 54, 13, 11, 18, 57, 2, 164, 54, 13, 11, 18, 57, 2, - 51, 54, 13, 11, 18, 57, 2, 253, 124, 54, 13, 11, 18, 57, 2, 143, 60, 2, - 51, 113, 13, 11, 18, 57, 2, 143, 60, 2, 253, 124, 113, 13, 11, 18, 253, - 136, 2, 51, 113, 13, 11, 18, 253, 136, 2, 253, 124, 113, 13, 11, 18, 253, - 127, 2, 51, 113, 13, 11, 18, 253, 127, 2, 253, 124, 113, 13, 11, 18, 248, - 70, 2, 51, 113, 13, 11, 18, 248, 70, 2, 253, 124, 113, 13, 11, 18, 248, - 39, 2, 51, 113, 13, 11, 18, 248, 39, 2, 253, 124, 113, 13, 11, 18, 242, - 216, 2, 51, 113, 13, 11, 18, 242, 216, 2, 253, 124, 113, 13, 11, 18, 253, - 135, 2, 182, 113, 13, 11, 18, 253, 135, 2, 51, 113, 13, 11, 18, 182, 2, - 51, 113, 13, 11, 18, 198, 2, 51, 113, 13, 11, 18, 198, 2, 253, 124, 113, - 13, 11, 18, 57, 2, 51, 113, 13, 11, 18, 57, 2, 253, 124, 113, 13, 11, 18, - 240, 47, 2, 243, 40, 113, 13, 11, 18, 240, 47, 2, 243, 56, 113, 13, 11, - 18, 240, 47, 2, 243, 63, 113, 13, 11, 18, 253, 169, 2, 83, 150, 39, 13, - 11, 18, 253, 169, 2, 57, 39, 13, 11, 18, 253, 158, 2, 83, 150, 39, 13, - 11, 18, 253, 158, 2, 57, 39, 13, 11, 18, 242, 240, 2, 83, 150, 39, 13, - 11, 18, 242, 240, 2, 57, 39, 13, 11, 18, 248, 39, 2, 83, 150, 39, 13, 11, - 18, 248, 39, 2, 57, 39, 13, 11, 18, 242, 216, 2, 83, 150, 39, 13, 11, 18, - 242, 216, 2, 57, 39, 13, 11, 18, 94, 2, 83, 150, 39, 13, 11, 18, 94, 2, - 57, 39, 13, 11, 18, 103, 2, 83, 150, 39, 13, 11, 18, 103, 2, 57, 39, 13, - 11, 18, 164, 2, 83, 150, 39, 13, 11, 18, 164, 2, 57, 39, 13, 11, 18, 253, - 157, 2, 83, 150, 39, 13, 11, 18, 253, 157, 2, 57, 39, 13, 11, 18, 253, - 155, 2, 83, 150, 39, 13, 11, 18, 253, 155, 2, 57, 39, 13, 11, 18, 242, - 216, 2, 103, 39, 13, 11, 18, 242, 216, 2, 94, 39, 13, 11, 18, 242, 216, - 2, 164, 39, 13, 11, 18, 242, 216, 2, 51, 39, 13, 11, 18, 242, 216, 2, - 253, 143, 39, 13, 11, 18, 248, 39, 2, 253, 143, 39, 13, 11, 18, 253, 157, - 2, 253, 143, 39, 13, 11, 18, 253, 155, 2, 253, 143, 39, 13, 11, 18, 253, - 169, 2, 83, 150, 30, 13, 11, 18, 253, 169, 2, 57, 30, 13, 11, 18, 253, - 158, 2, 83, 150, 30, 13, 11, 18, 253, 158, 2, 57, 30, 13, 11, 18, 242, - 240, 2, 83, 150, 30, 13, 11, 18, 242, 240, 2, 57, 30, 13, 11, 18, 248, - 39, 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 57, 30, 13, 11, 18, 242, 216, - 2, 83, 150, 30, 13, 11, 18, 242, 216, 2, 57, 30, 13, 11, 18, 94, 2, 83, - 150, 30, 13, 11, 18, 94, 2, 57, 30, 13, 11, 18, 103, 2, 83, 150, 30, 13, - 11, 18, 103, 2, 57, 30, 13, 11, 18, 164, 2, 83, 150, 30, 13, 11, 18, 164, - 2, 57, 30, 13, 11, 18, 253, 157, 2, 83, 150, 30, 13, 11, 18, 253, 157, 2, - 57, 30, 13, 11, 18, 253, 155, 2, 83, 150, 30, 13, 11, 18, 253, 155, 2, - 57, 30, 13, 11, 18, 242, 216, 2, 103, 30, 13, 11, 18, 242, 216, 2, 94, - 30, 13, 11, 18, 242, 216, 2, 164, 30, 13, 11, 18, 242, 216, 2, 51, 30, - 13, 11, 18, 242, 216, 2, 253, 143, 30, 13, 11, 18, 248, 39, 2, 253, 143, - 30, 13, 11, 18, 253, 157, 2, 253, 143, 30, 13, 11, 18, 253, 155, 2, 253, - 143, 30, 13, 11, 18, 242, 216, 2, 103, 54, 13, 11, 18, 242, 216, 2, 94, - 54, 13, 11, 18, 242, 216, 2, 164, 54, 13, 11, 18, 242, 216, 2, 51, 54, - 13, 11, 18, 248, 39, 2, 253, 124, 54, 13, 11, 18, 242, 216, 2, 253, 124, - 54, 13, 11, 18, 253, 169, 2, 51, 54, 13, 11, 18, 248, 39, 2, 103, 113, - 13, 11, 18, 248, 39, 2, 94, 113, 13, 11, 18, 248, 39, 2, 164, 113, 13, - 11, 18, 242, 216, 2, 103, 113, 13, 11, 18, 242, 216, 2, 94, 113, 13, 11, - 18, 242, 216, 2, 164, 113, 13, 11, 18, 253, 169, 2, 51, 113, 13, 11, 18, - 253, 255, 2, 51, 113, 13, 11, 18, 83, 2, 236, 214, 30, 13, 11, 18, 83, 2, - 236, 214, 39, 13, 240, 206, 40, 232, 74, 240, 206, 38, 232, 74, 11, 18, - 253, 127, 2, 103, 2, 51, 54, 13, 11, 18, 253, 127, 2, 94, 2, 103, 30, 13, - 11, 18, 253, 127, 2, 94, 2, 103, 54, 13, 11, 18, 253, 127, 2, 94, 2, 51, - 54, 13, 11, 18, 253, 127, 2, 164, 2, 51, 54, 13, 11, 18, 253, 127, 2, 51, - 2, 103, 54, 13, 11, 18, 253, 127, 2, 51, 2, 94, 54, 13, 11, 18, 253, 127, - 2, 51, 2, 164, 54, 13, 11, 18, 103, 2, 51, 2, 94, 30, 13, 11, 18, 103, 2, - 51, 2, 94, 54, 13, 11, 18, 94, 2, 51, 2, 57, 30, 13, 11, 18, 94, 2, 51, - 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 94, 2, 103, 54, 13, 11, 18, 248, - 39, 2, 103, 2, 94, 54, 13, 11, 18, 248, 39, 2, 103, 2, 83, 150, 30, 13, - 11, 18, 248, 39, 2, 51, 2, 94, 30, 13, 11, 18, 248, 39, 2, 51, 2, 94, 54, - 13, 11, 18, 248, 39, 2, 51, 2, 103, 54, 13, 11, 18, 248, 39, 2, 51, 2, - 51, 30, 13, 11, 18, 248, 39, 2, 51, 2, 51, 54, 13, 11, 18, 253, 157, 2, - 94, 2, 94, 30, 13, 11, 18, 253, 157, 2, 94, 2, 94, 54, 13, 11, 18, 253, - 157, 2, 51, 2, 51, 30, 13, 11, 18, 242, 216, 2, 94, 2, 51, 30, 13, 11, - 18, 242, 216, 2, 94, 2, 51, 54, 13, 11, 18, 242, 216, 2, 103, 2, 57, 30, - 13, 11, 18, 242, 216, 2, 51, 2, 164, 30, 13, 11, 18, 242, 216, 2, 51, 2, - 164, 54, 13, 11, 18, 242, 216, 2, 51, 2, 51, 30, 13, 11, 18, 242, 216, 2, - 51, 2, 51, 54, 13, 11, 18, 253, 155, 2, 94, 2, 83, 150, 30, 13, 11, 18, - 253, 155, 2, 164, 2, 51, 30, 13, 11, 18, 253, 155, 2, 164, 2, 51, 54, 13, - 11, 18, 253, 169, 2, 51, 2, 94, 30, 13, 11, 18, 253, 169, 2, 51, 2, 94, - 54, 13, 11, 18, 253, 169, 2, 51, 2, 51, 54, 13, 11, 18, 253, 169, 2, 51, - 2, 57, 30, 13, 11, 18, 253, 158, 2, 103, 2, 51, 30, 13, 11, 18, 253, 158, - 2, 51, 2, 51, 30, 13, 11, 18, 253, 158, 2, 51, 2, 51, 54, 13, 11, 18, - 253, 158, 2, 51, 2, 83, 150, 30, 13, 11, 18, 242, 240, 2, 51, 2, 51, 30, - 13, 11, 18, 242, 240, 2, 51, 2, 57, 30, 13, 11, 18, 242, 240, 2, 51, 2, - 83, 150, 30, 13, 11, 18, 253, 153, 2, 164, 2, 51, 30, 13, 11, 18, 253, - 153, 2, 164, 2, 51, 54, 13, 11, 18, 253, 167, 2, 51, 2, 94, 30, 13, 11, - 18, 253, 167, 2, 51, 2, 51, 30, 13, 11, 18, 182, 2, 94, 2, 51, 30, 13, - 11, 18, 182, 2, 94, 2, 57, 30, 13, 11, 18, 182, 2, 94, 2, 83, 150, 30, - 13, 11, 18, 182, 2, 103, 2, 103, 54, 13, 11, 18, 182, 2, 103, 2, 103, 30, - 13, 11, 18, 182, 2, 164, 2, 51, 30, 13, 11, 18, 182, 2, 164, 2, 51, 54, - 13, 11, 18, 182, 2, 51, 2, 94, 30, 13, 11, 18, 182, 2, 51, 2, 94, 54, 13, - 11, 18, 51, 2, 94, 2, 103, 54, 13, 11, 18, 51, 2, 94, 2, 51, 54, 13, 11, - 18, 51, 2, 94, 2, 57, 30, 13, 11, 18, 51, 2, 103, 2, 94, 54, 13, 11, 18, - 51, 2, 103, 2, 51, 54, 13, 11, 18, 51, 2, 164, 2, 103, 54, 13, 11, 18, - 51, 2, 164, 2, 51, 54, 13, 11, 18, 51, 2, 103, 2, 164, 54, 13, 11, 18, - 253, 124, 2, 51, 2, 103, 54, 13, 11, 18, 253, 124, 2, 51, 2, 51, 54, 13, - 11, 18, 198, 2, 94, 2, 51, 54, 13, 11, 18, 198, 2, 94, 2, 83, 150, 30, - 13, 11, 18, 198, 2, 103, 2, 51, 30, 13, 11, 18, 198, 2, 103, 2, 51, 54, - 13, 11, 18, 198, 2, 103, 2, 83, 150, 30, 13, 11, 18, 198, 2, 51, 2, 57, - 30, 13, 11, 18, 198, 2, 51, 2, 83, 150, 30, 13, 11, 18, 57, 2, 51, 2, 51, - 30, 13, 11, 18, 57, 2, 51, 2, 51, 54, 13, 11, 18, 253, 136, 2, 164, 2, - 57, 30, 13, 11, 18, 253, 127, 2, 103, 2, 57, 30, 13, 11, 18, 253, 127, 2, - 103, 2, 83, 150, 30, 13, 11, 18, 253, 127, 2, 164, 2, 57, 30, 13, 11, 18, - 253, 127, 2, 164, 2, 83, 150, 30, 13, 11, 18, 253, 127, 2, 51, 2, 57, 30, - 13, 11, 18, 253, 127, 2, 51, 2, 83, 150, 30, 13, 11, 18, 103, 2, 51, 2, - 57, 30, 13, 11, 18, 103, 2, 94, 2, 83, 150, 30, 13, 11, 18, 103, 2, 51, - 2, 83, 150, 30, 13, 11, 18, 248, 39, 2, 164, 2, 83, 150, 30, 13, 11, 18, - 253, 157, 2, 94, 2, 57, 30, 13, 11, 18, 242, 216, 2, 94, 2, 57, 30, 13, - 11, 18, 253, 155, 2, 94, 2, 57, 30, 13, 11, 18, 182, 2, 103, 2, 57, 30, - 13, 11, 18, 182, 2, 51, 2, 57, 30, 13, 11, 18, 57, 2, 94, 2, 57, 30, 13, - 11, 18, 57, 2, 103, 2, 57, 30, 13, 11, 18, 57, 2, 51, 2, 57, 30, 13, 11, - 18, 51, 2, 51, 2, 57, 30, 13, 11, 18, 253, 167, 2, 51, 2, 57, 30, 13, 11, - 18, 198, 2, 94, 2, 57, 30, 13, 11, 18, 253, 167, 2, 51, 2, 94, 54, 13, - 11, 18, 182, 2, 94, 2, 51, 54, 13, 11, 18, 253, 158, 2, 51, 2, 57, 30, - 13, 11, 18, 253, 135, 2, 51, 2, 57, 30, 13, 11, 18, 198, 2, 103, 2, 94, - 54, 13, 11, 18, 51, 2, 164, 2, 57, 30, 13, 11, 18, 182, 2, 103, 2, 51, - 54, 13, 11, 18, 253, 135, 2, 51, 2, 51, 30, 13, 11, 18, 182, 2, 103, 2, - 51, 30, 13, 11, 18, 198, 2, 103, 2, 94, 30, 13, 11, 18, 103, 2, 94, 2, - 57, 30, 13, 11, 18, 94, 2, 103, 2, 57, 30, 13, 11, 18, 51, 2, 103, 2, 57, - 30, 13, 11, 18, 253, 153, 2, 51, 2, 57, 30, 13, 11, 18, 253, 136, 2, 94, - 2, 57, 30, 13, 11, 18, 253, 135, 2, 51, 2, 51, 54, 13, 11, 18, 253, 158, - 2, 103, 2, 51, 54, 13, 11, 18, 253, 157, 2, 51, 2, 51, 54, 13, 11, 18, - 248, 39, 2, 164, 2, 57, 30, 13, 11, 18, 198, 2, 103, 2, 57, 30, 13, 11, - 18, 244, 3, 249, 191, 255, 24, 238, 197, 248, 119, 21, 39, 13, 11, 18, - 252, 85, 249, 191, 255, 24, 238, 197, 248, 119, 21, 39, 13, 11, 18, 244, - 77, 39, 13, 11, 18, 244, 75, 39, 13, 11, 18, 237, 213, 39, 13, 11, 18, - 247, 64, 39, 13, 11, 18, 242, 77, 39, 13, 11, 18, 240, 107, 39, 13, 11, - 18, 238, 45, 39, 13, 11, 18, 244, 3, 39, 13, 11, 18, 233, 100, 240, 107, - 236, 140, 11, 18, 229, 46, 252, 136, 52, 11, 18, 235, 181, 235, 168, 234, - 93, 34, 233, 233, 34, 233, 234, 34, 233, 235, 34, 233, 236, 34, 233, 237, - 34, 233, 238, 34, 233, 239, 34, 233, 240, 34, 233, 241, 34, 232, 204, 34, - 232, 205, 34, 232, 206, 34, 232, 207, 34, 232, 208, 34, 232, 209, 34, - 232, 210, 232, 70, 248, 38, 28, 59, 240, 27, 232, 70, 248, 38, 28, 59, - 80, 240, 27, 232, 70, 248, 38, 28, 59, 80, 248, 37, 208, 232, 70, 248, - 38, 28, 59, 240, 24, 232, 70, 248, 38, 28, 59, 234, 14, 232, 70, 248, 38, - 28, 59, 233, 54, 69, 232, 70, 248, 38, 28, 59, 236, 156, 69, 232, 70, - 248, 38, 28, 59, 40, 64, 234, 11, 104, 232, 70, 248, 38, 28, 59, 38, 64, - 234, 11, 237, 79, 232, 70, 248, 38, 28, 59, 163, 235, 69, 50, 18, 40, - 243, 7, 50, 18, 38, 243, 7, 50, 45, 242, 219, 40, 243, 7, 50, 45, 242, - 219, 38, 243, 7, 232, 70, 248, 38, 28, 59, 171, 53, 238, 143, 232, 70, - 248, 38, 28, 59, 255, 28, 242, 235, 232, 70, 248, 38, 28, 59, 255, 23, - 242, 235, 232, 70, 248, 38, 28, 59, 170, 242, 224, 232, 70, 248, 38, 28, - 59, 248, 103, 170, 242, 224, 232, 70, 248, 38, 28, 59, 40, 232, 74, 232, - 70, 248, 38, 28, 59, 38, 232, 74, 232, 70, 248, 38, 28, 59, 40, 242, 225, - 104, 232, 70, 248, 38, 28, 59, 38, 242, 225, 104, 232, 70, 248, 38, 28, - 59, 40, 236, 171, 242, 255, 104, 232, 70, 248, 38, 28, 59, 38, 236, 171, - 242, 255, 104, 232, 70, 248, 38, 28, 59, 40, 86, 234, 11, 104, 232, 70, - 248, 38, 28, 59, 38, 86, 234, 11, 104, 232, 70, 248, 38, 28, 59, 40, 45, - 185, 104, 232, 70, 248, 38, 28, 59, 38, 45, 185, 104, 232, 70, 248, 38, - 28, 59, 40, 185, 104, 232, 70, 248, 38, 28, 59, 38, 185, 104, 232, 70, - 248, 38, 28, 59, 40, 240, 31, 104, 232, 70, 248, 38, 28, 59, 38, 240, 31, - 104, 232, 70, 248, 38, 28, 59, 40, 64, 240, 31, 104, 232, 70, 248, 38, - 28, 59, 38, 64, 240, 31, 104, 240, 221, 248, 40, 64, 240, 221, 248, 40, - 232, 70, 248, 38, 28, 59, 40, 31, 104, 232, 70, 248, 38, 28, 59, 38, 31, - 104, 240, 55, 235, 74, 234, 48, 235, 74, 248, 103, 235, 74, 45, 248, 103, - 235, 74, 240, 55, 170, 242, 224, 234, 48, 170, 242, 224, 248, 103, 170, - 242, 224, 3, 240, 27, 3, 80, 240, 27, 3, 248, 37, 208, 3, 234, 14, 3, - 240, 24, 3, 236, 156, 69, 3, 233, 54, 69, 3, 255, 28, 242, 235, 3, 40, - 232, 74, 3, 38, 232, 74, 3, 40, 242, 225, 104, 3, 38, 242, 225, 104, 3, - 40, 236, 171, 242, 255, 104, 3, 38, 236, 171, 242, 255, 104, 3, 61, 52, - 3, 234, 17, 3, 235, 52, 3, 248, 49, 52, 3, 231, 94, 3, 235, 44, 52, 3, - 232, 68, 52, 3, 240, 7, 52, 3, 238, 75, 236, 177, 3, 240, 114, 52, 3, - 238, 107, 52, 3, 234, 20, 254, 20, 11, 236, 214, 39, 13, 11, 239, 214, 2, - 236, 214, 48, 11, 237, 1, 39, 13, 11, 248, 138, 236, 26, 11, 237, 15, 39, - 13, 11, 243, 40, 39, 13, 11, 243, 40, 113, 13, 11, 243, 56, 39, 13, 11, - 243, 56, 113, 13, 11, 243, 63, 39, 13, 11, 243, 63, 113, 13, 11, 240, 47, - 39, 13, 11, 240, 47, 113, 13, 11, 244, 25, 39, 13, 11, 244, 25, 113, 13, - 11, 1, 143, 39, 13, 11, 1, 83, 2, 243, 42, 60, 39, 13, 11, 1, 83, 2, 243, - 42, 60, 30, 13, 11, 1, 83, 2, 143, 60, 39, 13, 11, 1, 83, 2, 143, 60, 30, - 13, 11, 1, 253, 220, 2, 143, 60, 39, 13, 11, 1, 253, 220, 2, 143, 60, 30, - 13, 11, 1, 83, 2, 143, 242, 230, 39, 13, 11, 1, 83, 2, 143, 242, 230, 30, - 13, 11, 1, 57, 2, 143, 60, 39, 13, 11, 1, 57, 2, 143, 60, 30, 13, 11, 1, - 57, 2, 143, 60, 54, 13, 11, 1, 57, 2, 143, 60, 113, 13, 11, 1, 83, 39, - 13, 11, 1, 83, 30, 13, 11, 1, 253, 136, 39, 13, 11, 1, 253, 136, 30, 13, - 11, 1, 253, 136, 54, 13, 11, 1, 253, 136, 113, 13, 11, 1, 253, 127, 238, - 144, 39, 13, 11, 1, 253, 127, 238, 144, 30, 13, 11, 1, 253, 127, 39, 13, - 11, 1, 253, 127, 30, 13, 11, 1, 253, 127, 54, 13, 11, 1, 253, 127, 113, - 13, 11, 1, 248, 70, 39, 13, 11, 1, 248, 70, 30, 13, 11, 1, 248, 70, 54, - 13, 11, 1, 248, 70, 113, 13, 11, 1, 103, 39, 13, 11, 1, 103, 30, 13, 11, - 1, 103, 54, 13, 11, 1, 103, 113, 13, 11, 1, 94, 39, 13, 11, 1, 94, 30, - 13, 11, 1, 94, 54, 13, 11, 1, 94, 113, 13, 11, 1, 164, 39, 13, 11, 1, - 164, 30, 13, 11, 1, 164, 54, 13, 11, 1, 164, 113, 13, 11, 1, 253, 199, - 39, 13, 11, 1, 253, 199, 30, 13, 11, 1, 249, 0, 39, 13, 11, 1, 249, 0, - 30, 13, 11, 1, 253, 143, 39, 13, 11, 1, 253, 143, 30, 13, 11, 1, 248, - 104, 39, 13, 11, 1, 248, 104, 30, 13, 11, 1, 248, 39, 39, 13, 11, 1, 248, - 39, 30, 13, 11, 1, 248, 39, 54, 13, 11, 1, 248, 39, 113, 13, 11, 1, 242, - 216, 39, 13, 11, 1, 242, 216, 30, 13, 11, 1, 242, 216, 54, 13, 11, 1, - 242, 216, 113, 13, 11, 1, 253, 157, 39, 13, 11, 1, 253, 157, 30, 13, 11, - 1, 253, 157, 54, 13, 11, 1, 253, 157, 113, 13, 11, 1, 253, 155, 39, 13, - 11, 1, 253, 155, 30, 13, 11, 1, 253, 155, 54, 13, 11, 1, 253, 155, 113, - 13, 11, 1, 253, 169, 39, 13, 11, 1, 253, 169, 30, 13, 11, 1, 253, 169, - 54, 13, 11, 1, 253, 169, 113, 13, 11, 1, 253, 255, 39, 13, 11, 1, 253, - 255, 30, 13, 11, 1, 253, 255, 54, 13, 11, 1, 253, 255, 113, 13, 11, 1, - 253, 158, 39, 13, 11, 1, 253, 158, 30, 13, 11, 1, 253, 158, 54, 13, 11, - 1, 253, 158, 113, 13, 11, 1, 242, 240, 39, 13, 11, 1, 242, 240, 30, 13, - 11, 1, 242, 240, 54, 13, 11, 1, 242, 240, 113, 13, 11, 1, 253, 153, 39, - 13, 11, 1, 253, 153, 30, 13, 11, 1, 253, 153, 54, 13, 11, 1, 253, 153, - 113, 13, 11, 1, 253, 167, 39, 13, 11, 1, 253, 167, 30, 13, 11, 1, 253, - 167, 54, 13, 11, 1, 253, 167, 113, 13, 11, 1, 253, 135, 39, 13, 11, 1, - 253, 135, 30, 13, 11, 1, 253, 135, 54, 13, 11, 1, 253, 135, 113, 13, 11, - 1, 182, 39, 13, 11, 1, 182, 30, 13, 11, 1, 182, 54, 13, 11, 1, 182, 113, - 13, 11, 1, 51, 39, 13, 11, 1, 51, 30, 13, 11, 1, 51, 54, 13, 11, 1, 51, - 113, 13, 11, 1, 198, 39, 13, 11, 1, 198, 30, 13, 11, 1, 198, 54, 13, 11, - 1, 198, 113, 13, 11, 1, 253, 124, 39, 13, 11, 1, 253, 124, 30, 13, 11, 1, - 253, 124, 54, 13, 11, 1, 253, 124, 113, 13, 11, 1, 253, 220, 39, 13, 11, - 1, 253, 220, 30, 13, 11, 1, 83, 150, 39, 13, 11, 1, 83, 150, 30, 13, 11, - 1, 57, 39, 13, 11, 1, 57, 30, 13, 11, 1, 57, 54, 13, 11, 1, 57, 113, 13, - 11, 18, 182, 2, 83, 2, 243, 42, 60, 39, 13, 11, 18, 182, 2, 83, 2, 243, - 42, 60, 30, 13, 11, 18, 182, 2, 83, 2, 143, 60, 39, 13, 11, 18, 182, 2, - 83, 2, 143, 60, 30, 13, 11, 18, 182, 2, 83, 2, 143, 242, 230, 39, 13, 11, - 18, 182, 2, 83, 2, 143, 242, 230, 30, 13, 11, 18, 182, 2, 83, 39, 13, 11, - 18, 182, 2, 83, 30, 13, 248, 145, 243, 81, 236, 233, 240, 15, 89, 233, - 54, 69, 89, 235, 51, 69, 89, 61, 52, 89, 240, 114, 52, 89, 238, 107, 52, - 89, 234, 17, 89, 233, 59, 89, 40, 232, 74, 89, 38, 232, 74, 89, 235, 52, - 89, 248, 49, 52, 89, 240, 27, 89, 231, 94, 89, 248, 37, 208, 89, 236, - 177, 89, 26, 242, 217, 89, 26, 127, 89, 26, 111, 89, 26, 166, 89, 26, - 177, 89, 26, 176, 89, 26, 187, 89, 26, 203, 89, 26, 195, 89, 26, 202, 89, - 240, 24, 89, 234, 14, 89, 235, 44, 52, 89, 240, 7, 52, 89, 232, 68, 52, - 89, 236, 156, 69, 89, 234, 20, 254, 20, 89, 8, 5, 1, 67, 89, 8, 5, 1, - 217, 89, 8, 5, 1, 255, 18, 89, 8, 5, 1, 209, 89, 8, 5, 1, 72, 89, 8, 5, - 1, 255, 19, 89, 8, 5, 1, 210, 89, 8, 5, 1, 192, 89, 8, 5, 1, 71, 89, 8, - 5, 1, 221, 89, 8, 5, 1, 255, 15, 89, 8, 5, 1, 162, 89, 8, 5, 1, 173, 89, - 8, 5, 1, 197, 89, 8, 5, 1, 73, 89, 8, 5, 1, 223, 89, 8, 5, 1, 255, 20, - 89, 8, 5, 1, 144, 89, 8, 5, 1, 193, 89, 8, 5, 1, 214, 89, 8, 5, 1, 79, - 89, 8, 5, 1, 179, 89, 8, 5, 1, 255, 16, 89, 8, 5, 1, 206, 89, 8, 5, 1, - 255, 14, 89, 8, 5, 1, 255, 17, 89, 40, 31, 104, 89, 238, 75, 236, 177, - 89, 38, 31, 104, 89, 190, 238, 54, 89, 170, 242, 224, 89, 242, 245, 238, - 54, 89, 8, 3, 1, 67, 89, 8, 3, 1, 217, 89, 8, 3, 1, 255, 18, 89, 8, 3, 1, - 209, 89, 8, 3, 1, 72, 89, 8, 3, 1, 255, 19, 89, 8, 3, 1, 210, 89, 8, 3, - 1, 192, 89, 8, 3, 1, 71, 89, 8, 3, 1, 221, 89, 8, 3, 1, 255, 15, 89, 8, - 3, 1, 162, 89, 8, 3, 1, 173, 89, 8, 3, 1, 197, 89, 8, 3, 1, 73, 89, 8, 3, - 1, 223, 89, 8, 3, 1, 255, 20, 89, 8, 3, 1, 144, 89, 8, 3, 1, 193, 89, 8, - 3, 1, 214, 89, 8, 3, 1, 79, 89, 8, 3, 1, 179, 89, 8, 3, 1, 255, 16, 89, - 8, 3, 1, 206, 89, 8, 3, 1, 255, 14, 89, 8, 3, 1, 255, 17, 89, 40, 242, - 225, 104, 89, 59, 242, 224, 89, 38, 242, 225, 104, 89, 169, 89, 40, 64, - 232, 74, 89, 38, 64, 232, 74, 74, 80, 248, 37, 208, 74, 40, 240, 31, 104, - 74, 38, 240, 31, 104, 74, 80, 240, 27, 74, 42, 240, 1, 248, 40, 74, 42, - 1, 253, 177, 74, 42, 1, 3, 67, 74, 42, 1, 3, 71, 74, 42, 1, 3, 79, 74, - 42, 1, 3, 72, 74, 42, 1, 3, 73, 74, 42, 1, 3, 216, 74, 42, 1, 3, 253, - 161, 74, 42, 1, 3, 253, 162, 74, 42, 1, 3, 253, 196, 74, 226, 254, 235, - 138, 243, 1, 69, 74, 42, 1, 67, 74, 42, 1, 71, 74, 42, 1, 79, 74, 42, 1, - 72, 74, 42, 1, 73, 74, 42, 1, 201, 74, 42, 1, 253, 215, 74, 42, 1, 253, - 203, 74, 42, 1, 253, 172, 74, 42, 1, 253, 190, 74, 42, 1, 253, 132, 74, - 42, 1, 253, 198, 74, 42, 1, 253, 211, 74, 42, 1, 253, 210, 74, 42, 1, - 253, 186, 74, 42, 1, 253, 126, 74, 42, 1, 253, 212, 74, 42, 1, 253, 196, - 74, 42, 1, 253, 195, 74, 42, 1, 87, 74, 42, 1, 253, 131, 74, 42, 1, 253, - 166, 74, 42, 1, 253, 150, 74, 42, 1, 253, 197, 74, 42, 1, 253, 173, 74, - 42, 1, 219, 74, 42, 1, 253, 214, 74, 42, 1, 253, 236, 74, 42, 1, 253, - 168, 74, 42, 1, 253, 184, 74, 42, 1, 222, 74, 42, 1, 253, 180, 74, 42, 1, - 253, 154, 74, 42, 1, 253, 206, 74, 42, 1, 253, 181, 74, 42, 1, 216, 74, - 42, 1, 253, 161, 74, 42, 1, 253, 162, 74, 42, 1, 253, 130, 74, 42, 1, - 253, 209, 74, 42, 1, 253, 185, 74, 42, 1, 253, 194, 74, 42, 1, 253, 160, - 74, 42, 1, 253, 138, 74, 42, 1, 197, 74, 42, 240, 59, 243, 1, 69, 74, 42, - 233, 75, 243, 1, 69, 74, 23, 238, 114, 74, 23, 1, 238, 99, 74, 23, 1, - 232, 87, 74, 23, 1, 232, 91, 74, 23, 1, 240, 80, 74, 23, 1, 232, 93, 74, - 23, 1, 232, 94, 74, 23, 1, 238, 102, 74, 23, 1, 232, 101, 74, 23, 1, 240, - 85, 74, 23, 1, 231, 98, 74, 23, 1, 232, 96, 74, 23, 1, 232, 97, 74, 23, - 1, 233, 74, 74, 23, 1, 231, 43, 74, 23, 1, 231, 42, 74, 23, 1, 232, 85, - 74, 23, 1, 240, 78, 74, 23, 1, 240, 83, 74, 23, 1, 233, 79, 74, 23, 1, - 233, 66, 74, 23, 1, 243, 34, 74, 23, 1, 234, 32, 74, 23, 1, 240, 75, 74, - 23, 1, 240, 71, 74, 23, 1, 233, 77, 74, 23, 1, 236, 195, 74, 23, 1, 236, - 198, 74, 23, 1, 236, 205, 74, 23, 1, 236, 201, 74, 23, 1, 240, 74, 74, - 23, 1, 67, 74, 23, 1, 253, 178, 74, 23, 1, 216, 74, 23, 1, 249, 18, 74, - 23, 1, 254, 59, 74, 23, 1, 72, 74, 23, 1, 249, 22, 74, 23, 1, 253, 254, - 74, 23, 1, 73, 74, 23, 1, 253, 138, 74, 23, 1, 249, 12, 74, 23, 1, 253, - 193, 74, 23, 1, 253, 162, 74, 23, 1, 79, 74, 23, 1, 249, 14, 74, 23, 1, - 253, 170, 74, 23, 1, 253, 187, 74, 23, 1, 253, 161, 74, 23, 1, 254, 61, - 74, 23, 1, 253, 189, 74, 23, 1, 71, 89, 249, 39, 52, 89, 243, 246, 52, - 89, 161, 52, 89, 196, 89, 240, 129, 125, 89, 254, 134, 52, 89, 254, 131, - 52, 74, 245, 91, 136, 235, 63, 74, 139, 56, 74, 226, 226, 56, 74, 77, 56, - 74, 235, 45, 56, 74, 86, 238, 59, 74, 64, 238, 51, 233, 71, 234, 4, 238, - 159, 233, 71, 234, 4, 234, 6, 233, 71, 234, 4, 233, 251, 242, 38, 233, - 99, 234, 49, 233, 99, 234, 49, 44, 41, 4, 249, 254, 67, 44, 41, 4, 250, - 23, 72, 44, 41, 4, 250, 15, 71, 44, 41, 4, 250, 43, 73, 44, 41, 4, 250, - 0, 79, 44, 41, 4, 249, 247, 253, 133, 44, 41, 4, 250, 30, 253, 200, 44, - 41, 4, 249, 253, 253, 201, 44, 41, 4, 250, 4, 253, 225, 44, 41, 4, 250, - 34, 253, 232, 44, 41, 4, 250, 39, 253, 146, 44, 41, 4, 250, 31, 254, 24, - 44, 41, 4, 250, 21, 253, 248, 44, 41, 4, 250, 45, 254, 25, 44, 41, 4, - 250, 57, 201, 44, 41, 4, 250, 29, 253, 172, 44, 41, 4, 250, 47, 253, 215, - 44, 41, 4, 250, 50, 253, 190, 44, 41, 4, 250, 60, 253, 203, 44, 41, 4, - 250, 59, 222, 44, 41, 4, 250, 3, 253, 206, 44, 41, 4, 250, 53, 253, 180, - 44, 41, 4, 250, 5, 253, 181, 44, 41, 4, 250, 10, 253, 154, 44, 41, 4, - 249, 252, 253, 131, 44, 41, 4, 250, 11, 253, 197, 44, 41, 4, 250, 17, - 253, 166, 44, 41, 4, 250, 35, 253, 173, 44, 41, 4, 250, 38, 253, 150, 44, - 41, 4, 249, 249, 253, 129, 44, 41, 4, 250, 52, 253, 175, 44, 41, 4, 250, - 24, 253, 147, 44, 41, 4, 250, 1, 253, 208, 44, 41, 4, 250, 33, 253, 239, - 44, 41, 4, 250, 6, 253, 217, 44, 41, 4, 250, 58, 254, 70, 44, 41, 4, 250, - 9, 254, 28, 44, 41, 4, 250, 19, 254, 45, 44, 41, 4, 250, 42, 253, 130, - 44, 41, 4, 250, 14, 253, 194, 44, 41, 4, 250, 36, 253, 209, 44, 41, 4, - 249, 248, 253, 160, 44, 41, 4, 250, 13, 253, 185, 44, 41, 4, 250, 18, - 253, 132, 44, 41, 4, 249, 255, 253, 210, 44, 41, 4, 250, 26, 253, 198, - 44, 41, 4, 250, 2, 253, 186, 44, 41, 4, 250, 40, 253, 211, 44, 41, 4, - 250, 41, 253, 126, 44, 41, 4, 249, 250, 253, 195, 44, 41, 4, 250, 22, - 253, 212, 44, 41, 4, 249, 251, 87, 44, 41, 4, 250, 49, 253, 196, 44, 41, - 4, 250, 37, 253, 138, 44, 41, 4, 250, 55, 253, 170, 44, 41, 4, 250, 25, - 253, 187, 44, 41, 4, 250, 27, 253, 177, 44, 41, 4, 250, 7, 253, 163, 44, - 41, 4, 250, 54, 253, 228, 44, 41, 4, 250, 8, 253, 222, 44, 41, 4, 250, - 12, 254, 137, 44, 41, 4, 250, 28, 254, 138, 44, 41, 4, 250, 61, 253, 151, - 44, 41, 4, 250, 51, 250, 215, 44, 41, 4, 250, 63, 250, 216, 44, 41, 4, - 250, 32, 248, 176, 44, 41, 4, 250, 16, 252, 77, 44, 41, 4, 250, 44, 252, - 76, 44, 41, 4, 250, 56, 252, 124, 44, 41, 4, 250, 20, 252, 125, 44, 41, - 4, 250, 48, 252, 141, 44, 41, 4, 250, 46, 252, 207, 44, 41, 4, 250, 62, - 249, 8, 44, 41, 4, 250, 64, 111, 44, 41, 12, 244, 88, 44, 41, 12, 244, - 89, 44, 41, 12, 244, 90, 44, 41, 12, 244, 91, 44, 41, 12, 244, 92, 44, - 41, 12, 244, 93, 44, 41, 12, 244, 94, 44, 41, 12, 244, 95, 44, 41, 12, - 244, 96, 44, 41, 12, 244, 97, 44, 41, 12, 244, 98, 44, 41, 12, 244, 99, - 44, 41, 12, 244, 100, 44, 41, 12, 244, 101, 44, 41, 78, 250, 65, 248, - 131, 44, 41, 78, 250, 66, 240, 253, 44, 41, 78, 250, 67, 243, 164, 44, - 41, 78, 250, 68, 241, 98, 44, 41, 78, 244, 102, 246, 63, 44, 41, 78, 244, - 103, 236, 106, 44, 41, 78, 244, 104, 249, 58, 44, 41, 78, 244, 105, 249, - 151, 44, 41, 78, 244, 106, 236, 102, 44, 41, 78, 244, 107, 237, 172, 44, - 41, 78, 244, 108, 252, 187, 44, 41, 78, 244, 109, 244, 225, 44, 41, 78, - 244, 110, 248, 202, 44, 41, 78, 244, 111, 244, 231, 44, 41, 78, 250, 69, - 240, 153, 44, 41, 78, 250, 70, 239, 4, 44, 41, 78, 250, 71, 242, 40, 44, - 41, 78, 250, 72, 242, 123, 44, 41, 78, 250, 73, 237, 99, 44, 41, 236, - 184, 250, 74, 246, 6, 44, 41, 236, 184, 250, 75, 239, 104, 44, 41, 78, - 250, 76, 249, 127, 44, 41, 78, 250, 77, 243, 133, 44, 41, 78, 244, 112, - 44, 41, 236, 184, 250, 78, 241, 13, 44, 41, 236, 184, 250, 79, 246, 64, - 44, 41, 78, 250, 80, 239, 14, 44, 41, 78, 250, 81, 243, 96, 44, 41, 78, - 244, 113, 44, 41, 78, 250, 82, 244, 53, 44, 41, 78, 244, 114, 44, 41, 78, - 244, 115, 44, 41, 78, 250, 83, 243, 8, 44, 41, 78, 244, 116, 44, 41, 78, - 244, 117, 44, 41, 78, 244, 118, 44, 41, 236, 184, 250, 84, 242, 163, 44, - 41, 78, 244, 120, 44, 41, 78, 244, 121, 44, 41, 78, 250, 85, 240, 132, - 44, 41, 78, 244, 122, 44, 41, 78, 244, 123, 44, 41, 78, 250, 86, 237, - 164, 44, 41, 78, 250, 87, 238, 248, 44, 41, 78, 244, 124, 44, 41, 78, - 244, 125, 44, 41, 78, 244, 126, 44, 41, 78, 244, 127, 44, 41, 78, 244, - 128, 44, 41, 78, 244, 129, 44, 41, 78, 244, 130, 44, 41, 78, 244, 131, - 44, 41, 78, 244, 132, 44, 41, 78, 250, 88, 241, 248, 44, 41, 78, 244, - 133, 44, 41, 78, 250, 89, 244, 37, 44, 41, 78, 244, 134, 44, 41, 78, 244, - 135, 44, 41, 78, 244, 136, 44, 41, 78, 244, 137, 44, 41, 78, 244, 138, - 44, 41, 78, 244, 139, 44, 41, 78, 244, 140, 44, 41, 78, 244, 141, 44, 41, - 78, 244, 142, 44, 41, 78, 244, 143, 44, 41, 78, 244, 144, 44, 41, 78, - 250, 90, 239, 90, 44, 41, 78, 250, 91, 234, 190, 44, 41, 78, 250, 92, - 237, 73, 44, 41, 78, 250, 93, 240, 236, 44, 41, 78, 250, 94, 56, 44, 41, - 78, 244, 171, 44, 41, 78, 250, 95, 242, 137, 44, 41, 78, 244, 172, 44, - 41, 78, 244, 173, 44, 41, 78, 250, 96, 239, 248, 236, 252, 44, 41, 78, - 250, 97, 236, 252, 44, 41, 78, 250, 98, 239, 22, 241, 116, 44, 41, 78, - 250, 99, 242, 184, 44, 41, 78, 244, 174, 44, 41, 78, 244, 175, 44, 41, - 236, 184, 250, 100, 241, 85, 44, 41, 78, 244, 176, 44, 41, 78, 244, 177, - 44, 41, 78, 244, 179, 44, 41, 78, 244, 180, 44, 41, 78, 244, 181, 44, 41, - 78, 250, 101, 245, 35, 44, 41, 78, 244, 182, 44, 41, 78, 244, 183, 44, - 41, 78, 244, 184, 44, 41, 78, 244, 185, 44, 41, 78, 244, 186, 44, 41, 78, - 240, 6, 244, 119, 44, 41, 78, 240, 6, 244, 145, 44, 41, 78, 240, 6, 244, - 146, 44, 41, 78, 240, 6, 244, 147, 44, 41, 78, 240, 6, 244, 148, 44, 41, - 78, 240, 6, 244, 149, 44, 41, 78, 240, 6, 244, 150, 44, 41, 78, 240, 6, - 244, 151, 44, 41, 78, 240, 6, 244, 152, 44, 41, 78, 240, 6, 244, 153, 44, - 41, 78, 240, 6, 244, 154, 44, 41, 78, 240, 6, 244, 155, 44, 41, 78, 240, - 6, 244, 156, 44, 41, 78, 240, 6, 244, 157, 44, 41, 78, 240, 6, 244, 158, - 44, 41, 78, 240, 6, 244, 159, 44, 41, 78, 240, 6, 244, 160, 44, 41, 78, - 240, 6, 244, 161, 44, 41, 78, 240, 6, 244, 162, 44, 41, 78, 240, 6, 244, - 163, 44, 41, 78, 240, 6, 244, 164, 44, 41, 78, 240, 6, 244, 165, 44, 41, - 78, 240, 6, 244, 166, 44, 41, 78, 240, 6, 244, 167, 44, 41, 78, 240, 6, - 244, 168, 44, 41, 78, 240, 6, 244, 169, 44, 41, 78, 240, 6, 244, 170, 44, - 41, 78, 240, 6, 244, 178, 44, 41, 78, 240, 6, 244, 187, 167, 248, 143, - 235, 95, 242, 224, 167, 248, 143, 235, 95, 248, 40, 167, 243, 53, 69, - 167, 61, 127, 167, 61, 111, 167, 61, 166, 167, 61, 177, 167, 61, 176, - 167, 61, 187, 167, 61, 203, 167, 61, 195, 167, 61, 202, 167, 61, 248, 53, - 167, 61, 238, 77, 167, 61, 238, 101, 167, 61, 240, 136, 167, 61, 240, 50, - 167, 61, 240, 234, 167, 61, 237, 38, 167, 61, 238, 182, 167, 61, 238, - 147, 167, 61, 253, 125, 236, 149, 167, 61, 171, 236, 149, 167, 61, 204, - 236, 149, 167, 61, 248, 58, 236, 149, 167, 61, 248, 48, 236, 149, 167, - 61, 254, 31, 236, 149, 167, 61, 243, 31, 236, 149, 167, 61, 242, 254, - 236, 149, 167, 61, 248, 173, 236, 149, 167, 61, 253, 125, 235, 49, 167, - 61, 171, 235, 49, 167, 61, 204, 235, 49, 167, 61, 248, 58, 235, 49, 167, - 61, 248, 48, 235, 49, 167, 61, 254, 31, 235, 49, 167, 61, 243, 31, 235, - 49, 167, 61, 242, 254, 235, 49, 167, 61, 248, 173, 235, 49, 167, 61, 253, - 219, 235, 49, 167, 61, 240, 48, 235, 49, 167, 61, 240, 53, 235, 49, 167, - 61, 243, 6, 235, 49, 167, 61, 243, 18, 235, 49, 167, 61, 247, 90, 235, - 49, 167, 61, 239, 190, 235, 49, 167, 61, 241, 92, 235, 49, 167, 61, 242, - 12, 235, 49, 167, 240, 106, 248, 196, 247, 183, 167, 240, 106, 243, 41, - 236, 188, 167, 240, 106, 240, 87, 236, 188, 167, 240, 106, 243, 129, 236, - 188, 167, 240, 106, 240, 137, 236, 188, 167, 254, 157, 238, 119, 243, 41, - 236, 188, 167, 241, 218, 238, 119, 243, 41, 236, 188, 167, 238, 119, 240, - 87, 236, 188, 167, 238, 119, 243, 129, 236, 188, 17, 180, 242, 227, 253, - 125, 237, 33, 17, 180, 242, 227, 253, 125, 243, 7, 17, 180, 242, 227, - 253, 125, 237, 141, 17, 180, 242, 227, 176, 17, 180, 242, 227, 240, 50, - 17, 180, 242, 227, 248, 48, 236, 149, 17, 180, 242, 227, 248, 48, 235, - 49, 17, 180, 242, 227, 243, 18, 235, 49, 17, 180, 242, 227, 248, 48, 236, - 192, 17, 180, 242, 227, 253, 219, 236, 192, 17, 180, 242, 227, 243, 18, - 236, 192, 17, 180, 242, 227, 253, 125, 238, 92, 236, 192, 17, 180, 242, - 227, 248, 48, 238, 92, 236, 192, 17, 180, 242, 227, 253, 125, 236, 193, - 236, 192, 17, 180, 242, 227, 248, 48, 236, 193, 236, 192, 17, 180, 242, - 227, 248, 48, 236, 187, 17, 180, 242, 227, 253, 219, 236, 187, 17, 180, - 242, 227, 243, 18, 236, 187, 17, 180, 242, 227, 253, 125, 238, 92, 236, - 187, 17, 180, 242, 227, 248, 48, 238, 92, 236, 187, 17, 180, 242, 227, - 253, 125, 236, 193, 236, 187, 17, 180, 242, 227, 253, 219, 236, 193, 236, - 187, 17, 180, 242, 227, 243, 18, 236, 193, 236, 187, 17, 180, 242, 227, - 253, 219, 243, 107, 17, 180, 239, 91, 253, 125, 236, 76, 17, 180, 236, - 179, 127, 17, 180, 234, 38, 127, 17, 180, 234, 37, 111, 17, 180, 236, - 179, 111, 17, 180, 237, 100, 171, 235, 121, 17, 180, 234, 37, 171, 235, - 121, 17, 180, 234, 19, 176, 17, 180, 234, 19, 248, 53, 17, 180, 234, 19, - 253, 219, 235, 96, 13, 17, 180, 234, 38, 248, 53, 17, 180, 236, 60, 248, - 53, 17, 180, 236, 179, 248, 53, 17, 180, 236, 179, 238, 101, 17, 180, - 234, 19, 240, 50, 17, 180, 234, 19, 243, 18, 235, 96, 13, 17, 180, 234, - 38, 240, 50, 17, 180, 236, 179, 240, 50, 17, 180, 236, 179, 253, 125, - 236, 149, 17, 180, 236, 179, 204, 236, 149, 17, 180, 234, 37, 248, 48, - 236, 149, 17, 180, 234, 19, 248, 48, 236, 149, 17, 180, 236, 179, 248, - 48, 236, 149, 17, 180, 235, 186, 248, 48, 236, 149, 17, 180, 241, 254, - 248, 48, 236, 149, 17, 180, 236, 179, 253, 125, 235, 49, 17, 180, 236, - 179, 248, 48, 235, 49, 17, 180, 239, 40, 248, 48, 243, 107, 17, 180, 238, - 16, 243, 18, 243, 107, 17, 253, 125, 137, 52, 17, 253, 125, 137, 21, 235, - 96, 13, 17, 171, 242, 149, 52, 17, 204, 236, 236, 52, 17, 249, 206, 52, - 17, 242, 140, 52, 17, 238, 180, 52, 17, 252, 57, 52, 17, 171, 243, 68, - 52, 17, 204, 243, 68, 52, 17, 248, 58, 243, 68, 52, 17, 248, 48, 243, 68, - 52, 17, 237, 209, 52, 17, 239, 111, 248, 196, 52, 17, 246, 52, 52, 17, - 242, 44, 52, 17, 242, 188, 52, 17, 241, 19, 52, 17, 241, 17, 52, 17, 241, - 141, 52, 17, 238, 33, 248, 196, 52, 17, 248, 145, 52, 76, 24, 1, 67, 76, - 24, 1, 253, 242, 76, 24, 1, 253, 172, 76, 24, 1, 253, 200, 76, 24, 1, 72, - 76, 24, 1, 254, 12, 76, 24, 1, 253, 228, 76, 24, 1, 253, 168, 76, 24, 1, - 248, 111, 76, 24, 1, 71, 76, 24, 1, 201, 76, 24, 1, 254, 3, 76, 24, 1, - 254, 22, 76, 24, 1, 253, 202, 76, 24, 1, 248, 93, 76, 24, 1, 73, 76, 24, - 1, 253, 175, 76, 24, 1, 248, 118, 76, 24, 1, 253, 203, 76, 24, 1, 254, 4, - 76, 24, 1, 254, 23, 76, 24, 1, 253, 195, 76, 24, 1, 79, 76, 24, 1, 250, - 223, 76, 24, 1, 249, 136, 76, 24, 1, 249, 94, 76, 24, 1, 254, 21, 76, 24, - 1, 250, 229, 76, 24, 1, 248, 88, 76, 24, 1, 253, 142, 76, 24, 1, 253, - 148, 76, 24, 178, 127, 76, 24, 178, 176, 76, 24, 178, 248, 53, 76, 24, - 178, 240, 50, 240, 8, 1, 244, 71, 240, 8, 1, 237, 70, 240, 8, 1, 245, - 120, 240, 8, 1, 245, 32, 240, 8, 1, 238, 240, 240, 8, 1, 236, 83, 240, 8, - 1, 245, 233, 240, 8, 1, 245, 139, 240, 8, 1, 239, 221, 240, 8, 1, 250, - 222, 240, 8, 1, 241, 206, 240, 8, 1, 241, 211, 240, 8, 1, 241, 226, 240, - 8, 1, 239, 142, 240, 8, 1, 251, 113, 240, 8, 1, 247, 184, 240, 8, 1, 236, - 68, 240, 8, 1, 238, 147, 240, 8, 1, 242, 75, 240, 8, 1, 242, 98, 240, 8, - 1, 242, 144, 240, 8, 1, 242, 185, 240, 8, 1, 241, 102, 240, 8, 1, 241, - 179, 240, 8, 1, 240, 190, 240, 8, 1, 242, 43, 240, 8, 1, 248, 173, 236, - 149, 236, 147, 1, 244, 78, 236, 147, 1, 242, 242, 236, 147, 1, 241, 122, - 236, 147, 1, 248, 61, 236, 147, 1, 240, 28, 236, 147, 1, 253, 184, 236, - 147, 1, 253, 177, 236, 147, 1, 242, 251, 236, 147, 1, 245, 201, 236, 147, - 1, 249, 176, 236, 147, 1, 248, 193, 236, 147, 1, 248, 116, 236, 147, 1, - 243, 33, 236, 147, 1, 240, 33, 236, 147, 1, 248, 166, 236, 147, 1, 245, - 64, 236, 147, 1, 248, 132, 236, 147, 1, 254, 18, 236, 147, 1, 242, 95, - 236, 147, 1, 248, 105, 236, 147, 1, 253, 239, 236, 147, 1, 247, 61, 236, - 147, 1, 247, 15, 236, 147, 1, 242, 76, 236, 147, 1, 239, 219, 236, 147, - 1, 240, 180, 236, 147, 1, 87, 236, 147, 1, 71, 236, 147, 1, 79, 236, 147, - 1, 248, 251, 236, 147, 248, 143, 236, 213, 76, 184, 21, 67, 76, 184, 21, - 71, 76, 184, 21, 79, 76, 184, 21, 201, 76, 184, 21, 253, 203, 76, 184, - 21, 253, 139, 76, 184, 21, 253, 235, 76, 184, 21, 253, 253, 76, 184, 21, - 253, 152, 76, 184, 21, 253, 146, 76, 184, 21, 254, 7, 76, 184, 21, 253, - 126, 76, 184, 21, 253, 196, 76, 184, 21, 253, 133, 76, 184, 21, 253, 201, - 76, 184, 21, 253, 232, 76, 184, 21, 248, 55, 76, 184, 21, 253, 129, 76, - 184, 21, 253, 141, 76, 184, 21, 253, 179, 76, 184, 21, 253, 131, 76, 184, - 21, 253, 150, 76, 184, 21, 222, 76, 184, 21, 253, 180, 76, 184, 21, 253, - 154, 76, 184, 21, 216, 76, 184, 21, 253, 171, 76, 184, 21, 254, 48, 76, - 184, 21, 253, 130, 76, 184, 21, 253, 185, 76, 184, 21, 253, 134, 76, 184, - 21, 253, 132, 76, 184, 21, 253, 163, 76, 184, 21, 248, 46, 76, 184, 21, - 248, 66, 76, 184, 21, 219, 76, 184, 21, 233, 118, 76, 184, 21, 231, 117, - 76, 184, 21, 231, 118, 76, 184, 21, 232, 66, 76, 184, 21, 234, 107, 76, - 184, 21, 232, 126, 76, 184, 21, 244, 189, 76, 184, 21, 237, 81, 76, 184, - 248, 143, 236, 213, 76, 184, 61, 127, 76, 184, 61, 111, 76, 184, 61, 248, - 53, 76, 184, 61, 238, 77, 76, 184, 61, 236, 149, 121, 5, 1, 183, 71, 121, - 5, 1, 183, 72, 121, 5, 1, 183, 67, 121, 5, 1, 183, 254, 0, 121, 5, 1, - 183, 73, 121, 5, 1, 183, 253, 156, 121, 5, 1, 242, 215, 71, 121, 5, 1, - 242, 215, 72, 121, 5, 1, 242, 215, 67, 121, 5, 1, 242, 215, 254, 0, 121, - 5, 1, 242, 215, 73, 121, 5, 1, 242, 215, 253, 156, 121, 5, 1, 254, 33, - 121, 5, 1, 254, 121, 121, 5, 1, 254, 14, 121, 5, 1, 248, 192, 121, 5, 1, - 192, 121, 5, 1, 248, 180, 121, 5, 1, 248, 197, 121, 5, 1, 248, 255, 121, - 5, 1, 248, 149, 121, 5, 1, 243, 54, 121, 5, 1, 248, 161, 121, 5, 1, 249, - 92, 121, 5, 1, 249, 67, 121, 5, 1, 254, 21, 121, 5, 1, 249, 10, 121, 5, - 1, 248, 109, 121, 5, 1, 243, 77, 121, 5, 1, 254, 23, 121, 5, 1, 248, 194, - 121, 5, 1, 248, 93, 121, 5, 1, 243, 139, 121, 5, 1, 254, 4, 121, 5, 1, - 254, 3, 121, 5, 1, 254, 22, 121, 5, 1, 253, 202, 121, 5, 1, 248, 108, - 121, 5, 1, 254, 42, 121, 5, 1, 254, 91, 121, 3, 1, 183, 71, 121, 3, 1, - 183, 72, 121, 3, 1, 183, 67, 121, 3, 1, 183, 254, 0, 121, 3, 1, 183, 73, - 121, 3, 1, 183, 253, 156, 121, 3, 1, 242, 215, 71, 121, 3, 1, 242, 215, - 72, 121, 3, 1, 242, 215, 67, 121, 3, 1, 242, 215, 254, 0, 121, 3, 1, 242, - 215, 73, 121, 3, 1, 242, 215, 253, 156, 121, 3, 1, 254, 33, 121, 3, 1, - 254, 121, 121, 3, 1, 254, 14, 121, 3, 1, 248, 192, 121, 3, 1, 192, 121, - 3, 1, 248, 180, 121, 3, 1, 248, 197, 121, 3, 1, 248, 255, 121, 3, 1, 248, - 149, 121, 3, 1, 243, 54, 121, 3, 1, 248, 161, 121, 3, 1, 249, 92, 121, 3, - 1, 249, 67, 121, 3, 1, 254, 21, 121, 3, 1, 249, 10, 121, 3, 1, 248, 109, - 121, 3, 1, 243, 77, 121, 3, 1, 254, 23, 121, 3, 1, 248, 194, 121, 3, 1, - 248, 93, 121, 3, 1, 243, 139, 121, 3, 1, 254, 4, 121, 3, 1, 254, 3, 121, - 3, 1, 254, 22, 121, 3, 1, 253, 202, 121, 3, 1, 248, 108, 121, 3, 1, 254, - 42, 121, 3, 1, 254, 91, 207, 1, 246, 240, 207, 1, 249, 184, 207, 1, 246, - 13, 207, 1, 249, 61, 207, 1, 242, 147, 207, 1, 253, 186, 207, 1, 247, - 127, 207, 1, 239, 25, 207, 1, 253, 77, 207, 1, 245, 204, 207, 1, 250, - 121, 207, 1, 245, 58, 207, 1, 251, 6, 207, 1, 253, 19, 207, 1, 247, 144, - 207, 1, 253, 110, 207, 1, 237, 23, 207, 1, 241, 189, 207, 1, 253, 35, - 207, 1, 241, 144, 207, 1, 246, 53, 207, 1, 246, 86, 207, 1, 254, 174, - 207, 1, 250, 221, 207, 1, 249, 241, 207, 1, 249, 234, 207, 1, 254, 9, - 207, 1, 244, 53, 207, 1, 248, 235, 207, 1, 254, 0, 207, 1, 247, 33, 207, - 1, 248, 132, 207, 1, 248, 207, 207, 1, 249, 235, 207, 1, 249, 84, 207, 1, - 253, 176, 207, 1, 252, 55, 207, 1, 246, 234, 207, 1, 249, 127, 207, 1, - 249, 244, 207, 1, 249, 240, 207, 1, 253, 227, 207, 1, 249, 236, 207, 1, - 250, 228, 207, 1, 241, 18, 207, 1, 248, 206, 207, 1, 251, 100, 207, 1, - 253, 78, 238, 50, 1, 243, 3, 238, 50, 1, 253, 141, 238, 50, 1, 253, 126, - 238, 50, 1, 253, 146, 238, 50, 1, 253, 253, 238, 50, 1, 248, 61, 238, 50, - 1, 245, 60, 238, 50, 1, 253, 130, 238, 50, 1, 253, 132, 238, 50, 1, 242, - 106, 238, 50, 1, 248, 76, 238, 50, 1, 244, 244, 238, 50, 1, 253, 139, - 238, 50, 1, 253, 179, 238, 50, 1, 247, 4, 238, 50, 1, 246, 3, 238, 50, 1, - 246, 34, 238, 50, 1, 246, 84, 238, 50, 1, 246, 197, 238, 50, 1, 248, 142, - 238, 50, 1, 219, 238, 50, 1, 216, 238, 50, 1, 67, 238, 50, 1, 72, 238, - 50, 1, 71, 238, 50, 1, 73, 238, 50, 1, 79, 238, 50, 1, 253, 140, 238, 50, - 1, 253, 164, 238, 50, 1, 253, 156, 238, 50, 26, 242, 217, 238, 50, 26, - 127, 238, 50, 26, 111, 238, 50, 26, 166, 238, 50, 26, 177, 238, 50, 26, - 176, 238, 50, 26, 187, 238, 50, 26, 203, 238, 50, 26, 195, 238, 50, 26, - 202, 172, 4, 67, 172, 4, 72, 172, 4, 71, 172, 4, 73, 172, 4, 79, 172, 4, - 253, 146, 172, 4, 253, 248, 172, 4, 201, 172, 4, 253, 172, 172, 4, 253, - 215, 172, 4, 253, 190, 172, 4, 253, 203, 172, 4, 253, 134, 172, 4, 253, - 250, 172, 4, 253, 251, 172, 4, 253, 216, 172, 4, 254, 8, 172, 4, 222, - 172, 4, 253, 206, 172, 4, 253, 180, 172, 4, 253, 181, 172, 4, 253, 154, - 172, 4, 253, 131, 172, 4, 253, 197, 172, 4, 253, 166, 172, 4, 253, 173, - 172, 4, 253, 150, 172, 4, 253, 129, 172, 4, 253, 175, 172, 4, 253, 147, - 172, 4, 253, 208, 172, 4, 253, 239, 172, 4, 253, 130, 172, 4, 253, 194, - 172, 4, 253, 209, 172, 4, 253, 160, 172, 4, 253, 185, 172, 4, 253, 132, - 172, 4, 253, 210, 172, 4, 253, 198, 172, 4, 253, 186, 172, 4, 253, 211, - 172, 4, 253, 126, 172, 4, 253, 195, 172, 4, 253, 212, 172, 4, 87, 172, 4, - 253, 196, 172, 4, 253, 138, 172, 4, 253, 170, 172, 4, 253, 187, 172, 4, - 253, 177, 172, 4, 253, 253, 172, 4, 254, 132, 172, 4, 253, 163, 172, 4, - 253, 222, 151, 1, 67, 151, 33, 21, 71, 151, 33, 21, 79, 151, 33, 21, 165, - 144, 151, 33, 21, 72, 151, 33, 21, 73, 151, 33, 240, 51, 69, 151, 21, 45, - 248, 51, 46, 151, 21, 235, 61, 151, 21, 236, 173, 151, 1, 201, 151, 1, - 248, 61, 151, 1, 253, 139, 151, 1, 248, 77, 151, 1, 253, 152, 151, 1, - 248, 57, 151, 1, 253, 146, 151, 1, 248, 78, 151, 1, 248, 71, 151, 1, 242, - 247, 151, 1, 248, 75, 151, 1, 242, 249, 151, 1, 248, 82, 151, 1, 253, - 126, 151, 1, 248, 55, 151, 1, 253, 133, 151, 1, 248, 76, 151, 1, 253, - 131, 151, 1, 253, 129, 151, 1, 248, 65, 151, 1, 253, 141, 151, 1, 248, - 81, 151, 1, 222, 151, 1, 216, 151, 1, 253, 130, 151, 1, 253, 134, 151, 1, - 253, 171, 151, 1, 248, 46, 151, 1, 248, 66, 151, 1, 253, 132, 151, 1, - 253, 163, 151, 1, 219, 151, 1, 249, 97, 151, 1, 242, 161, 151, 21, 253, - 144, 48, 151, 21, 241, 44, 151, 21, 53, 46, 151, 238, 72, 151, 26, 127, - 151, 26, 111, 151, 26, 166, 151, 26, 177, 151, 61, 248, 53, 151, 61, 238, - 77, 151, 61, 253, 125, 236, 149, 151, 61, 253, 125, 235, 49, 151, 233, - 51, 248, 40, 151, 233, 51, 3, 238, 51, 151, 233, 51, 238, 51, 151, 233, - 51, 237, 95, 125, 151, 233, 51, 236, 57, 151, 233, 51, 241, 220, 151, - 233, 51, 240, 111, 151, 233, 51, 45, 240, 111, 151, 233, 51, 241, 217, - 37, 20, 12, 240, 29, 37, 20, 12, 239, 37, 37, 20, 12, 232, 71, 37, 20, - 12, 243, 112, 232, 83, 37, 20, 12, 243, 112, 240, 73, 37, 20, 12, 240, - 152, 232, 83, 37, 20, 12, 240, 152, 240, 73, 37, 20, 12, 236, 44, 37, 20, - 12, 235, 30, 37, 20, 12, 232, 191, 37, 20, 12, 235, 43, 37, 20, 12, 236, - 142, 240, 73, 37, 20, 12, 236, 48, 37, 20, 12, 243, 142, 232, 83, 37, 20, - 12, 254, 92, 232, 83, 37, 20, 12, 238, 223, 37, 20, 12, 234, 213, 37, 20, - 12, 233, 116, 37, 20, 12, 234, 45, 240, 73, 37, 20, 12, 238, 20, 37, 20, - 12, 242, 150, 37, 20, 12, 240, 205, 235, 55, 37, 20, 12, 240, 98, 235, - 55, 37, 20, 12, 239, 168, 37, 20, 12, 235, 187, 37, 20, 12, 242, 175, 37, - 20, 12, 249, 85, 235, 55, 37, 20, 12, 238, 118, 235, 55, 37, 20, 12, 235, - 90, 235, 55, 37, 20, 12, 236, 96, 37, 20, 12, 236, 71, 37, 20, 12, 239, - 203, 235, 164, 37, 20, 12, 242, 45, 235, 55, 37, 20, 12, 239, 239, 235, - 55, 37, 20, 12, 236, 246, 235, 55, 37, 20, 12, 235, 165, 37, 20, 12, 238, - 195, 37, 20, 12, 242, 82, 37, 20, 12, 240, 207, 235, 55, 37, 20, 12, 238, - 29, 37, 20, 12, 231, 116, 37, 20, 12, 239, 188, 37, 20, 12, 238, 153, - 235, 55, 37, 20, 12, 238, 153, 251, 225, 238, 15, 37, 20, 12, 235, 132, - 235, 55, 37, 20, 12, 242, 146, 37, 20, 12, 241, 214, 37, 20, 12, 250, - 217, 37, 20, 12, 247, 158, 37, 20, 12, 238, 25, 37, 20, 12, 234, 215, 37, - 20, 12, 243, 142, 254, 92, 248, 64, 37, 20, 12, 240, 18, 235, 55, 37, 20, - 12, 234, 203, 37, 20, 12, 236, 242, 235, 55, 37, 20, 12, 241, 194, 236, - 132, 37, 20, 12, 236, 73, 37, 20, 12, 234, 241, 37, 20, 12, 236, 46, 37, - 20, 12, 236, 253, 235, 55, 37, 20, 12, 237, 246, 37, 20, 12, 233, 92, - 235, 55, 37, 20, 12, 233, 93, 235, 55, 37, 20, 12, 237, 177, 37, 20, 12, - 243, 231, 37, 20, 12, 237, 234, 37, 20, 12, 237, 190, 243, 84, 37, 20, - 12, 236, 242, 243, 84, 37, 20, 12, 232, 59, 37, 20, 12, 231, 139, 37, 20, - 12, 249, 85, 248, 64, 37, 20, 12, 240, 205, 248, 64, 37, 20, 12, 243, - 112, 248, 64, 37, 20, 12, 237, 235, 37, 20, 12, 236, 47, 37, 20, 12, 229, - 51, 37, 20, 12, 229, 47, 37, 20, 12, 237, 233, 248, 64, 37, 20, 12, 235, - 90, 253, 238, 248, 106, 37, 20, 12, 238, 118, 253, 238, 248, 106, 37, 20, - 12, 239, 252, 37, 20, 12, 234, 45, 248, 64, 37, 20, 12, 234, 44, 236, - 126, 248, 64, 37, 20, 12, 238, 49, 37, 20, 12, 229, 48, 37, 20, 12, 237, - 148, 37, 20, 12, 237, 86, 37, 20, 12, 241, 243, 245, 231, 37, 20, 12, - 240, 152, 248, 64, 37, 20, 12, 240, 207, 248, 64, 37, 20, 12, 236, 82, - 248, 64, 37, 20, 12, 239, 151, 37, 20, 12, 233, 114, 37, 20, 12, 237, - 196, 37, 20, 12, 233, 93, 248, 64, 37, 20, 12, 233, 92, 248, 64, 37, 20, - 12, 240, 172, 232, 190, 37, 20, 12, 237, 193, 37, 20, 12, 227, 12, 37, - 20, 12, 236, 242, 248, 64, 37, 20, 12, 233, 194, 37, 20, 12, 238, 153, - 248, 64, 37, 20, 12, 242, 138, 37, 20, 12, 236, 253, 248, 64, 37, 20, 12, - 236, 13, 37, 20, 12, 242, 100, 248, 64, 37, 20, 12, 247, 204, 238, 195, - 37, 20, 12, 227, 8, 37, 20, 12, 229, 53, 37, 20, 12, 231, 32, 37, 20, 12, - 226, 242, 37, 20, 12, 226, 233, 37, 20, 12, 231, 33, 37, 20, 12, 229, 54, - 37, 20, 12, 229, 66, 37, 20, 12, 231, 44, 37, 20, 12, 240, 172, 231, 44, - 37, 20, 12, 235, 132, 248, 64, 37, 20, 12, 233, 109, 250, 230, 37, 20, - 12, 233, 109, 250, 232, 37, 20, 12, 247, 143, 238, 161, 37, 20, 12, 252, - 218, 254, 65, 237, 63, 37, 20, 12, 234, 211, 37, 20, 12, 234, 186, 37, - 20, 12, 249, 208, 243, 20, 37, 20, 12, 249, 208, 248, 106, 37, 20, 12, - 238, 14, 37, 20, 12, 240, 194, 248, 106, 37, 20, 12, 245, 67, 235, 55, - 37, 20, 12, 238, 142, 235, 55, 37, 20, 12, 238, 142, 243, 84, 37, 20, 12, - 238, 142, 248, 64, 37, 20, 12, 236, 246, 248, 64, 37, 20, 12, 244, 83, - 37, 20, 12, 240, 73, 37, 20, 12, 239, 228, 37, 20, 12, 236, 128, 37, 20, - 12, 236, 229, 37, 20, 12, 240, 100, 250, 225, 236, 254, 37, 20, 12, 240, - 100, 254, 57, 236, 221, 37, 20, 12, 240, 100, 247, 159, 236, 221, 37, 20, - 12, 240, 100, 238, 24, 236, 221, 37, 20, 12, 240, 100, 239, 97, 236, 254, - 37, 20, 12, 240, 98, 253, 238, 248, 106, 37, 20, 12, 240, 98, 231, 92, - 235, 171, 37, 20, 12, 240, 98, 231, 92, 240, 168, 37, 20, 12, 235, 204, - 37, 20, 12, 236, 223, 231, 92, 236, 247, 243, 20, 37, 20, 12, 236, 223, - 231, 92, 236, 247, 248, 106, 37, 20, 12, 236, 223, 231, 92, 240, 168, 37, - 20, 12, 235, 37, 37, 20, 12, 241, 14, 37, 20, 12, 233, 209, 37, 20, 12, - 237, 106, 37, 20, 12, 243, 13, 249, 139, 243, 143, 37, 20, 12, 243, 13, - 235, 170, 37, 20, 12, 243, 13, 243, 143, 37, 20, 12, 243, 13, 239, 135, - 37, 20, 12, 243, 13, 246, 66, 37, 20, 12, 243, 13, 240, 184, 37, 20, 12, - 243, 13, 234, 196, 37, 20, 12, 243, 13, 249, 139, 240, 184, 37, 20, 12, - 236, 162, 240, 211, 240, 35, 37, 20, 12, 236, 162, 249, 27, 240, 211, - 240, 35, 37, 20, 12, 236, 162, 237, 5, 240, 35, 37, 20, 12, 236, 162, - 249, 27, 237, 5, 240, 35, 37, 20, 12, 236, 162, 242, 157, 240, 35, 37, - 20, 12, 236, 162, 235, 36, 37, 20, 12, 236, 162, 236, 241, 240, 35, 37, - 20, 12, 236, 162, 236, 241, 238, 198, 240, 35, 37, 20, 12, 236, 162, 238, - 198, 240, 35, 37, 20, 12, 236, 162, 238, 209, 240, 35, 37, 20, 12, 241, - 181, 240, 243, 234, 58, 37, 20, 12, 234, 44, 240, 243, 234, 58, 37, 20, - 12, 235, 99, 233, 40, 37, 20, 12, 235, 99, 233, 87, 37, 20, 12, 235, 99, - 235, 119, 37, 20, 12, 236, 162, 247, 185, 240, 35, 37, 20, 12, 236, 162, - 234, 240, 240, 35, 37, 20, 12, 236, 162, 238, 209, 236, 241, 240, 35, 37, - 20, 12, 234, 57, 255, 98, 238, 161, 37, 20, 12, 234, 57, 255, 98, 237, - 110, 37, 20, 12, 239, 56, 254, 65, 240, 18, 249, 196, 37, 20, 12, 236, - 38, 37, 20, 12, 233, 210, 37, 20, 12, 240, 18, 237, 66, 237, 103, 241, - 178, 37, 20, 12, 240, 18, 235, 72, 253, 129, 37, 20, 12, 240, 18, 235, - 72, 243, 231, 37, 20, 12, 240, 18, 251, 254, 240, 35, 37, 20, 12, 240, - 18, 235, 72, 253, 201, 37, 20, 12, 240, 18, 238, 150, 237, 107, 253, 201, - 37, 20, 12, 240, 18, 235, 72, 253, 172, 37, 20, 12, 240, 18, 235, 72, - 253, 222, 37, 20, 12, 240, 18, 235, 72, 255, 62, 243, 20, 37, 20, 12, - 240, 18, 235, 72, 255, 62, 248, 106, 37, 20, 12, 240, 18, 238, 199, 240, - 110, 235, 119, 37, 20, 12, 240, 18, 238, 199, 240, 110, 233, 87, 37, 20, - 12, 241, 105, 238, 150, 240, 110, 242, 174, 37, 20, 12, 240, 18, 238, - 150, 240, 110, 239, 212, 37, 20, 12, 240, 18, 239, 143, 37, 20, 12, 243, - 89, 242, 209, 37, 20, 12, 243, 89, 239, 109, 37, 20, 12, 243, 89, 239, - 200, 37, 20, 12, 240, 18, 220, 240, 90, 231, 55, 37, 20, 12, 240, 18, - 234, 184, 234, 91, 37, 20, 12, 240, 90, 232, 110, 37, 20, 12, 240, 72, - 232, 110, 37, 20, 12, 240, 72, 231, 55, 37, 20, 12, 240, 72, 248, 146, - 254, 57, 235, 68, 37, 20, 12, 240, 72, 233, 88, 238, 225, 235, 68, 37, - 20, 12, 240, 72, 235, 120, 255, 56, 235, 68, 37, 20, 12, 240, 72, 234, - 86, 249, 128, 235, 68, 37, 20, 12, 240, 90, 248, 146, 254, 57, 235, 68, - 37, 20, 12, 240, 90, 233, 88, 238, 225, 235, 68, 37, 20, 12, 240, 90, - 235, 120, 255, 56, 235, 68, 37, 20, 12, 240, 90, 234, 86, 249, 128, 235, - 68, 37, 20, 12, 240, 179, 239, 43, 37, 20, 12, 240, 179, 239, 250, 37, - 20, 12, 236, 212, 248, 146, 241, 242, 37, 20, 12, 236, 212, 248, 146, - 239, 133, 37, 20, 12, 236, 212, 240, 73, 37, 20, 12, 236, 212, 237, 47, - 37, 20, 12, 236, 186, 237, 47, 37, 20, 12, 236, 186, 238, 155, 237, 7, - 37, 20, 12, 236, 186, 238, 155, 235, 154, 37, 20, 12, 236, 186, 238, 155, - 233, 108, 37, 20, 12, 236, 186, 238, 250, 37, 20, 12, 236, 186, 240, 128, - 237, 7, 37, 20, 12, 236, 186, 240, 128, 235, 154, 37, 20, 12, 236, 186, - 240, 128, 233, 108, 37, 20, 12, 237, 108, 254, 167, 37, 20, 12, 235, 203, - 254, 10, 37, 20, 12, 238, 152, 37, 20, 12, 238, 90, 253, 129, 37, 20, 12, - 238, 90, 249, 196, 37, 20, 12, 238, 90, 253, 139, 37, 20, 12, 238, 90, - 253, 201, 37, 20, 12, 238, 90, 253, 172, 37, 20, 12, 238, 90, 253, 222, - 37, 20, 12, 238, 90, 253, 166, 37, 20, 12, 235, 90, 253, 238, 243, 225, - 37, 20, 12, 238, 118, 253, 238, 243, 225, 37, 20, 12, 235, 90, 253, 238, - 243, 20, 37, 20, 12, 238, 118, 253, 238, 243, 20, 37, 20, 12, 240, 194, - 243, 20, 37, 20, 12, 240, 98, 253, 238, 243, 20, 20, 12, 240, 12, 236, - 194, 20, 12, 45, 236, 194, 20, 12, 30, 236, 194, 20, 12, 238, 75, 30, - 236, 194, 20, 12, 240, 55, 236, 194, 20, 12, 242, 215, 236, 194, 20, 12, - 40, 240, 64, 52, 20, 12, 38, 240, 64, 52, 20, 12, 240, 64, 243, 5, 20, - 12, 253, 199, 240, 219, 20, 12, 255, 70, 244, 242, 20, 12, 240, 219, 20, - 12, 245, 25, 20, 12, 236, 237, 236, 21, 20, 12, 236, 237, 236, 22, 20, - 12, 236, 237, 236, 23, 20, 12, 237, 10, 20, 12, 239, 69, 46, 20, 12, 241, - 37, 69, 20, 12, 237, 82, 20, 12, 241, 35, 20, 12, 104, 20, 12, 237, 225, - 240, 89, 20, 12, 238, 35, 240, 89, 20, 12, 235, 34, 240, 89, 20, 12, 236, - 25, 240, 89, 20, 12, 236, 24, 240, 89, 20, 12, 238, 8, 240, 89, 20, 12, - 235, 2, 234, 55, 20, 12, 233, 204, 234, 55, 20, 12, 255, 104, 243, 37, - 20, 12, 255, 104, 248, 148, 240, 82, 243, 51, 20, 12, 255, 104, 248, 148, - 240, 82, 240, 108, 20, 12, 255, 105, 243, 37, 20, 12, 255, 112, 243, 37, - 20, 12, 255, 112, 248, 148, 240, 82, 243, 51, 20, 12, 255, 112, 248, 148, - 240, 82, 240, 108, 20, 12, 249, 57, 239, 26, 20, 12, 249, 57, 239, 27, - 20, 12, 45, 240, 223, 20, 12, 45, 243, 174, 20, 12, 248, 209, 253, 176, - 20, 12, 248, 209, 242, 236, 20, 12, 238, 146, 253, 176, 20, 12, 238, 146, - 242, 236, 20, 12, 243, 74, 253, 176, 20, 12, 243, 74, 242, 236, 20, 12, - 238, 80, 188, 240, 223, 20, 12, 238, 80, 188, 243, 174, 20, 12, 241, 66, - 244, 31, 20, 12, 254, 153, 244, 31, 20, 12, 240, 82, 243, 51, 20, 12, - 240, 82, 240, 108, 20, 12, 232, 107, 243, 51, 20, 12, 232, 107, 240, 108, - 20, 12, 246, 95, 242, 239, 20, 12, 244, 51, 242, 239, 20, 12, 137, 242, - 239, 20, 12, 238, 80, 242, 239, 20, 12, 240, 62, 242, 239, 20, 12, 235, - 108, 242, 239, 20, 12, 231, 112, 242, 239, 20, 12, 232, 109, 242, 239, - 20, 12, 253, 125, 238, 92, 231, 113, 242, 239, 20, 12, 255, 113, 235, 78, - 20, 12, 248, 49, 235, 78, 20, 12, 218, 255, 113, 235, 78, 20, 12, 31, - 236, 153, 240, 39, 20, 12, 31, 236, 153, 240, 0, 20, 12, 236, 152, 236, - 153, 88, 240, 39, 20, 12, 236, 152, 236, 153, 88, 240, 0, 20, 12, 236, - 152, 236, 153, 40, 240, 39, 20, 12, 236, 152, 236, 153, 40, 240, 0, 20, - 12, 236, 152, 236, 153, 38, 240, 39, 20, 12, 236, 152, 236, 153, 38, 240, - 0, 20, 12, 236, 152, 236, 153, 92, 240, 39, 20, 12, 236, 152, 236, 153, - 92, 240, 0, 20, 12, 236, 152, 236, 153, 88, 38, 240, 39, 20, 12, 236, - 152, 236, 153, 88, 38, 240, 0, 20, 12, 249, 113, 236, 153, 240, 39, 20, - 12, 249, 113, 236, 153, 240, 0, 20, 12, 231, 57, 236, 153, 92, 240, 39, - 20, 12, 231, 57, 236, 153, 92, 240, 0, 20, 12, 233, 56, 235, 78, 20, 12, - 253, 16, 235, 78, 20, 12, 236, 153, 240, 0, 20, 12, 252, 40, 235, 78, 20, - 12, 238, 172, 236, 153, 240, 39, 20, 12, 238, 172, 236, 153, 240, 0, 20, - 12, 239, 255, 20, 12, 244, 51, 243, 9, 20, 12, 137, 243, 9, 20, 12, 238, - 80, 243, 9, 20, 12, 240, 62, 243, 9, 20, 12, 235, 108, 243, 9, 20, 12, - 231, 112, 243, 9, 20, 12, 232, 109, 243, 9, 20, 12, 253, 125, 238, 92, - 231, 113, 243, 9, 20, 12, 50, 243, 46, 20, 12, 50, 233, 38, 243, 46, 20, - 12, 50, 234, 83, 20, 12, 50, 234, 84, 20, 12, 50, 234, 85, 20, 12, 236, - 225, 234, 83, 20, 12, 236, 225, 234, 84, 20, 12, 236, 225, 234, 85, 20, - 12, 50, 232, 117, 248, 40, 20, 12, 50, 239, 71, 20, 12, 50, 239, 72, 20, - 12, 50, 239, 73, 20, 12, 50, 239, 74, 20, 12, 50, 239, 75, 20, 12, 243, - 24, 243, 146, 20, 12, 253, 165, 243, 146, 20, 12, 243, 24, 248, 139, 20, - 12, 253, 165, 248, 139, 20, 12, 243, 24, 244, 19, 20, 12, 253, 165, 244, - 19, 20, 12, 243, 24, 238, 207, 20, 12, 253, 165, 238, 207, 20, 12, 50, - 238, 54, 20, 12, 50, 236, 105, 20, 12, 50, 239, 216, 20, 12, 50, 231, 81, - 20, 12, 50, 237, 201, 20, 12, 50, 227, 2, 20, 12, 50, 227, 11, 20, 12, - 50, 241, 221, 20, 12, 234, 46, 253, 176, 20, 12, 234, 46, 242, 236, 20, - 12, 50, 245, 71, 20, 12, 50, 252, 138, 20, 12, 50, 245, 90, 20, 12, 50, - 242, 117, 20, 12, 50, 244, 217, 20, 12, 50, 45, 238, 156, 20, 12, 50, - 240, 3, 238, 156, 20, 12, 232, 201, 20, 12, 239, 208, 20, 12, 255, 17, - 20, 12, 242, 61, 20, 12, 241, 237, 20, 12, 241, 115, 20, 12, 234, 106, - 20, 12, 232, 127, 20, 12, 243, 186, 249, 122, 240, 37, 20, 12, 243, 186, - 249, 122, 255, 51, 240, 37, 20, 12, 254, 250, 20, 12, 244, 41, 20, 12, - 236, 145, 244, 41, 20, 12, 249, 188, 240, 37, 20, 12, 249, 188, 253, 176, - 20, 12, 236, 172, 236, 111, 20, 12, 236, 172, 236, 112, 20, 12, 236, 172, - 236, 113, 20, 12, 236, 172, 236, 114, 20, 12, 236, 172, 236, 115, 20, 12, - 236, 172, 236, 116, 20, 12, 236, 172, 236, 117, 20, 12, 236, 172, 236, - 118, 20, 12, 236, 172, 236, 119, 20, 12, 236, 172, 235, 3, 20, 12, 236, - 172, 235, 4, 20, 12, 232, 168, 20, 12, 232, 186, 20, 12, 253, 165, 147, - 239, 204, 20, 12, 240, 112, 240, 37, 20, 12, 50, 92, 248, 198, 20, 12, - 50, 88, 248, 198, 20, 12, 50, 236, 34, 20, 12, 50, 252, 182, 234, 235, - 20, 12, 243, 114, 69, 20, 12, 243, 114, 88, 69, 20, 12, 137, 243, 114, - 69, 20, 12, 235, 125, 253, 176, 20, 12, 235, 125, 242, 236, 20, 12, 2, - 232, 165, 20, 12, 245, 34, 20, 12, 250, 181, 249, 26, 20, 12, 239, 131, - 20, 12, 241, 219, 20, 12, 239, 13, 20, 12, 234, 40, 240, 39, 20, 12, 234, - 40, 240, 0, 20, 12, 239, 138, 20, 12, 240, 200, 240, 0, 20, 12, 234, 41, - 240, 39, 20, 12, 234, 41, 240, 0, 20, 12, 249, 65, 240, 39, 20, 12, 249, - 65, 240, 0, 20, 12, 243, 217, 237, 29, 242, 239, 20, 12, 243, 217, 234, - 29, 242, 239, 20, 12, 241, 38, 242, 239, 20, 12, 234, 40, 242, 239, 20, - 12, 240, 200, 242, 239, 20, 12, 234, 41, 242, 239, 20, 12, 240, 65, 235, - 106, 253, 231, 234, 13, 235, 134, 20, 12, 240, 65, 235, 106, 253, 231, - 234, 13, 233, 85, 20, 12, 240, 65, 235, 106, 253, 231, 234, 13, 237, 29, - 231, 102, 20, 12, 240, 65, 233, 62, 253, 231, 234, 13, 235, 134, 20, 12, - 240, 65, 233, 62, 253, 231, 234, 13, 233, 85, 20, 12, 240, 65, 233, 62, - 253, 231, 234, 13, 234, 29, 231, 102, 20, 12, 240, 65, 233, 62, 253, 231, - 234, 13, 234, 29, 231, 126, 20, 12, 240, 65, 233, 62, 253, 231, 234, 13, - 234, 29, 231, 127, 20, 12, 241, 69, 20, 12, 235, 126, 255, 105, 243, 37, - 20, 12, 235, 126, 255, 112, 243, 37, 20, 12, 31, 217, 20, 12, 242, 178, - 20, 12, 237, 238, 20, 12, 239, 28, 20, 12, 234, 251, 20, 12, 235, 190, - 20, 12, 236, 129, 20, 12, 234, 237, 20, 12, 236, 77, 238, 185, 20, 12, - 236, 97, 238, 185, 20, 12, 238, 31, 234, 249, 20, 12, 254, 223, 233, 248, - 17, 242, 222, 126, 235, 146, 17, 242, 222, 126, 235, 147, 17, 242, 222, - 126, 236, 122, 17, 242, 222, 126, 235, 148, 17, 242, 222, 126, 235, 149, - 17, 242, 222, 126, 236, 123, 17, 242, 222, 126, 235, 150, 17, 242, 222, - 126, 235, 151, 17, 242, 222, 126, 236, 124, 17, 242, 222, 126, 235, 7, - 17, 242, 222, 126, 234, 67, 17, 242, 222, 126, 234, 68, 17, 242, 222, - 126, 234, 69, 17, 242, 222, 126, 234, 70, 17, 242, 222, 126, 235, 8, 17, - 242, 222, 126, 235, 9, 17, 242, 222, 126, 234, 71, 17, 242, 222, 126, - 234, 72, 17, 242, 222, 126, 234, 73, 17, 242, 222, 126, 235, 10, 17, 242, - 222, 126, 235, 11, 17, 242, 222, 126, 235, 12, 17, 242, 222, 126, 234, - 74, 17, 242, 222, 126, 234, 75, 17, 242, 222, 126, 234, 76, 17, 242, 222, - 126, 234, 77, 17, 242, 222, 126, 234, 78, 17, 242, 222, 126, 234, 79, 17, - 242, 222, 126, 234, 80, 17, 232, 69, 126, 235, 146, 17, 232, 69, 126, - 235, 147, 17, 232, 69, 126, 235, 148, 17, 232, 69, 126, 235, 149, 17, - 232, 69, 126, 235, 150, 17, 232, 69, 126, 235, 151, 17, 232, 69, 126, - 234, 67, 17, 232, 69, 126, 234, 68, 17, 232, 69, 126, 234, 69, 17, 232, - 69, 126, 234, 70, 17, 232, 69, 126, 234, 71, 17, 232, 69, 126, 234, 72, - 17, 232, 69, 126, 234, 73, 17, 232, 69, 126, 234, 74, 17, 232, 69, 126, - 234, 75, 17, 232, 69, 126, 235, 13, 17, 232, 69, 126, 235, 14, 17, 232, - 69, 126, 235, 15, 17, 232, 69, 126, 235, 16, 17, 232, 69, 126, 235, 17, - 17, 232, 69, 126, 235, 18, 17, 232, 69, 126, 235, 19, 17, 232, 69, 126, - 235, 20, 17, 232, 69, 126, 235, 21, 17, 232, 69, 126, 235, 22, 17, 232, - 69, 126, 235, 23, 17, 232, 69, 126, 235, 24, 17, 232, 69, 126, 235, 25, - 17, 232, 69, 126, 235, 26, 17, 232, 69, 126, 235, 27, 17, 232, 69, 126, - 235, 28, 17, 232, 69, 126, 235, 29, 17, 232, 69, 126, 234, 76, 17, 232, - 69, 126, 234, 77, 17, 232, 69, 126, 234, 78, 17, 232, 69, 126, 234, 79, - 17, 232, 69, 126, 234, 80, 50, 17, 20, 237, 49, 50, 17, 20, 234, 82, 50, - 17, 20, 234, 62, 17, 20, 239, 116, 236, 184, 28, 240, 49, 240, 56, 28, - 237, 174, 240, 49, 240, 56, 28, 245, 203, 240, 49, 240, 56, 28, 238, 181, - 238, 139, 240, 56, 28, 238, 181, 241, 169, 240, 56, 28, 240, 49, 120, 28, - 238, 129, 120, 28, 248, 37, 238, 51, 120, 28, 241, 244, 120, 28, 237, 72, - 120, 28, 238, 193, 240, 147, 120, 28, 232, 122, 120, 28, 238, 252, 120, - 28, 233, 73, 120, 28, 235, 182, 248, 235, 120, 28, 231, 123, 128, 233, - 136, 120, 28, 233, 137, 120, 28, 232, 67, 120, 28, 235, 127, 120, 28, - 232, 192, 120, 28, 240, 215, 120, 28, 237, 91, 120, 28, 238, 189, 244, - 188, 120, 28, 237, 51, 120, 28, 234, 54, 120, 28, 237, 55, 120, 28, 237, - 250, 120, 28, 233, 229, 120, 28, 245, 79, 120, 28, 251, 125, 120, 28, - 233, 127, 120, 28, 234, 185, 120, 28, 239, 54, 120, 28, 239, 21, 120, 28, - 231, 122, 120, 28, 16, 233, 230, 120, 28, 237, 230, 120, 28, 239, 115, - 120, 28, 234, 101, 120, 28, 237, 189, 120, 28, 234, 193, 120, 28, 236, - 109, 120, 28, 239, 169, 120, 28, 236, 28, 120, 28, 234, 248, 120, 28, - 254, 190, 128, 241, 246, 120, 28, 235, 141, 120, 28, 245, 125, 153, 243, - 224, 120, 28, 233, 196, 120, 28, 242, 135, 120, 28, 234, 197, 120, 28, - 232, 164, 120, 28, 237, 232, 120, 28, 239, 174, 120, 28, 239, 76, 120, - 28, 238, 40, 128, 238, 46, 120, 28, 234, 103, 120, 28, 237, 23, 120, 28, - 236, 16, 120, 28, 242, 171, 120, 28, 231, 125, 120, 28, 240, 23, 240, - 201, 120, 28, 232, 167, 120, 28, 235, 124, 253, 247, 120, 28, 237, 204, - 120, 28, 231, 115, 120, 28, 231, 65, 120, 28, 241, 88, 120, 28, 240, 252, - 120, 28, 238, 6, 120, 28, 241, 180, 120, 28, 234, 109, 120, 28, 234, 108, - 120, 28, 237, 109, 120, 28, 233, 199, 120, 28, 234, 253, 120, 28, 236, - 107, 120, 28, 236, 33, 120, 28, 233, 69, 120, 28, 237, 88, 120, 28, 237, - 154, 120, 28, 232, 114, 120, 28, 233, 125, 120, 28, 255, 34, 253, 145, - 242, 177, 120, 28, 231, 124, 120, 28, 234, 217, 120, 28, 234, 191, 10, - 16, 5, 67, 10, 16, 5, 217, 10, 16, 5, 255, 18, 10, 16, 5, 209, 10, 16, 5, - 72, 10, 16, 5, 255, 19, 10, 16, 5, 210, 10, 16, 5, 192, 10, 16, 5, 71, - 10, 16, 5, 221, 10, 16, 5, 255, 15, 10, 16, 5, 162, 10, 16, 5, 173, 10, - 16, 5, 197, 10, 16, 5, 73, 10, 16, 5, 223, 10, 16, 5, 255, 20, 10, 16, 5, - 144, 10, 16, 5, 193, 10, 16, 5, 214, 10, 16, 5, 79, 10, 16, 5, 179, 10, - 16, 5, 255, 16, 10, 16, 5, 206, 10, 16, 5, 255, 14, 10, 16, 5, 255, 17, - 10, 16, 3, 67, 10, 16, 3, 217, 10, 16, 3, 255, 18, 10, 16, 3, 209, 10, - 16, 3, 72, 10, 16, 3, 255, 19, 10, 16, 3, 210, 10, 16, 3, 192, 10, 16, 3, - 71, 10, 16, 3, 221, 10, 16, 3, 255, 15, 10, 16, 3, 162, 10, 16, 3, 173, - 10, 16, 3, 197, 10, 16, 3, 73, 10, 16, 3, 223, 10, 16, 3, 255, 20, 10, - 16, 3, 144, 10, 16, 3, 193, 10, 16, 3, 214, 10, 16, 3, 79, 10, 16, 3, - 179, 10, 16, 3, 255, 16, 10, 16, 3, 206, 10, 16, 3, 255, 14, 10, 16, 3, - 255, 17, 10, 24, 5, 67, 10, 24, 5, 217, 10, 24, 5, 255, 18, 10, 24, 5, - 209, 10, 24, 5, 72, 10, 24, 5, 255, 19, 10, 24, 5, 210, 10, 24, 5, 192, - 10, 24, 5, 71, 10, 24, 5, 221, 10, 24, 5, 255, 15, 10, 24, 5, 162, 10, - 24, 5, 173, 10, 24, 5, 197, 10, 24, 5, 73, 10, 24, 5, 223, 10, 24, 5, - 255, 20, 10, 24, 5, 144, 10, 24, 5, 193, 10, 24, 5, 214, 10, 24, 5, 79, - 10, 24, 5, 179, 10, 24, 5, 255, 16, 10, 24, 5, 206, 10, 24, 5, 255, 14, - 10, 24, 5, 255, 17, 10, 24, 3, 67, 10, 24, 3, 217, 10, 24, 3, 255, 18, - 10, 24, 3, 209, 10, 24, 3, 72, 10, 24, 3, 255, 19, 10, 24, 3, 210, 10, - 24, 3, 71, 10, 24, 3, 221, 10, 24, 3, 255, 15, 10, 24, 3, 162, 10, 24, 3, - 173, 10, 24, 3, 197, 10, 24, 3, 73, 10, 24, 3, 223, 10, 24, 3, 255, 20, - 10, 24, 3, 144, 10, 24, 3, 193, 10, 24, 3, 214, 10, 24, 3, 79, 10, 24, 3, - 179, 10, 24, 3, 255, 16, 10, 24, 3, 206, 10, 24, 3, 255, 14, 10, 24, 3, - 255, 17, 10, 16, 24, 5, 67, 10, 16, 24, 5, 217, 10, 16, 24, 5, 255, 18, - 10, 16, 24, 5, 209, 10, 16, 24, 5, 72, 10, 16, 24, 5, 255, 19, 10, 16, - 24, 5, 210, 10, 16, 24, 5, 192, 10, 16, 24, 5, 71, 10, 16, 24, 5, 221, - 10, 16, 24, 5, 255, 15, 10, 16, 24, 5, 162, 10, 16, 24, 5, 173, 10, 16, - 24, 5, 197, 10, 16, 24, 5, 73, 10, 16, 24, 5, 223, 10, 16, 24, 5, 255, - 20, 10, 16, 24, 5, 144, 10, 16, 24, 5, 193, 10, 16, 24, 5, 214, 10, 16, - 24, 5, 79, 10, 16, 24, 5, 179, 10, 16, 24, 5, 255, 16, 10, 16, 24, 5, - 206, 10, 16, 24, 5, 255, 14, 10, 16, 24, 5, 255, 17, 10, 16, 24, 3, 67, - 10, 16, 24, 3, 217, 10, 16, 24, 3, 255, 18, 10, 16, 24, 3, 209, 10, 16, - 24, 3, 72, 10, 16, 24, 3, 255, 19, 10, 16, 24, 3, 210, 10, 16, 24, 3, - 192, 10, 16, 24, 3, 71, 10, 16, 24, 3, 221, 10, 16, 24, 3, 255, 15, 10, - 16, 24, 3, 162, 10, 16, 24, 3, 173, 10, 16, 24, 3, 197, 10, 16, 24, 3, - 73, 10, 16, 24, 3, 223, 10, 16, 24, 3, 255, 20, 10, 16, 24, 3, 144, 10, - 16, 24, 3, 193, 10, 16, 24, 3, 214, 10, 16, 24, 3, 79, 10, 16, 24, 3, - 179, 10, 16, 24, 3, 255, 16, 10, 16, 24, 3, 206, 10, 16, 24, 3, 255, 14, - 10, 16, 24, 3, 255, 17, 10, 84, 5, 67, 10, 84, 5, 255, 18, 10, 84, 5, - 209, 10, 84, 5, 210, 10, 84, 5, 221, 10, 84, 5, 255, 15, 10, 84, 5, 197, - 10, 84, 5, 73, 10, 84, 5, 223, 10, 84, 5, 255, 20, 10, 84, 5, 193, 10, - 84, 5, 214, 10, 84, 5, 79, 10, 84, 5, 179, 10, 84, 5, 255, 16, 10, 84, 5, - 206, 10, 84, 5, 255, 14, 10, 84, 5, 255, 17, 10, 84, 3, 67, 10, 84, 3, - 217, 10, 84, 3, 255, 18, 10, 84, 3, 209, 10, 84, 3, 255, 19, 10, 84, 3, - 192, 10, 84, 3, 71, 10, 84, 3, 221, 10, 84, 3, 255, 15, 10, 84, 3, 162, - 10, 84, 3, 173, 10, 84, 3, 197, 10, 84, 3, 223, 10, 84, 3, 255, 20, 10, - 84, 3, 144, 10, 84, 3, 193, 10, 84, 3, 214, 10, 84, 3, 79, 10, 84, 3, - 179, 10, 84, 3, 255, 16, 10, 84, 3, 206, 10, 84, 3, 255, 14, 10, 84, 3, - 255, 17, 10, 16, 84, 5, 67, 10, 16, 84, 5, 217, 10, 16, 84, 5, 255, 18, - 10, 16, 84, 5, 209, 10, 16, 84, 5, 72, 10, 16, 84, 5, 255, 19, 10, 16, - 84, 5, 210, 10, 16, 84, 5, 192, 10, 16, 84, 5, 71, 10, 16, 84, 5, 221, - 10, 16, 84, 5, 255, 15, 10, 16, 84, 5, 162, 10, 16, 84, 5, 173, 10, 16, - 84, 5, 197, 10, 16, 84, 5, 73, 10, 16, 84, 5, 223, 10, 16, 84, 5, 255, - 20, 10, 16, 84, 5, 144, 10, 16, 84, 5, 193, 10, 16, 84, 5, 214, 10, 16, - 84, 5, 79, 10, 16, 84, 5, 179, 10, 16, 84, 5, 255, 16, 10, 16, 84, 5, - 206, 10, 16, 84, 5, 255, 14, 10, 16, 84, 5, 255, 17, 10, 16, 84, 3, 67, - 10, 16, 84, 3, 217, 10, 16, 84, 3, 255, 18, 10, 16, 84, 3, 209, 10, 16, - 84, 3, 72, 10, 16, 84, 3, 255, 19, 10, 16, 84, 3, 210, 10, 16, 84, 3, - 192, 10, 16, 84, 3, 71, 10, 16, 84, 3, 221, 10, 16, 84, 3, 255, 15, 10, - 16, 84, 3, 162, 10, 16, 84, 3, 173, 10, 16, 84, 3, 197, 10, 16, 84, 3, - 73, 10, 16, 84, 3, 223, 10, 16, 84, 3, 255, 20, 10, 16, 84, 3, 144, 10, - 16, 84, 3, 193, 10, 16, 84, 3, 214, 10, 16, 84, 3, 79, 10, 16, 84, 3, - 179, 10, 16, 84, 3, 255, 16, 10, 16, 84, 3, 206, 10, 16, 84, 3, 255, 14, - 10, 16, 84, 3, 255, 17, 10, 93, 5, 67, 10, 93, 5, 217, 10, 93, 5, 209, - 10, 93, 5, 72, 10, 93, 5, 255, 19, 10, 93, 5, 210, 10, 93, 5, 221, 10, - 93, 5, 255, 15, 10, 93, 5, 162, 10, 93, 5, 173, 10, 93, 5, 197, 10, 93, - 5, 73, 10, 93, 5, 223, 10, 93, 5, 255, 20, 10, 93, 5, 193, 10, 93, 5, - 214, 10, 93, 5, 79, 10, 93, 5, 179, 10, 93, 5, 255, 16, 10, 93, 5, 206, - 10, 93, 5, 255, 14, 10, 93, 3, 67, 10, 93, 3, 217, 10, 93, 3, 255, 18, - 10, 93, 3, 209, 10, 93, 3, 72, 10, 93, 3, 255, 19, 10, 93, 3, 210, 10, - 93, 3, 192, 10, 93, 3, 71, 10, 93, 3, 221, 10, 93, 3, 255, 15, 10, 93, 3, - 162, 10, 93, 3, 173, 10, 93, 3, 197, 10, 93, 3, 73, 10, 93, 3, 223, 10, - 93, 3, 255, 20, 10, 93, 3, 144, 10, 93, 3, 193, 10, 93, 3, 214, 10, 93, - 3, 79, 10, 93, 3, 179, 10, 93, 3, 255, 16, 10, 93, 3, 206, 10, 93, 3, - 255, 14, 10, 93, 3, 255, 17, 10, 138, 5, 67, 10, 138, 5, 217, 10, 138, 5, - 209, 10, 138, 5, 72, 10, 138, 5, 255, 19, 10, 138, 5, 210, 10, 138, 5, - 71, 10, 138, 5, 221, 10, 138, 5, 255, 15, 10, 138, 5, 162, 10, 138, 5, - 173, 10, 138, 5, 73, 10, 138, 5, 193, 10, 138, 5, 214, 10, 138, 5, 79, - 10, 138, 5, 179, 10, 138, 5, 255, 16, 10, 138, 5, 206, 10, 138, 5, 255, - 14, 10, 138, 3, 67, 10, 138, 3, 217, 10, 138, 3, 255, 18, 10, 138, 3, - 209, 10, 138, 3, 72, 10, 138, 3, 255, 19, 10, 138, 3, 210, 10, 138, 3, - 192, 10, 138, 3, 71, 10, 138, 3, 221, 10, 138, 3, 255, 15, 10, 138, 3, - 162, 10, 138, 3, 173, 10, 138, 3, 197, 10, 138, 3, 73, 10, 138, 3, 223, - 10, 138, 3, 255, 20, 10, 138, 3, 144, 10, 138, 3, 193, 10, 138, 3, 214, - 10, 138, 3, 79, 10, 138, 3, 179, 10, 138, 3, 255, 16, 10, 138, 3, 206, - 10, 138, 3, 255, 14, 10, 138, 3, 255, 17, 10, 16, 93, 5, 67, 10, 16, 93, - 5, 217, 10, 16, 93, 5, 255, 18, 10, 16, 93, 5, 209, 10, 16, 93, 5, 72, - 10, 16, 93, 5, 255, 19, 10, 16, 93, 5, 210, 10, 16, 93, 5, 192, 10, 16, - 93, 5, 71, 10, 16, 93, 5, 221, 10, 16, 93, 5, 255, 15, 10, 16, 93, 5, - 162, 10, 16, 93, 5, 173, 10, 16, 93, 5, 197, 10, 16, 93, 5, 73, 10, 16, - 93, 5, 223, 10, 16, 93, 5, 255, 20, 10, 16, 93, 5, 144, 10, 16, 93, 5, - 193, 10, 16, 93, 5, 214, 10, 16, 93, 5, 79, 10, 16, 93, 5, 179, 10, 16, - 93, 5, 255, 16, 10, 16, 93, 5, 206, 10, 16, 93, 5, 255, 14, 10, 16, 93, - 5, 255, 17, 10, 16, 93, 3, 67, 10, 16, 93, 3, 217, 10, 16, 93, 3, 255, - 18, 10, 16, 93, 3, 209, 10, 16, 93, 3, 72, 10, 16, 93, 3, 255, 19, 10, - 16, 93, 3, 210, 10, 16, 93, 3, 192, 10, 16, 93, 3, 71, 10, 16, 93, 3, - 221, 10, 16, 93, 3, 255, 15, 10, 16, 93, 3, 162, 10, 16, 93, 3, 173, 10, - 16, 93, 3, 197, 10, 16, 93, 3, 73, 10, 16, 93, 3, 223, 10, 16, 93, 3, - 255, 20, 10, 16, 93, 3, 144, 10, 16, 93, 3, 193, 10, 16, 93, 3, 214, 10, - 16, 93, 3, 79, 10, 16, 93, 3, 179, 10, 16, 93, 3, 255, 16, 10, 16, 93, 3, - 206, 10, 16, 93, 3, 255, 14, 10, 16, 93, 3, 255, 17, 10, 27, 5, 67, 10, - 27, 5, 217, 10, 27, 5, 255, 18, 10, 27, 5, 209, 10, 27, 5, 72, 10, 27, 5, - 255, 19, 10, 27, 5, 210, 10, 27, 5, 192, 10, 27, 5, 71, 10, 27, 5, 221, - 10, 27, 5, 255, 15, 10, 27, 5, 162, 10, 27, 5, 173, 10, 27, 5, 197, 10, - 27, 5, 73, 10, 27, 5, 223, 10, 27, 5, 255, 20, 10, 27, 5, 144, 10, 27, 5, - 193, 10, 27, 5, 214, 10, 27, 5, 79, 10, 27, 5, 179, 10, 27, 5, 255, 16, - 10, 27, 5, 206, 10, 27, 5, 255, 14, 10, 27, 5, 255, 17, 10, 27, 3, 67, - 10, 27, 3, 217, 10, 27, 3, 255, 18, 10, 27, 3, 209, 10, 27, 3, 72, 10, - 27, 3, 255, 19, 10, 27, 3, 210, 10, 27, 3, 192, 10, 27, 3, 71, 10, 27, 3, - 221, 10, 27, 3, 255, 15, 10, 27, 3, 162, 10, 27, 3, 173, 10, 27, 3, 197, - 10, 27, 3, 73, 10, 27, 3, 223, 10, 27, 3, 255, 20, 10, 27, 3, 144, 10, - 27, 3, 193, 10, 27, 3, 214, 10, 27, 3, 79, 10, 27, 3, 179, 10, 27, 3, - 255, 16, 10, 27, 3, 206, 10, 27, 3, 255, 14, 10, 27, 3, 255, 17, 10, 27, - 16, 5, 67, 10, 27, 16, 5, 217, 10, 27, 16, 5, 255, 18, 10, 27, 16, 5, - 209, 10, 27, 16, 5, 72, 10, 27, 16, 5, 255, 19, 10, 27, 16, 5, 210, 10, - 27, 16, 5, 192, 10, 27, 16, 5, 71, 10, 27, 16, 5, 221, 10, 27, 16, 5, - 255, 15, 10, 27, 16, 5, 162, 10, 27, 16, 5, 173, 10, 27, 16, 5, 197, 10, - 27, 16, 5, 73, 10, 27, 16, 5, 223, 10, 27, 16, 5, 255, 20, 10, 27, 16, 5, - 144, 10, 27, 16, 5, 193, 10, 27, 16, 5, 214, 10, 27, 16, 5, 79, 10, 27, - 16, 5, 179, 10, 27, 16, 5, 255, 16, 10, 27, 16, 5, 206, 10, 27, 16, 5, - 255, 14, 10, 27, 16, 5, 255, 17, 10, 27, 16, 3, 67, 10, 27, 16, 3, 217, - 10, 27, 16, 3, 255, 18, 10, 27, 16, 3, 209, 10, 27, 16, 3, 72, 10, 27, - 16, 3, 255, 19, 10, 27, 16, 3, 210, 10, 27, 16, 3, 192, 10, 27, 16, 3, - 71, 10, 27, 16, 3, 221, 10, 27, 16, 3, 255, 15, 10, 27, 16, 3, 162, 10, - 27, 16, 3, 173, 10, 27, 16, 3, 197, 10, 27, 16, 3, 73, 10, 27, 16, 3, - 223, 10, 27, 16, 3, 255, 20, 10, 27, 16, 3, 144, 10, 27, 16, 3, 193, 10, - 27, 16, 3, 214, 10, 27, 16, 3, 79, 10, 27, 16, 3, 179, 10, 27, 16, 3, - 255, 16, 10, 27, 16, 3, 206, 10, 27, 16, 3, 255, 14, 10, 27, 16, 3, 255, - 17, 10, 27, 24, 5, 67, 10, 27, 24, 5, 217, 10, 27, 24, 5, 255, 18, 10, - 27, 24, 5, 209, 10, 27, 24, 5, 72, 10, 27, 24, 5, 255, 19, 10, 27, 24, 5, - 210, 10, 27, 24, 5, 192, 10, 27, 24, 5, 71, 10, 27, 24, 5, 221, 10, 27, - 24, 5, 255, 15, 10, 27, 24, 5, 162, 10, 27, 24, 5, 173, 10, 27, 24, 5, - 197, 10, 27, 24, 5, 73, 10, 27, 24, 5, 223, 10, 27, 24, 5, 255, 20, 10, - 27, 24, 5, 144, 10, 27, 24, 5, 193, 10, 27, 24, 5, 214, 10, 27, 24, 5, - 79, 10, 27, 24, 5, 179, 10, 27, 24, 5, 255, 16, 10, 27, 24, 5, 206, 10, - 27, 24, 5, 255, 14, 10, 27, 24, 5, 255, 17, 10, 27, 24, 3, 67, 10, 27, - 24, 3, 217, 10, 27, 24, 3, 255, 18, 10, 27, 24, 3, 209, 10, 27, 24, 3, - 72, 10, 27, 24, 3, 255, 19, 10, 27, 24, 3, 210, 10, 27, 24, 3, 192, 10, - 27, 24, 3, 71, 10, 27, 24, 3, 221, 10, 27, 24, 3, 255, 15, 10, 27, 24, 3, - 162, 10, 27, 24, 3, 173, 10, 27, 24, 3, 197, 10, 27, 24, 3, 73, 10, 27, - 24, 3, 223, 10, 27, 24, 3, 255, 20, 10, 27, 24, 3, 144, 10, 27, 24, 3, - 193, 10, 27, 24, 3, 214, 10, 27, 24, 3, 79, 10, 27, 24, 3, 179, 10, 27, - 24, 3, 255, 16, 10, 27, 24, 3, 206, 10, 27, 24, 3, 255, 14, 10, 27, 24, - 3, 255, 17, 10, 27, 16, 24, 5, 67, 10, 27, 16, 24, 5, 217, 10, 27, 16, - 24, 5, 255, 18, 10, 27, 16, 24, 5, 209, 10, 27, 16, 24, 5, 72, 10, 27, - 16, 24, 5, 255, 19, 10, 27, 16, 24, 5, 210, 10, 27, 16, 24, 5, 192, 10, - 27, 16, 24, 5, 71, 10, 27, 16, 24, 5, 221, 10, 27, 16, 24, 5, 255, 15, - 10, 27, 16, 24, 5, 162, 10, 27, 16, 24, 5, 173, 10, 27, 16, 24, 5, 197, - 10, 27, 16, 24, 5, 73, 10, 27, 16, 24, 5, 223, 10, 27, 16, 24, 5, 255, - 20, 10, 27, 16, 24, 5, 144, 10, 27, 16, 24, 5, 193, 10, 27, 16, 24, 5, - 214, 10, 27, 16, 24, 5, 79, 10, 27, 16, 24, 5, 179, 10, 27, 16, 24, 5, - 255, 16, 10, 27, 16, 24, 5, 206, 10, 27, 16, 24, 5, 255, 14, 10, 27, 16, - 24, 5, 255, 17, 10, 27, 16, 24, 3, 67, 10, 27, 16, 24, 3, 217, 10, 27, - 16, 24, 3, 255, 18, 10, 27, 16, 24, 3, 209, 10, 27, 16, 24, 3, 72, 10, - 27, 16, 24, 3, 255, 19, 10, 27, 16, 24, 3, 210, 10, 27, 16, 24, 3, 192, - 10, 27, 16, 24, 3, 71, 10, 27, 16, 24, 3, 221, 10, 27, 16, 24, 3, 255, - 15, 10, 27, 16, 24, 3, 162, 10, 27, 16, 24, 3, 173, 10, 27, 16, 24, 3, - 197, 10, 27, 16, 24, 3, 73, 10, 27, 16, 24, 3, 223, 10, 27, 16, 24, 3, - 255, 20, 10, 27, 16, 24, 3, 144, 10, 27, 16, 24, 3, 193, 10, 27, 16, 24, - 3, 214, 10, 27, 16, 24, 3, 79, 10, 27, 16, 24, 3, 179, 10, 27, 16, 24, 3, - 255, 16, 10, 27, 16, 24, 3, 206, 10, 27, 16, 24, 3, 255, 14, 10, 27, 16, - 24, 3, 255, 17, 10, 160, 5, 67, 10, 160, 5, 217, 10, 160, 5, 255, 18, 10, - 160, 5, 209, 10, 160, 5, 72, 10, 160, 5, 255, 19, 10, 160, 5, 210, 10, - 160, 5, 192, 10, 160, 5, 71, 10, 160, 5, 221, 10, 160, 5, 255, 15, 10, + 2, 57, 39, 13, 11, 18, 253, 78, 2, 103, 39, 13, 11, 18, 253, 78, 2, 94, + 39, 13, 11, 18, 253, 78, 2, 164, 39, 13, 11, 18, 253, 78, 2, 51, 39, 13, + 11, 18, 253, 78, 2, 83, 150, 39, 13, 11, 18, 253, 78, 2, 57, 39, 13, 11, + 18, 230, 124, 2, 103, 39, 13, 11, 18, 230, 124, 2, 94, 39, 13, 11, 18, + 230, 124, 2, 164, 39, 13, 11, 18, 230, 124, 2, 51, 39, 13, 11, 18, 230, + 124, 2, 83, 150, 39, 13, 11, 18, 230, 124, 2, 57, 39, 13, 11, 18, 230, + 74, 2, 103, 39, 13, 11, 18, 230, 74, 2, 51, 39, 13, 11, 18, 230, 74, 2, + 83, 150, 39, 13, 11, 18, 230, 74, 2, 57, 39, 13, 11, 18, 103, 2, 94, 39, + 13, 11, 18, 103, 2, 51, 39, 13, 11, 18, 94, 2, 103, 39, 13, 11, 18, 94, + 2, 51, 39, 13, 11, 18, 164, 2, 103, 39, 13, 11, 18, 164, 2, 94, 39, 13, + 11, 18, 164, 2, 51, 39, 13, 11, 18, 233, 192, 2, 103, 39, 13, 11, 18, + 233, 192, 2, 94, 39, 13, 11, 18, 233, 192, 2, 164, 39, 13, 11, 18, 233, + 192, 2, 51, 39, 13, 11, 18, 234, 2, 2, 94, 39, 13, 11, 18, 234, 2, 2, 51, + 39, 13, 11, 18, 251, 98, 2, 103, 39, 13, 11, 18, 251, 98, 2, 94, 39, 13, + 11, 18, 251, 98, 2, 164, 39, 13, 11, 18, 251, 98, 2, 51, 39, 13, 11, 18, + 230, 170, 2, 94, 39, 13, 11, 18, 230, 170, 2, 51, 39, 13, 11, 18, 227, + 100, 2, 51, 39, 13, 11, 18, 255, 52, 2, 103, 39, 13, 11, 18, 255, 52, 2, + 51, 39, 13, 11, 18, 247, 113, 2, 103, 39, 13, 11, 18, 247, 113, 2, 51, + 39, 13, 11, 18, 248, 99, 2, 103, 39, 13, 11, 18, 248, 99, 2, 94, 39, 13, + 11, 18, 248, 99, 2, 164, 39, 13, 11, 18, 248, 99, 2, 51, 39, 13, 11, 18, + 248, 99, 2, 83, 150, 39, 13, 11, 18, 248, 99, 2, 57, 39, 13, 11, 18, 235, + 86, 2, 94, 39, 13, 11, 18, 235, 86, 2, 51, 39, 13, 11, 18, 235, 86, 2, + 83, 150, 39, 13, 11, 18, 235, 86, 2, 57, 39, 13, 11, 18, 241, 6, 2, 83, + 39, 13, 11, 18, 241, 6, 2, 103, 39, 13, 11, 18, 241, 6, 2, 94, 39, 13, + 11, 18, 241, 6, 2, 164, 39, 13, 11, 18, 241, 6, 2, 182, 39, 13, 11, 18, + 241, 6, 2, 51, 39, 13, 11, 18, 241, 6, 2, 83, 150, 39, 13, 11, 18, 241, + 6, 2, 57, 39, 13, 11, 18, 182, 2, 103, 39, 13, 11, 18, 182, 2, 94, 39, + 13, 11, 18, 182, 2, 164, 39, 13, 11, 18, 182, 2, 51, 39, 13, 11, 18, 182, + 2, 83, 150, 39, 13, 11, 18, 182, 2, 57, 39, 13, 11, 18, 51, 2, 103, 39, + 13, 11, 18, 51, 2, 94, 39, 13, 11, 18, 51, 2, 164, 39, 13, 11, 18, 51, 2, + 51, 39, 13, 11, 18, 51, 2, 83, 150, 39, 13, 11, 18, 51, 2, 57, 39, 13, + 11, 18, 198, 2, 103, 39, 13, 11, 18, 198, 2, 94, 39, 13, 11, 18, 198, 2, + 164, 39, 13, 11, 18, 198, 2, 51, 39, 13, 11, 18, 198, 2, 83, 150, 39, 13, + 11, 18, 198, 2, 57, 39, 13, 11, 18, 246, 197, 2, 103, 39, 13, 11, 18, + 246, 197, 2, 51, 39, 13, 11, 18, 246, 197, 2, 83, 150, 39, 13, 11, 18, + 246, 197, 2, 57, 39, 13, 11, 18, 57, 2, 103, 39, 13, 11, 18, 57, 2, 94, + 39, 13, 11, 18, 57, 2, 164, 39, 13, 11, 18, 57, 2, 51, 39, 13, 11, 18, + 57, 2, 83, 150, 39, 13, 11, 18, 57, 2, 57, 39, 13, 11, 18, 230, 83, 2, + 231, 28, 83, 39, 13, 11, 18, 234, 186, 2, 231, 28, 83, 39, 13, 11, 18, + 83, 150, 2, 231, 28, 83, 39, 13, 11, 18, 232, 143, 2, 251, 74, 39, 13, + 11, 18, 232, 143, 2, 240, 235, 39, 13, 11, 18, 232, 143, 2, 248, 115, 39, + 13, 11, 18, 232, 143, 2, 251, 76, 39, 13, 11, 18, 232, 143, 2, 240, 237, + 39, 13, 11, 18, 232, 143, 2, 231, 28, 83, 39, 13, 11, 18, 57, 2, 143, 60, + 2, 234, 186, 30, 13, 11, 18, 57, 2, 143, 60, 2, 227, 98, 30, 13, 11, 18, + 57, 2, 143, 60, 2, 51, 30, 13, 11, 18, 57, 2, 143, 60, 2, 198, 30, 13, + 11, 18, 57, 2, 143, 60, 2, 83, 150, 30, 13, 11, 18, 57, 2, 143, 60, 2, + 57, 30, 13, 11, 18, 253, 78, 2, 234, 186, 30, 13, 11, 18, 253, 78, 2, + 227, 98, 30, 13, 11, 18, 253, 78, 2, 51, 30, 13, 11, 18, 253, 78, 2, 198, + 30, 13, 11, 18, 253, 78, 2, 83, 150, 30, 13, 11, 18, 253, 78, 2, 57, 30, + 13, 11, 18, 230, 124, 2, 234, 186, 30, 13, 11, 18, 230, 124, 2, 227, 98, + 30, 13, 11, 18, 230, 124, 2, 51, 30, 13, 11, 18, 230, 124, 2, 198, 30, + 13, 11, 18, 230, 124, 2, 83, 150, 30, 13, 11, 18, 230, 124, 2, 57, 30, + 13, 11, 18, 230, 74, 2, 234, 186, 30, 13, 11, 18, 230, 74, 2, 227, 98, + 30, 13, 11, 18, 230, 74, 2, 51, 30, 13, 11, 18, 230, 74, 2, 198, 30, 13, + 11, 18, 230, 74, 2, 83, 150, 30, 13, 11, 18, 230, 74, 2, 57, 30, 13, 11, + 18, 248, 99, 2, 83, 150, 30, 13, 11, 18, 248, 99, 2, 57, 30, 13, 11, 18, + 235, 86, 2, 83, 150, 30, 13, 11, 18, 235, 86, 2, 57, 30, 13, 11, 18, 241, + 6, 2, 83, 30, 13, 11, 18, 241, 6, 2, 182, 30, 13, 11, 18, 241, 6, 2, 51, + 30, 13, 11, 18, 241, 6, 2, 83, 150, 30, 13, 11, 18, 241, 6, 2, 57, 30, + 13, 11, 18, 182, 2, 51, 30, 13, 11, 18, 182, 2, 83, 150, 30, 13, 11, 18, + 182, 2, 57, 30, 13, 11, 18, 51, 2, 83, 30, 13, 11, 18, 51, 2, 51, 30, 13, + 11, 18, 198, 2, 234, 186, 30, 13, 11, 18, 198, 2, 227, 98, 30, 13, 11, + 18, 198, 2, 51, 30, 13, 11, 18, 198, 2, 198, 30, 13, 11, 18, 198, 2, 83, + 150, 30, 13, 11, 18, 198, 2, 57, 30, 13, 11, 18, 83, 150, 2, 231, 28, 83, + 30, 13, 11, 18, 57, 2, 234, 186, 30, 13, 11, 18, 57, 2, 227, 98, 30, 13, + 11, 18, 57, 2, 51, 30, 13, 11, 18, 57, 2, 198, 30, 13, 11, 18, 57, 2, 83, + 150, 30, 13, 11, 18, 57, 2, 57, 30, 13, 11, 18, 57, 2, 143, 60, 2, 103, + 54, 13, 11, 18, 57, 2, 143, 60, 2, 94, 54, 13, 11, 18, 57, 2, 143, 60, 2, + 164, 54, 13, 11, 18, 57, 2, 143, 60, 2, 51, 54, 13, 11, 18, 57, 2, 143, + 60, 2, 246, 197, 54, 13, 11, 18, 253, 78, 2, 103, 54, 13, 11, 18, 253, + 78, 2, 94, 54, 13, 11, 18, 253, 78, 2, 164, 54, 13, 11, 18, 253, 78, 2, + 51, 54, 13, 11, 18, 253, 78, 2, 246, 197, 54, 13, 11, 18, 230, 124, 2, + 103, 54, 13, 11, 18, 230, 124, 2, 94, 54, 13, 11, 18, 230, 124, 2, 164, + 54, 13, 11, 18, 230, 124, 2, 51, 54, 13, 11, 18, 230, 124, 2, 246, 197, + 54, 13, 11, 18, 230, 74, 2, 51, 54, 13, 11, 18, 103, 2, 94, 54, 13, 11, + 18, 103, 2, 51, 54, 13, 11, 18, 94, 2, 103, 54, 13, 11, 18, 94, 2, 51, + 54, 13, 11, 18, 164, 2, 103, 54, 13, 11, 18, 164, 2, 51, 54, 13, 11, 18, + 233, 192, 2, 103, 54, 13, 11, 18, 233, 192, 2, 94, 54, 13, 11, 18, 233, + 192, 2, 164, 54, 13, 11, 18, 233, 192, 2, 51, 54, 13, 11, 18, 234, 2, 2, + 94, 54, 13, 11, 18, 234, 2, 2, 164, 54, 13, 11, 18, 234, 2, 2, 51, 54, + 13, 11, 18, 251, 98, 2, 103, 54, 13, 11, 18, 251, 98, 2, 94, 54, 13, 11, + 18, 251, 98, 2, 164, 54, 13, 11, 18, 251, 98, 2, 51, 54, 13, 11, 18, 230, + 170, 2, 94, 54, 13, 11, 18, 227, 100, 2, 51, 54, 13, 11, 18, 255, 52, 2, + 103, 54, 13, 11, 18, 255, 52, 2, 51, 54, 13, 11, 18, 247, 113, 2, 103, + 54, 13, 11, 18, 247, 113, 2, 51, 54, 13, 11, 18, 248, 99, 2, 103, 54, 13, + 11, 18, 248, 99, 2, 94, 54, 13, 11, 18, 248, 99, 2, 164, 54, 13, 11, 18, + 248, 99, 2, 51, 54, 13, 11, 18, 235, 86, 2, 94, 54, 13, 11, 18, 235, 86, + 2, 51, 54, 13, 11, 18, 241, 6, 2, 103, 54, 13, 11, 18, 241, 6, 2, 94, 54, + 13, 11, 18, 241, 6, 2, 164, 54, 13, 11, 18, 241, 6, 2, 182, 54, 13, 11, + 18, 241, 6, 2, 51, 54, 13, 11, 18, 182, 2, 103, 54, 13, 11, 18, 182, 2, + 94, 54, 13, 11, 18, 182, 2, 164, 54, 13, 11, 18, 182, 2, 51, 54, 13, 11, + 18, 182, 2, 246, 197, 54, 13, 11, 18, 51, 2, 103, 54, 13, 11, 18, 51, 2, + 94, 54, 13, 11, 18, 51, 2, 164, 54, 13, 11, 18, 51, 2, 51, 54, 13, 11, + 18, 198, 2, 103, 54, 13, 11, 18, 198, 2, 94, 54, 13, 11, 18, 198, 2, 164, + 54, 13, 11, 18, 198, 2, 51, 54, 13, 11, 18, 198, 2, 246, 197, 54, 13, 11, + 18, 246, 197, 2, 103, 54, 13, 11, 18, 246, 197, 2, 51, 54, 13, 11, 18, + 246, 197, 2, 231, 28, 83, 54, 13, 11, 18, 57, 2, 103, 54, 13, 11, 18, 57, + 2, 94, 54, 13, 11, 18, 57, 2, 164, 54, 13, 11, 18, 57, 2, 51, 54, 13, 11, + 18, 57, 2, 246, 197, 54, 13, 11, 18, 57, 2, 143, 60, 2, 51, 113, 13, 11, + 18, 57, 2, 143, 60, 2, 246, 197, 113, 13, 11, 18, 253, 78, 2, 51, 113, + 13, 11, 18, 253, 78, 2, 246, 197, 113, 13, 11, 18, 230, 124, 2, 51, 113, + 13, 11, 18, 230, 124, 2, 246, 197, 113, 13, 11, 18, 230, 74, 2, 51, 113, + 13, 11, 18, 230, 74, 2, 246, 197, 113, 13, 11, 18, 233, 192, 2, 51, 113, + 13, 11, 18, 233, 192, 2, 246, 197, 113, 13, 11, 18, 232, 123, 2, 51, 113, + 13, 11, 18, 232, 123, 2, 246, 197, 113, 13, 11, 18, 241, 6, 2, 182, 113, + 13, 11, 18, 241, 6, 2, 51, 113, 13, 11, 18, 182, 2, 51, 113, 13, 11, 18, + 198, 2, 51, 113, 13, 11, 18, 198, 2, 246, 197, 113, 13, 11, 18, 57, 2, + 51, 113, 13, 11, 18, 57, 2, 246, 197, 113, 13, 11, 18, 232, 143, 2, 248, + 115, 113, 13, 11, 18, 232, 143, 2, 251, 76, 113, 13, 11, 18, 232, 143, 2, + 240, 237, 113, 13, 11, 18, 230, 170, 2, 83, 150, 39, 13, 11, 18, 230, + 170, 2, 57, 39, 13, 11, 18, 255, 52, 2, 83, 150, 39, 13, 11, 18, 255, 52, + 2, 57, 39, 13, 11, 18, 247, 113, 2, 83, 150, 39, 13, 11, 18, 247, 113, 2, + 57, 39, 13, 11, 18, 233, 192, 2, 83, 150, 39, 13, 11, 18, 233, 192, 2, + 57, 39, 13, 11, 18, 232, 123, 2, 83, 150, 39, 13, 11, 18, 232, 123, 2, + 57, 39, 13, 11, 18, 94, 2, 83, 150, 39, 13, 11, 18, 94, 2, 57, 39, 13, + 11, 18, 103, 2, 83, 150, 39, 13, 11, 18, 103, 2, 57, 39, 13, 11, 18, 164, + 2, 83, 150, 39, 13, 11, 18, 164, 2, 57, 39, 13, 11, 18, 234, 2, 2, 83, + 150, 39, 13, 11, 18, 234, 2, 2, 57, 39, 13, 11, 18, 251, 98, 2, 83, 150, + 39, 13, 11, 18, 251, 98, 2, 57, 39, 13, 11, 18, 232, 123, 2, 103, 39, 13, + 11, 18, 232, 123, 2, 94, 39, 13, 11, 18, 232, 123, 2, 164, 39, 13, 11, + 18, 232, 123, 2, 51, 39, 13, 11, 18, 232, 123, 2, 234, 186, 39, 13, 11, + 18, 233, 192, 2, 234, 186, 39, 13, 11, 18, 234, 2, 2, 234, 186, 39, 13, + 11, 18, 251, 98, 2, 234, 186, 39, 13, 11, 18, 230, 170, 2, 83, 150, 30, + 13, 11, 18, 230, 170, 2, 57, 30, 13, 11, 18, 255, 52, 2, 83, 150, 30, 13, + 11, 18, 255, 52, 2, 57, 30, 13, 11, 18, 247, 113, 2, 83, 150, 30, 13, 11, + 18, 247, 113, 2, 57, 30, 13, 11, 18, 233, 192, 2, 83, 150, 30, 13, 11, + 18, 233, 192, 2, 57, 30, 13, 11, 18, 232, 123, 2, 83, 150, 30, 13, 11, + 18, 232, 123, 2, 57, 30, 13, 11, 18, 94, 2, 83, 150, 30, 13, 11, 18, 94, + 2, 57, 30, 13, 11, 18, 103, 2, 83, 150, 30, 13, 11, 18, 103, 2, 57, 30, + 13, 11, 18, 164, 2, 83, 150, 30, 13, 11, 18, 164, 2, 57, 30, 13, 11, 18, + 234, 2, 2, 83, 150, 30, 13, 11, 18, 234, 2, 2, 57, 30, 13, 11, 18, 251, + 98, 2, 83, 150, 30, 13, 11, 18, 251, 98, 2, 57, 30, 13, 11, 18, 232, 123, + 2, 103, 30, 13, 11, 18, 232, 123, 2, 94, 30, 13, 11, 18, 232, 123, 2, + 164, 30, 13, 11, 18, 232, 123, 2, 51, 30, 13, 11, 18, 232, 123, 2, 234, + 186, 30, 13, 11, 18, 233, 192, 2, 234, 186, 30, 13, 11, 18, 234, 2, 2, + 234, 186, 30, 13, 11, 18, 251, 98, 2, 234, 186, 30, 13, 11, 18, 232, 123, + 2, 103, 54, 13, 11, 18, 232, 123, 2, 94, 54, 13, 11, 18, 232, 123, 2, + 164, 54, 13, 11, 18, 232, 123, 2, 51, 54, 13, 11, 18, 233, 192, 2, 246, + 197, 54, 13, 11, 18, 232, 123, 2, 246, 197, 54, 13, 11, 18, 230, 170, 2, + 51, 54, 13, 11, 18, 233, 192, 2, 103, 113, 13, 11, 18, 233, 192, 2, 94, + 113, 13, 11, 18, 233, 192, 2, 164, 113, 13, 11, 18, 232, 123, 2, 103, + 113, 13, 11, 18, 232, 123, 2, 94, 113, 13, 11, 18, 232, 123, 2, 164, 113, + 13, 11, 18, 230, 170, 2, 51, 113, 13, 11, 18, 227, 100, 2, 51, 113, 13, + 11, 18, 83, 2, 248, 113, 30, 13, 11, 18, 83, 2, 248, 113, 39, 13, 236, + 177, 40, 236, 106, 236, 177, 38, 236, 106, 11, 18, 230, 124, 2, 103, 2, + 51, 54, 13, 11, 18, 230, 124, 2, 94, 2, 103, 30, 13, 11, 18, 230, 124, 2, + 94, 2, 103, 54, 13, 11, 18, 230, 124, 2, 94, 2, 51, 54, 13, 11, 18, 230, + 124, 2, 164, 2, 51, 54, 13, 11, 18, 230, 124, 2, 51, 2, 103, 54, 13, 11, + 18, 230, 124, 2, 51, 2, 94, 54, 13, 11, 18, 230, 124, 2, 51, 2, 164, 54, + 13, 11, 18, 103, 2, 51, 2, 94, 30, 13, 11, 18, 103, 2, 51, 2, 94, 54, 13, + 11, 18, 94, 2, 51, 2, 57, 30, 13, 11, 18, 94, 2, 51, 2, 83, 150, 30, 13, + 11, 18, 233, 192, 2, 94, 2, 103, 54, 13, 11, 18, 233, 192, 2, 103, 2, 94, + 54, 13, 11, 18, 233, 192, 2, 103, 2, 83, 150, 30, 13, 11, 18, 233, 192, + 2, 51, 2, 94, 30, 13, 11, 18, 233, 192, 2, 51, 2, 94, 54, 13, 11, 18, + 233, 192, 2, 51, 2, 103, 54, 13, 11, 18, 233, 192, 2, 51, 2, 51, 30, 13, + 11, 18, 233, 192, 2, 51, 2, 51, 54, 13, 11, 18, 234, 2, 2, 94, 2, 94, 30, + 13, 11, 18, 234, 2, 2, 94, 2, 94, 54, 13, 11, 18, 234, 2, 2, 51, 2, 51, + 30, 13, 11, 18, 232, 123, 2, 94, 2, 51, 30, 13, 11, 18, 232, 123, 2, 94, + 2, 51, 54, 13, 11, 18, 232, 123, 2, 103, 2, 57, 30, 13, 11, 18, 232, 123, + 2, 51, 2, 164, 30, 13, 11, 18, 232, 123, 2, 51, 2, 164, 54, 13, 11, 18, + 232, 123, 2, 51, 2, 51, 30, 13, 11, 18, 232, 123, 2, 51, 2, 51, 54, 13, + 11, 18, 251, 98, 2, 94, 2, 83, 150, 30, 13, 11, 18, 251, 98, 2, 164, 2, + 51, 30, 13, 11, 18, 251, 98, 2, 164, 2, 51, 54, 13, 11, 18, 230, 170, 2, + 51, 2, 94, 30, 13, 11, 18, 230, 170, 2, 51, 2, 94, 54, 13, 11, 18, 230, + 170, 2, 51, 2, 51, 54, 13, 11, 18, 230, 170, 2, 51, 2, 57, 30, 13, 11, + 18, 255, 52, 2, 103, 2, 51, 30, 13, 11, 18, 255, 52, 2, 51, 2, 51, 30, + 13, 11, 18, 255, 52, 2, 51, 2, 51, 54, 13, 11, 18, 255, 52, 2, 51, 2, 83, + 150, 30, 13, 11, 18, 247, 113, 2, 51, 2, 51, 30, 13, 11, 18, 247, 113, 2, + 51, 2, 57, 30, 13, 11, 18, 247, 113, 2, 51, 2, 83, 150, 30, 13, 11, 18, + 248, 99, 2, 164, 2, 51, 30, 13, 11, 18, 248, 99, 2, 164, 2, 51, 54, 13, + 11, 18, 235, 86, 2, 51, 2, 94, 30, 13, 11, 18, 235, 86, 2, 51, 2, 51, 30, + 13, 11, 18, 182, 2, 94, 2, 51, 30, 13, 11, 18, 182, 2, 94, 2, 57, 30, 13, + 11, 18, 182, 2, 94, 2, 83, 150, 30, 13, 11, 18, 182, 2, 103, 2, 103, 54, + 13, 11, 18, 182, 2, 103, 2, 103, 30, 13, 11, 18, 182, 2, 164, 2, 51, 30, + 13, 11, 18, 182, 2, 164, 2, 51, 54, 13, 11, 18, 182, 2, 51, 2, 94, 30, + 13, 11, 18, 182, 2, 51, 2, 94, 54, 13, 11, 18, 51, 2, 94, 2, 103, 54, 13, + 11, 18, 51, 2, 94, 2, 51, 54, 13, 11, 18, 51, 2, 94, 2, 57, 30, 13, 11, + 18, 51, 2, 103, 2, 94, 54, 13, 11, 18, 51, 2, 103, 2, 51, 54, 13, 11, 18, + 51, 2, 164, 2, 103, 54, 13, 11, 18, 51, 2, 164, 2, 51, 54, 13, 11, 18, + 51, 2, 103, 2, 164, 54, 13, 11, 18, 246, 197, 2, 51, 2, 103, 54, 13, 11, + 18, 246, 197, 2, 51, 2, 51, 54, 13, 11, 18, 198, 2, 94, 2, 51, 54, 13, + 11, 18, 198, 2, 94, 2, 83, 150, 30, 13, 11, 18, 198, 2, 103, 2, 51, 30, + 13, 11, 18, 198, 2, 103, 2, 51, 54, 13, 11, 18, 198, 2, 103, 2, 83, 150, + 30, 13, 11, 18, 198, 2, 51, 2, 57, 30, 13, 11, 18, 198, 2, 51, 2, 83, + 150, 30, 13, 11, 18, 57, 2, 51, 2, 51, 30, 13, 11, 18, 57, 2, 51, 2, 51, + 54, 13, 11, 18, 253, 78, 2, 164, 2, 57, 30, 13, 11, 18, 230, 124, 2, 103, + 2, 57, 30, 13, 11, 18, 230, 124, 2, 103, 2, 83, 150, 30, 13, 11, 18, 230, + 124, 2, 164, 2, 57, 30, 13, 11, 18, 230, 124, 2, 164, 2, 83, 150, 30, 13, + 11, 18, 230, 124, 2, 51, 2, 57, 30, 13, 11, 18, 230, 124, 2, 51, 2, 83, + 150, 30, 13, 11, 18, 103, 2, 51, 2, 57, 30, 13, 11, 18, 103, 2, 94, 2, + 83, 150, 30, 13, 11, 18, 103, 2, 51, 2, 83, 150, 30, 13, 11, 18, 233, + 192, 2, 164, 2, 83, 150, 30, 13, 11, 18, 234, 2, 2, 94, 2, 57, 30, 13, + 11, 18, 232, 123, 2, 94, 2, 57, 30, 13, 11, 18, 251, 98, 2, 94, 2, 57, + 30, 13, 11, 18, 182, 2, 103, 2, 57, 30, 13, 11, 18, 182, 2, 51, 2, 57, + 30, 13, 11, 18, 57, 2, 94, 2, 57, 30, 13, 11, 18, 57, 2, 103, 2, 57, 30, + 13, 11, 18, 57, 2, 51, 2, 57, 30, 13, 11, 18, 51, 2, 51, 2, 57, 30, 13, + 11, 18, 235, 86, 2, 51, 2, 57, 30, 13, 11, 18, 198, 2, 94, 2, 57, 30, 13, + 11, 18, 235, 86, 2, 51, 2, 94, 54, 13, 11, 18, 182, 2, 94, 2, 51, 54, 13, + 11, 18, 255, 52, 2, 51, 2, 57, 30, 13, 11, 18, 241, 6, 2, 51, 2, 57, 30, + 13, 11, 18, 198, 2, 103, 2, 94, 54, 13, 11, 18, 51, 2, 164, 2, 57, 30, + 13, 11, 18, 182, 2, 103, 2, 51, 54, 13, 11, 18, 241, 6, 2, 51, 2, 51, 30, + 13, 11, 18, 182, 2, 103, 2, 51, 30, 13, 11, 18, 198, 2, 103, 2, 94, 30, + 13, 11, 18, 103, 2, 94, 2, 57, 30, 13, 11, 18, 94, 2, 103, 2, 57, 30, 13, + 11, 18, 51, 2, 103, 2, 57, 30, 13, 11, 18, 248, 99, 2, 51, 2, 57, 30, 13, + 11, 18, 253, 78, 2, 94, 2, 57, 30, 13, 11, 18, 241, 6, 2, 51, 2, 51, 54, + 13, 11, 18, 255, 52, 2, 103, 2, 51, 54, 13, 11, 18, 234, 2, 2, 51, 2, 51, + 54, 13, 11, 18, 233, 192, 2, 164, 2, 57, 30, 13, 11, 18, 198, 2, 103, 2, + 57, 30, 13, 11, 18, 233, 247, 228, 239, 254, 168, 240, 111, 231, 93, 21, + 39, 13, 11, 18, 235, 82, 228, 239, 254, 168, 240, 111, 231, 93, 21, 39, + 13, 11, 18, 255, 29, 39, 13, 11, 18, 255, 44, 39, 13, 11, 18, 238, 169, + 39, 13, 11, 18, 233, 248, 39, 13, 11, 18, 234, 212, 39, 13, 11, 18, 255, + 40, 39, 13, 11, 18, 228, 131, 39, 13, 11, 18, 233, 247, 39, 13, 11, 18, + 233, 246, 255, 40, 228, 130, 11, 18, 241, 104, 234, 144, 52, 11, 18, 253, + 22, 254, 210, 254, 211, 34, 233, 182, 34, 233, 71, 34, 233, 3, 34, 232, + 248, 34, 232, 237, 34, 232, 226, 34, 232, 215, 34, 232, 204, 34, 232, + 193, 34, 233, 181, 34, 233, 170, 34, 233, 159, 34, 233, 148, 34, 233, + 137, 34, 233, 126, 34, 233, 115, 235, 159, 248, 7, 28, 59, 251, 214, 235, + 159, 248, 7, 28, 59, 80, 251, 214, 235, 159, 248, 7, 28, 59, 80, 247, + 231, 208, 235, 159, 248, 7, 28, 59, 251, 219, 235, 159, 248, 7, 28, 59, + 232, 176, 235, 159, 248, 7, 28, 59, 248, 156, 69, 235, 159, 248, 7, 28, + 59, 235, 23, 69, 235, 159, 248, 7, 28, 59, 40, 64, 239, 232, 104, 235, + 159, 248, 7, 28, 59, 38, 64, 239, 232, 252, 238, 235, 159, 248, 7, 28, + 59, 163, 248, 243, 50, 18, 40, 246, 236, 50, 18, 38, 246, 236, 50, 45, + 230, 1, 40, 246, 236, 50, 45, 230, 1, 38, 246, 236, 235, 159, 248, 7, 28, + 59, 171, 53, 239, 253, 235, 159, 248, 7, 28, 59, 248, 242, 251, 54, 235, + 159, 248, 7, 28, 59, 248, 235, 251, 54, 235, 159, 248, 7, 28, 59, 170, + 239, 193, 235, 159, 248, 7, 28, 59, 228, 117, 170, 239, 193, 235, 159, + 248, 7, 28, 59, 40, 236, 106, 235, 159, 248, 7, 28, 59, 38, 236, 106, + 235, 159, 248, 7, 28, 59, 40, 251, 134, 104, 235, 159, 248, 7, 28, 59, + 38, 251, 134, 104, 235, 159, 248, 7, 28, 59, 40, 229, 202, 232, 117, 104, + 235, 159, 248, 7, 28, 59, 38, 229, 202, 232, 117, 104, 235, 159, 248, 7, + 28, 59, 40, 86, 239, 232, 104, 235, 159, 248, 7, 28, 59, 38, 86, 239, + 232, 104, 235, 159, 248, 7, 28, 59, 40, 45, 185, 104, 235, 159, 248, 7, + 28, 59, 38, 45, 185, 104, 235, 159, 248, 7, 28, 59, 40, 185, 104, 235, + 159, 248, 7, 28, 59, 38, 185, 104, 235, 159, 248, 7, 28, 59, 40, 251, + 174, 104, 235, 159, 248, 7, 28, 59, 38, 251, 174, 104, 235, 159, 248, 7, + 28, 59, 40, 64, 251, 174, 104, 235, 159, 248, 7, 28, 59, 38, 64, 251, + 174, 104, 232, 161, 250, 100, 64, 232, 161, 250, 100, 235, 159, 248, 7, + 28, 59, 40, 31, 104, 235, 159, 248, 7, 28, 59, 38, 31, 104, 251, 53, 236, + 154, 252, 105, 236, 154, 228, 117, 236, 154, 45, 228, 117, 236, 154, 251, + 53, 170, 239, 193, 252, 105, 170, 239, 193, 228, 117, 170, 239, 193, 3, + 251, 214, 3, 80, 251, 214, 3, 247, 231, 208, 3, 232, 176, 3, 251, 219, 3, + 235, 23, 69, 3, 248, 156, 69, 3, 248, 242, 251, 54, 3, 40, 236, 106, 3, + 38, 236, 106, 3, 40, 251, 134, 104, 3, 38, 251, 134, 104, 3, 40, 229, + 202, 232, 117, 104, 3, 38, 229, 202, 232, 117, 104, 3, 61, 52, 3, 255, + 11, 3, 254, 159, 3, 235, 214, 52, 3, 245, 247, 3, 239, 228, 52, 3, 247, + 43, 52, 3, 248, 202, 52, 3, 234, 158, 231, 208, 3, 250, 107, 52, 3, 236, + 56, 52, 3, 251, 213, 254, 153, 11, 248, 113, 39, 13, 11, 230, 149, 2, + 248, 113, 48, 11, 251, 74, 39, 13, 11, 230, 168, 247, 247, 11, 240, 235, + 39, 13, 11, 248, 115, 39, 13, 11, 248, 115, 113, 13, 11, 251, 76, 39, 13, + 11, 251, 76, 113, 13, 11, 240, 237, 39, 13, 11, 240, 237, 113, 13, 11, + 232, 143, 39, 13, 11, 232, 143, 113, 13, 11, 231, 41, 39, 13, 11, 231, + 41, 113, 13, 11, 1, 143, 39, 13, 11, 1, 83, 2, 239, 101, 60, 39, 13, 11, + 1, 83, 2, 239, 101, 60, 30, 13, 11, 1, 83, 2, 143, 60, 39, 13, 11, 1, 83, + 2, 143, 60, 30, 13, 11, 1, 228, 116, 2, 143, 60, 39, 13, 11, 1, 228, 116, + 2, 143, 60, 30, 13, 11, 1, 83, 2, 143, 253, 68, 39, 13, 11, 1, 83, 2, + 143, 253, 68, 30, 13, 11, 1, 57, 2, 143, 60, 39, 13, 11, 1, 57, 2, 143, + 60, 30, 13, 11, 1, 57, 2, 143, 60, 54, 13, 11, 1, 57, 2, 143, 60, 113, + 13, 11, 1, 83, 39, 13, 11, 1, 83, 30, 13, 11, 1, 253, 78, 39, 13, 11, 1, + 253, 78, 30, 13, 11, 1, 253, 78, 54, 13, 11, 1, 253, 78, 113, 13, 11, 1, + 230, 124, 239, 71, 39, 13, 11, 1, 230, 124, 239, 71, 30, 13, 11, 1, 230, + 124, 39, 13, 11, 1, 230, 124, 30, 13, 11, 1, 230, 124, 54, 13, 11, 1, + 230, 124, 113, 13, 11, 1, 230, 74, 39, 13, 11, 1, 230, 74, 30, 13, 11, 1, + 230, 74, 54, 13, 11, 1, 230, 74, 113, 13, 11, 1, 103, 39, 13, 11, 1, 103, + 30, 13, 11, 1, 103, 54, 13, 11, 1, 103, 113, 13, 11, 1, 94, 39, 13, 11, + 1, 94, 30, 13, 11, 1, 94, 54, 13, 11, 1, 94, 113, 13, 11, 1, 164, 39, 13, + 11, 1, 164, 30, 13, 11, 1, 164, 54, 13, 11, 1, 164, 113, 13, 11, 1, 251, + 84, 39, 13, 11, 1, 251, 84, 30, 13, 11, 1, 230, 83, 39, 13, 11, 1, 230, + 83, 30, 13, 11, 1, 234, 186, 39, 13, 11, 1, 234, 186, 30, 13, 11, 1, 227, + 98, 39, 13, 11, 1, 227, 98, 30, 13, 11, 1, 233, 192, 39, 13, 11, 1, 233, + 192, 30, 13, 11, 1, 233, 192, 54, 13, 11, 1, 233, 192, 113, 13, 11, 1, + 232, 123, 39, 13, 11, 1, 232, 123, 30, 13, 11, 1, 232, 123, 54, 13, 11, + 1, 232, 123, 113, 13, 11, 1, 234, 2, 39, 13, 11, 1, 234, 2, 30, 13, 11, + 1, 234, 2, 54, 13, 11, 1, 234, 2, 113, 13, 11, 1, 251, 98, 39, 13, 11, 1, + 251, 98, 30, 13, 11, 1, 251, 98, 54, 13, 11, 1, 251, 98, 113, 13, 11, 1, + 230, 170, 39, 13, 11, 1, 230, 170, 30, 13, 11, 1, 230, 170, 54, 13, 11, + 1, 230, 170, 113, 13, 11, 1, 227, 100, 39, 13, 11, 1, 227, 100, 30, 13, + 11, 1, 227, 100, 54, 13, 11, 1, 227, 100, 113, 13, 11, 1, 255, 52, 39, + 13, 11, 1, 255, 52, 30, 13, 11, 1, 255, 52, 54, 13, 11, 1, 255, 52, 113, + 13, 11, 1, 247, 113, 39, 13, 11, 1, 247, 113, 30, 13, 11, 1, 247, 113, + 54, 13, 11, 1, 247, 113, 113, 13, 11, 1, 248, 99, 39, 13, 11, 1, 248, 99, + 30, 13, 11, 1, 248, 99, 54, 13, 11, 1, 248, 99, 113, 13, 11, 1, 235, 86, + 39, 13, 11, 1, 235, 86, 30, 13, 11, 1, 235, 86, 54, 13, 11, 1, 235, 86, + 113, 13, 11, 1, 241, 6, 39, 13, 11, 1, 241, 6, 30, 13, 11, 1, 241, 6, 54, + 13, 11, 1, 241, 6, 113, 13, 11, 1, 182, 39, 13, 11, 1, 182, 30, 13, 11, + 1, 182, 54, 13, 11, 1, 182, 113, 13, 11, 1, 51, 39, 13, 11, 1, 51, 30, + 13, 11, 1, 51, 54, 13, 11, 1, 51, 113, 13, 11, 1, 198, 39, 13, 11, 1, + 198, 30, 13, 11, 1, 198, 54, 13, 11, 1, 198, 113, 13, 11, 1, 246, 197, + 39, 13, 11, 1, 246, 197, 30, 13, 11, 1, 246, 197, 54, 13, 11, 1, 246, + 197, 113, 13, 11, 1, 228, 116, 39, 13, 11, 1, 228, 116, 30, 13, 11, 1, + 83, 150, 39, 13, 11, 1, 83, 150, 30, 13, 11, 1, 57, 39, 13, 11, 1, 57, + 30, 13, 11, 1, 57, 54, 13, 11, 1, 57, 113, 13, 11, 18, 182, 2, 83, 2, + 239, 101, 60, 39, 13, 11, 18, 182, 2, 83, 2, 239, 101, 60, 30, 13, 11, + 18, 182, 2, 83, 2, 143, 60, 39, 13, 11, 18, 182, 2, 83, 2, 143, 60, 30, + 13, 11, 18, 182, 2, 83, 2, 143, 253, 68, 39, 13, 11, 18, 182, 2, 83, 2, + 143, 253, 68, 30, 13, 11, 18, 182, 2, 83, 39, 13, 11, 18, 182, 2, 83, 30, + 13, 227, 81, 228, 89, 237, 137, 231, 193, 89, 248, 156, 69, 89, 235, 13, + 69, 89, 61, 52, 89, 250, 107, 52, 89, 236, 56, 52, 89, 255, 11, 89, 254, + 222, 89, 40, 236, 106, 89, 38, 236, 106, 89, 254, 159, 89, 235, 214, 52, + 89, 251, 214, 89, 245, 247, 89, 247, 231, 208, 89, 231, 208, 89, 26, 227, + 80, 89, 26, 127, 89, 26, 111, 89, 26, 166, 89, 26, 177, 89, 26, 176, 89, + 26, 187, 89, 26, 203, 89, 26, 195, 89, 26, 202, 89, 251, 219, 89, 232, + 176, 89, 239, 228, 52, 89, 248, 202, 52, 89, 247, 43, 52, 89, 235, 23, + 69, 89, 251, 213, 254, 153, 89, 8, 5, 1, 67, 89, 8, 5, 1, 217, 89, 8, 5, + 1, 252, 178, 89, 8, 5, 1, 209, 89, 8, 5, 1, 72, 89, 8, 5, 1, 248, 140, + 89, 8, 5, 1, 210, 89, 8, 5, 1, 192, 89, 8, 5, 1, 71, 89, 8, 5, 1, 221, + 89, 8, 5, 1, 241, 12, 89, 8, 5, 1, 162, 89, 8, 5, 1, 173, 89, 8, 5, 1, + 197, 89, 8, 5, 1, 73, 89, 8, 5, 1, 223, 89, 8, 5, 1, 235, 93, 89, 8, 5, + 1, 144, 89, 8, 5, 1, 193, 89, 8, 5, 1, 214, 89, 8, 5, 1, 79, 89, 8, 5, 1, + 179, 89, 8, 5, 1, 228, 144, 89, 8, 5, 1, 206, 89, 8, 5, 1, 228, 7, 89, 8, + 5, 1, 227, 103, 89, 40, 31, 104, 89, 234, 158, 231, 208, 89, 38, 31, 104, + 89, 190, 255, 90, 89, 170, 239, 193, 89, 247, 46, 255, 90, 89, 8, 3, 1, + 67, 89, 8, 3, 1, 217, 89, 8, 3, 1, 252, 178, 89, 8, 3, 1, 209, 89, 8, 3, + 1, 72, 89, 8, 3, 1, 248, 140, 89, 8, 3, 1, 210, 89, 8, 3, 1, 192, 89, 8, + 3, 1, 71, 89, 8, 3, 1, 221, 89, 8, 3, 1, 241, 12, 89, 8, 3, 1, 162, 89, + 8, 3, 1, 173, 89, 8, 3, 1, 197, 89, 8, 3, 1, 73, 89, 8, 3, 1, 223, 89, 8, + 3, 1, 235, 93, 89, 8, 3, 1, 144, 89, 8, 3, 1, 193, 89, 8, 3, 1, 214, 89, + 8, 3, 1, 79, 89, 8, 3, 1, 179, 89, 8, 3, 1, 228, 144, 89, 8, 3, 1, 206, + 89, 8, 3, 1, 228, 7, 89, 8, 3, 1, 227, 103, 89, 40, 251, 134, 104, 89, + 59, 239, 193, 89, 38, 251, 134, 104, 89, 169, 89, 40, 64, 236, 106, 89, + 38, 64, 236, 106, 74, 80, 247, 231, 208, 74, 40, 251, 174, 104, 74, 38, + 251, 174, 104, 74, 80, 251, 214, 74, 42, 238, 223, 250, 100, 74, 42, 1, + 228, 82, 74, 42, 1, 3, 67, 74, 42, 1, 3, 71, 74, 42, 1, 3, 79, 74, 42, 1, + 3, 72, 74, 42, 1, 3, 73, 74, 42, 1, 3, 216, 74, 42, 1, 3, 227, 142, 74, + 42, 1, 3, 227, 167, 74, 42, 1, 3, 229, 106, 74, 240, 232, 235, 145, 231, + 202, 69, 74, 42, 1, 67, 74, 42, 1, 71, 74, 42, 1, 79, 74, 42, 1, 72, 74, + 42, 1, 73, 74, 42, 1, 201, 74, 42, 1, 240, 168, 74, 42, 1, 240, 92, 74, + 42, 1, 240, 219, 74, 42, 1, 240, 127, 74, 42, 1, 234, 8, 74, 42, 1, 232, + 51, 74, 42, 1, 231, 62, 74, 42, 1, 233, 203, 74, 42, 1, 231, 216, 74, 42, + 1, 230, 182, 74, 42, 1, 230, 15, 74, 42, 1, 229, 106, 74, 42, 1, 230, + 131, 74, 42, 1, 87, 74, 42, 1, 238, 91, 74, 42, 1, 237, 209, 74, 42, 1, + 237, 83, 74, 42, 1, 238, 9, 74, 42, 1, 237, 138, 74, 42, 1, 219, 74, 42, + 1, 246, 169, 74, 42, 1, 246, 37, 74, 42, 1, 246, 210, 74, 42, 1, 246, 67, + 74, 42, 1, 222, 74, 42, 1, 238, 226, 74, 42, 1, 238, 141, 74, 42, 1, 239, + 40, 74, 42, 1, 238, 175, 74, 42, 1, 216, 74, 42, 1, 227, 142, 74, 42, 1, + 227, 167, 74, 42, 1, 234, 236, 74, 42, 1, 234, 145, 74, 42, 1, 234, 43, + 74, 42, 1, 234, 203, 74, 42, 1, 234, 91, 74, 42, 1, 228, 143, 74, 42, 1, + 197, 74, 42, 228, 171, 231, 202, 69, 74, 42, 232, 181, 231, 202, 69, 74, + 23, 248, 63, 74, 23, 1, 240, 149, 74, 23, 1, 231, 157, 74, 23, 1, 240, + 147, 74, 23, 1, 237, 203, 74, 23, 1, 237, 202, 74, 23, 1, 237, 201, 74, + 23, 1, 230, 4, 74, 23, 1, 231, 152, 74, 23, 1, 234, 140, 74, 23, 1, 234, + 136, 74, 23, 1, 234, 134, 74, 23, 1, 234, 128, 74, 23, 1, 234, 125, 74, + 23, 1, 234, 123, 74, 23, 1, 234, 129, 74, 23, 1, 234, 139, 74, 23, 1, + 238, 218, 74, 23, 1, 235, 255, 74, 23, 1, 231, 155, 74, 23, 1, 235, 247, + 74, 23, 1, 232, 24, 74, 23, 1, 231, 153, 74, 23, 1, 241, 226, 74, 23, 1, + 252, 11, 74, 23, 1, 231, 160, 74, 23, 1, 252, 61, 74, 23, 1, 240, 177, + 74, 23, 1, 230, 55, 74, 23, 1, 236, 23, 74, 23, 1, 246, 164, 74, 23, 1, + 67, 74, 23, 1, 255, 75, 74, 23, 1, 216, 74, 23, 1, 227, 248, 74, 23, 1, + 248, 213, 74, 23, 1, 72, 74, 23, 1, 227, 204, 74, 23, 1, 227, 211, 74, + 23, 1, 73, 74, 23, 1, 228, 143, 74, 23, 1, 228, 140, 74, 23, 1, 236, 234, + 74, 23, 1, 227, 167, 74, 23, 1, 79, 74, 23, 1, 228, 106, 74, 23, 1, 228, + 112, 74, 23, 1, 228, 92, 74, 23, 1, 227, 142, 74, 23, 1, 248, 171, 74, + 23, 1, 227, 186, 74, 23, 1, 71, 89, 252, 109, 52, 89, 235, 182, 52, 89, + 161, 52, 89, 196, 89, 252, 226, 125, 89, 227, 205, 52, 89, 228, 78, 52, + 74, 248, 5, 136, 228, 201, 74, 139, 56, 74, 226, 226, 56, 74, 77, 56, 74, + 249, 86, 56, 74, 86, 231, 171, 74, 64, 252, 5, 241, 153, 254, 250, 255, + 6, 241, 153, 254, 250, 232, 166, 241, 153, 254, 250, 230, 108, 236, 243, + 234, 173, 252, 83, 234, 173, 252, 83, 44, 41, 4, 254, 114, 67, 44, 41, 4, + 254, 85, 72, 44, 41, 4, 254, 94, 71, 44, 41, 4, 254, 62, 73, 44, 41, 4, + 254, 112, 79, 44, 41, 4, 254, 121, 251, 102, 44, 41, 4, 254, 78, 251, 2, + 44, 41, 4, 254, 115, 250, 202, 44, 41, 4, 254, 108, 250, 116, 44, 41, 4, + 254, 72, 249, 70, 44, 41, 4, 254, 66, 241, 107, 44, 41, 4, 254, 77, 241, + 98, 44, 41, 4, 254, 87, 241, 48, 44, 41, 4, 254, 58, 241, 36, 44, 41, 4, + 254, 46, 201, 44, 41, 4, 254, 79, 240, 219, 44, 41, 4, 254, 56, 240, 168, + 44, 41, 4, 254, 53, 240, 127, 44, 41, 4, 254, 42, 240, 92, 44, 41, 4, + 254, 43, 222, 44, 41, 4, 254, 109, 239, 40, 44, 41, 4, 254, 50, 238, 226, + 44, 41, 4, 254, 107, 238, 175, 44, 41, 4, 254, 99, 238, 141, 44, 41, 4, + 254, 116, 238, 91, 44, 41, 4, 254, 98, 238, 9, 44, 41, 4, 254, 92, 237, + 209, 44, 41, 4, 254, 71, 237, 138, 44, 41, 4, 254, 68, 237, 83, 44, 41, + 4, 254, 119, 236, 142, 44, 41, 4, 254, 51, 236, 80, 44, 41, 4, 254, 84, + 236, 8, 44, 41, 4, 254, 111, 235, 207, 44, 41, 4, 254, 73, 235, 124, 44, + 41, 4, 254, 106, 235, 92, 44, 41, 4, 254, 45, 235, 73, 44, 41, 4, 254, + 101, 235, 58, 44, 41, 4, 254, 90, 235, 49, 44, 41, 4, 254, 63, 234, 236, + 44, 41, 4, 254, 95, 234, 203, 44, 41, 4, 254, 70, 234, 145, 44, 41, 4, + 254, 120, 234, 91, 44, 41, 4, 254, 96, 234, 43, 44, 41, 4, 254, 91, 234, + 8, 44, 41, 4, 254, 113, 233, 203, 44, 41, 4, 254, 82, 232, 51, 44, 41, 4, + 254, 110, 231, 216, 44, 41, 4, 254, 65, 231, 62, 44, 41, 4, 254, 64, 230, + 182, 44, 41, 4, 254, 118, 230, 131, 44, 41, 4, 254, 86, 230, 15, 44, 41, + 4, 254, 117, 87, 44, 41, 4, 254, 54, 229, 106, 44, 41, 4, 254, 69, 228, + 143, 44, 41, 4, 254, 48, 228, 112, 44, 41, 4, 254, 83, 228, 92, 44, 41, + 4, 254, 81, 228, 82, 44, 41, 4, 254, 105, 227, 102, 44, 41, 4, 254, 49, + 227, 86, 44, 41, 4, 254, 102, 227, 27, 44, 41, 4, 254, 97, 255, 106, 44, + 41, 4, 254, 80, 255, 105, 44, 41, 4, 254, 39, 254, 144, 44, 41, 4, 254, + 52, 249, 55, 44, 41, 4, 254, 35, 249, 54, 44, 41, 4, 254, 75, 237, 60, + 44, 41, 4, 254, 93, 235, 123, 44, 41, 4, 254, 61, 235, 126, 44, 41, 4, + 254, 47, 234, 235, 44, 41, 4, 254, 89, 234, 234, 44, 41, 4, 254, 55, 234, + 90, 44, 41, 4, 254, 57, 230, 181, 44, 41, 4, 254, 37, 229, 83, 44, 41, 4, + 254, 34, 111, 44, 41, 12, 254, 104, 44, 41, 12, 254, 103, 44, 41, 12, + 254, 100, 44, 41, 12, 254, 88, 44, 41, 12, 254, 76, 44, 41, 12, 254, 74, + 44, 41, 12, 254, 67, 44, 41, 12, 254, 60, 44, 41, 12, 254, 59, 44, 41, + 12, 254, 44, 44, 41, 12, 254, 41, 44, 41, 12, 254, 40, 44, 41, 12, 254, + 38, 44, 41, 12, 254, 36, 44, 41, 78, 254, 33, 239, 81, 44, 41, 78, 254, + 32, 228, 79, 44, 41, 78, 254, 31, 250, 246, 44, 41, 78, 254, 30, 248, + 199, 44, 41, 78, 254, 29, 239, 66, 44, 41, 78, 254, 28, 231, 118, 44, 41, + 78, 254, 27, 248, 161, 44, 41, 78, 254, 26, 234, 218, 44, 41, 78, 254, + 25, 232, 125, 44, 41, 78, 254, 24, 246, 209, 44, 41, 78, 254, 23, 231, + 197, 44, 41, 78, 254, 22, 253, 2, 44, 41, 78, 254, 21, 251, 162, 44, 41, + 78, 254, 20, 252, 212, 44, 41, 78, 254, 19, 228, 100, 44, 41, 78, 254, + 18, 253, 142, 44, 41, 78, 254, 17, 236, 219, 44, 41, 78, 254, 16, 231, + 185, 44, 41, 78, 254, 15, 251, 110, 44, 41, 238, 166, 254, 14, 240, 247, + 44, 41, 238, 166, 254, 13, 240, 252, 44, 41, 78, 254, 12, 236, 225, 44, + 41, 78, 254, 11, 228, 85, 44, 41, 78, 254, 10, 44, 41, 238, 166, 254, 9, + 254, 196, 44, 41, 238, 166, 254, 8, 239, 13, 44, 41, 78, 254, 7, 252, + 225, 44, 41, 78, 254, 6, 247, 67, 44, 41, 78, 254, 5, 44, 41, 78, 254, 4, + 228, 74, 44, 41, 78, 254, 3, 44, 41, 78, 254, 2, 44, 41, 78, 254, 1, 246, + 50, 44, 41, 78, 254, 0, 44, 41, 78, 253, 255, 44, 41, 78, 253, 254, 44, + 41, 238, 166, 253, 252, 229, 93, 44, 41, 78, 253, 251, 44, 41, 78, 253, + 250, 44, 41, 78, 253, 249, 251, 234, 44, 41, 78, 253, 248, 44, 41, 78, + 253, 247, 44, 41, 78, 253, 246, 247, 188, 44, 41, 78, 253, 245, 254, 185, + 44, 41, 78, 253, 244, 44, 41, 78, 253, 243, 44, 41, 78, 253, 242, 44, 41, + 78, 253, 241, 44, 41, 78, 253, 240, 44, 41, 78, 253, 239, 44, 41, 78, + 253, 238, 44, 41, 78, 253, 237, 44, 41, 78, 253, 236, 44, 41, 78, 253, + 235, 238, 162, 44, 41, 78, 253, 234, 44, 41, 78, 253, 233, 229, 189, 44, + 41, 78, 253, 232, 44, 41, 78, 253, 231, 44, 41, 78, 253, 230, 44, 41, 78, + 253, 229, 44, 41, 78, 253, 228, 44, 41, 78, 253, 227, 44, 41, 78, 253, + 226, 44, 41, 78, 253, 225, 44, 41, 78, 253, 224, 44, 41, 78, 253, 223, + 44, 41, 78, 253, 222, 44, 41, 78, 253, 221, 246, 191, 44, 41, 78, 253, + 200, 248, 14, 44, 41, 78, 253, 197, 253, 128, 44, 41, 78, 253, 192, 231, + 189, 44, 41, 78, 253, 191, 56, 44, 41, 78, 253, 190, 44, 41, 78, 253, + 189, 231, 2, 44, 41, 78, 253, 188, 44, 41, 78, 253, 187, 44, 41, 78, 253, + 186, 228, 96, 252, 81, 44, 41, 78, 253, 185, 252, 81, 44, 41, 78, 253, + 184, 252, 82, 247, 245, 44, 41, 78, 253, 183, 228, 98, 44, 41, 78, 253, + 182, 44, 41, 78, 253, 181, 44, 41, 238, 166, 253, 180, 250, 152, 44, 41, + 78, 253, 179, 44, 41, 78, 253, 178, 44, 41, 78, 253, 176, 44, 41, 78, + 253, 175, 44, 41, 78, 253, 174, 44, 41, 78, 253, 173, 251, 57, 44, 41, + 78, 253, 172, 44, 41, 78, 253, 171, 44, 41, 78, 253, 170, 44, 41, 78, + 253, 169, 44, 41, 78, 253, 168, 44, 41, 78, 228, 197, 253, 253, 44, 41, + 78, 228, 197, 253, 220, 44, 41, 78, 228, 197, 253, 219, 44, 41, 78, 228, + 197, 253, 218, 44, 41, 78, 228, 197, 253, 217, 44, 41, 78, 228, 197, 253, + 216, 44, 41, 78, 228, 197, 253, 215, 44, 41, 78, 228, 197, 253, 214, 44, + 41, 78, 228, 197, 253, 213, 44, 41, 78, 228, 197, 253, 212, 44, 41, 78, + 228, 197, 253, 211, 44, 41, 78, 228, 197, 253, 210, 44, 41, 78, 228, 197, + 253, 209, 44, 41, 78, 228, 197, 253, 208, 44, 41, 78, 228, 197, 253, 207, + 44, 41, 78, 228, 197, 253, 206, 44, 41, 78, 228, 197, 253, 205, 44, 41, + 78, 228, 197, 253, 204, 44, 41, 78, 228, 197, 253, 203, 44, 41, 78, 228, + 197, 253, 202, 44, 41, 78, 228, 197, 253, 201, 44, 41, 78, 228, 197, 253, + 199, 44, 41, 78, 228, 197, 253, 198, 44, 41, 78, 228, 197, 253, 196, 44, + 41, 78, 228, 197, 253, 195, 44, 41, 78, 228, 197, 253, 194, 44, 41, 78, + 228, 197, 253, 193, 44, 41, 78, 228, 197, 253, 177, 44, 41, 78, 228, 197, + 253, 167, 167, 228, 72, 232, 167, 239, 193, 167, 228, 72, 232, 167, 250, + 100, 167, 252, 74, 69, 167, 61, 127, 167, 61, 111, 167, 61, 166, 167, 61, + 177, 167, 61, 176, 167, 61, 187, 167, 61, 203, 167, 61, 195, 167, 61, + 202, 167, 61, 230, 112, 167, 61, 229, 79, 167, 61, 230, 44, 167, 61, 248, + 2, 167, 61, 248, 74, 167, 61, 231, 251, 167, 61, 232, 154, 167, 61, 249, + 3, 167, 61, 237, 184, 167, 61, 236, 210, 246, 31, 167, 61, 171, 246, 31, + 167, 61, 204, 246, 31, 167, 61, 248, 0, 246, 31, 167, 61, 248, 48, 246, + 31, 167, 61, 232, 5, 246, 31, 167, 61, 232, 158, 246, 31, 167, 61, 249, + 11, 246, 31, 167, 61, 237, 188, 246, 31, 167, 61, 236, 210, 230, 32, 167, + 61, 171, 230, 32, 167, 61, 204, 230, 32, 167, 61, 248, 0, 230, 32, 167, + 61, 248, 48, 230, 32, 167, 61, 232, 5, 230, 32, 167, 61, 232, 158, 230, + 32, 167, 61, 249, 11, 230, 32, 167, 61, 237, 188, 230, 32, 167, 61, 230, + 113, 230, 32, 167, 61, 229, 80, 230, 32, 167, 61, 230, 45, 230, 32, 167, + 61, 248, 3, 230, 32, 167, 61, 248, 75, 230, 32, 167, 61, 231, 252, 230, + 32, 167, 61, 232, 155, 230, 32, 167, 61, 249, 4, 230, 32, 167, 61, 237, + 185, 230, 32, 167, 228, 108, 253, 134, 229, 9, 167, 228, 108, 248, 56, + 231, 48, 167, 228, 108, 233, 199, 231, 48, 167, 228, 108, 230, 51, 231, + 48, 167, 228, 108, 247, 250, 231, 48, 167, 249, 72, 239, 39, 248, 56, + 231, 48, 167, 239, 183, 239, 39, 248, 56, 231, 48, 167, 239, 39, 233, + 199, 231, 48, 167, 239, 39, 230, 51, 231, 48, 17, 180, 254, 146, 236, + 210, 235, 30, 17, 180, 254, 146, 236, 210, 246, 236, 17, 180, 254, 146, + 236, 210, 249, 82, 17, 180, 254, 146, 176, 17, 180, 254, 146, 248, 74, + 17, 180, 254, 146, 248, 48, 246, 31, 17, 180, 254, 146, 248, 48, 230, 32, + 17, 180, 254, 146, 248, 75, 230, 32, 17, 180, 254, 146, 248, 48, 230, + 161, 17, 180, 254, 146, 230, 113, 230, 161, 17, 180, 254, 146, 248, 75, + 230, 161, 17, 180, 254, 146, 236, 210, 246, 32, 230, 161, 17, 180, 254, + 146, 248, 48, 246, 32, 230, 161, 17, 180, 254, 146, 236, 210, 230, 33, + 230, 161, 17, 180, 254, 146, 248, 48, 230, 33, 230, 161, 17, 180, 254, + 146, 248, 48, 231, 109, 17, 180, 254, 146, 230, 113, 231, 109, 17, 180, + 254, 146, 248, 75, 231, 109, 17, 180, 254, 146, 236, 210, 246, 32, 231, + 109, 17, 180, 254, 146, 248, 48, 246, 32, 231, 109, 17, 180, 254, 146, + 236, 210, 230, 33, 231, 109, 17, 180, 254, 146, 230, 113, 230, 33, 231, + 109, 17, 180, 254, 146, 248, 75, 230, 33, 231, 109, 17, 180, 254, 146, + 230, 113, 238, 178, 17, 180, 246, 187, 236, 210, 235, 216, 17, 180, 230, + 62, 127, 17, 180, 246, 185, 127, 17, 180, 248, 206, 111, 17, 180, 230, + 62, 111, 17, 180, 251, 108, 171, 249, 81, 17, 180, 248, 206, 171, 249, + 81, 17, 180, 229, 163, 176, 17, 180, 229, 163, 230, 112, 17, 180, 229, + 163, 230, 113, 255, 19, 13, 17, 180, 246, 185, 230, 112, 17, 180, 239, 7, + 230, 112, 17, 180, 230, 62, 230, 112, 17, 180, 230, 62, 230, 44, 17, 180, + 229, 163, 248, 74, 17, 180, 229, 163, 248, 75, 255, 19, 13, 17, 180, 246, + 185, 248, 74, 17, 180, 230, 62, 248, 74, 17, 180, 230, 62, 236, 210, 246, + 31, 17, 180, 230, 62, 204, 246, 31, 17, 180, 248, 206, 248, 48, 246, 31, + 17, 180, 229, 163, 248, 48, 246, 31, 17, 180, 230, 62, 248, 48, 246, 31, + 17, 180, 252, 145, 248, 48, 246, 31, 17, 180, 238, 61, 248, 48, 246, 31, + 17, 180, 230, 62, 236, 210, 230, 32, 17, 180, 230, 62, 248, 48, 230, 32, + 17, 180, 250, 231, 248, 48, 238, 178, 17, 180, 231, 86, 248, 75, 238, + 178, 17, 236, 210, 137, 52, 17, 236, 210, 137, 21, 255, 19, 13, 17, 171, + 230, 49, 52, 17, 204, 235, 29, 52, 17, 227, 209, 52, 17, 230, 162, 52, + 17, 249, 83, 52, 17, 236, 240, 52, 17, 171, 236, 239, 52, 17, 204, 236, + 239, 52, 17, 248, 0, 236, 239, 52, 17, 248, 48, 236, 239, 52, 17, 239, 2, + 52, 17, 240, 52, 253, 134, 52, 17, 239, 180, 52, 17, 236, 165, 52, 17, + 228, 48, 52, 17, 254, 170, 52, 17, 254, 181, 52, 17, 247, 50, 52, 17, + 229, 151, 253, 134, 52, 17, 227, 81, 52, 76, 24, 1, 67, 76, 24, 1, 253, + 91, 76, 24, 1, 240, 219, 76, 24, 1, 251, 2, 76, 24, 1, 72, 76, 24, 1, + 228, 212, 76, 24, 1, 227, 86, 76, 24, 1, 246, 210, 76, 24, 1, 230, 76, + 76, 24, 1, 71, 76, 24, 1, 201, 76, 24, 1, 248, 250, 76, 24, 1, 248, 241, + 76, 24, 1, 248, 234, 76, 24, 1, 248, 184, 76, 24, 1, 73, 76, 24, 1, 236, + 80, 76, 24, 1, 232, 126, 76, 24, 1, 240, 92, 76, 24, 1, 248, 196, 76, 24, + 1, 248, 188, 76, 24, 1, 230, 131, 76, 24, 1, 79, 76, 24, 1, 248, 253, 76, + 24, 1, 236, 28, 76, 24, 1, 240, 184, 76, 24, 1, 249, 18, 76, 24, 1, 248, + 190, 76, 24, 1, 252, 75, 76, 24, 1, 241, 209, 76, 24, 1, 228, 238, 76, + 24, 178, 127, 76, 24, 178, 176, 76, 24, 178, 230, 112, 76, 24, 178, 248, + 74, 247, 58, 1, 255, 58, 247, 58, 1, 253, 153, 247, 58, 1, 247, 95, 247, + 58, 1, 251, 90, 247, 58, 1, 255, 54, 247, 58, 1, 235, 83, 247, 58, 1, + 241, 117, 247, 58, 1, 246, 244, 247, 58, 1, 230, 40, 247, 58, 1, 249, 2, + 247, 58, 1, 240, 81, 247, 58, 1, 240, 29, 247, 58, 1, 239, 78, 247, 58, + 1, 238, 63, 247, 58, 1, 241, 93, 247, 58, 1, 228, 242, 247, 58, 1, 236, + 132, 247, 58, 1, 237, 184, 247, 58, 1, 234, 224, 247, 58, 1, 233, 227, + 247, 58, 1, 230, 120, 247, 58, 1, 228, 84, 247, 58, 1, 248, 125, 247, 58, + 1, 241, 210, 247, 58, 1, 246, 22, 247, 58, 1, 236, 171, 247, 58, 1, 237, + 188, 246, 31, 229, 29, 1, 255, 23, 229, 29, 1, 253, 53, 229, 29, 1, 247, + 196, 229, 29, 1, 240, 194, 229, 29, 1, 250, 229, 229, 29, 1, 246, 67, + 229, 29, 1, 228, 82, 229, 29, 1, 227, 79, 229, 29, 1, 246, 46, 229, 29, + 1, 230, 102, 229, 29, 1, 227, 159, 229, 29, 1, 241, 5, 229, 29, 1, 232, + 102, 229, 29, 1, 240, 23, 229, 29, 1, 239, 20, 229, 29, 1, 250, 206, 229, + 29, 1, 237, 74, 229, 29, 1, 227, 19, 229, 29, 1, 233, 241, 229, 29, 1, + 255, 51, 229, 29, 1, 235, 124, 229, 29, 1, 234, 0, 229, 29, 1, 235, 42, + 229, 29, 1, 234, 213, 229, 29, 1, 230, 79, 229, 29, 1, 247, 112, 229, 29, + 1, 87, 229, 29, 1, 71, 229, 29, 1, 79, 229, 29, 1, 231, 133, 229, 29, + 228, 72, 250, 136, 76, 184, 21, 67, 76, 184, 21, 71, 76, 184, 21, 79, 76, + 184, 21, 201, 76, 184, 21, 240, 92, 76, 184, 21, 247, 208, 76, 184, 21, + 247, 32, 76, 184, 21, 228, 54, 76, 184, 21, 252, 176, 76, 184, 21, 241, + 107, 76, 184, 21, 241, 86, 76, 184, 21, 230, 182, 76, 184, 21, 229, 106, + 76, 184, 21, 251, 102, 76, 184, 21, 250, 202, 76, 184, 21, 249, 70, 76, + 184, 21, 230, 87, 76, 184, 21, 236, 142, 76, 184, 21, 253, 166, 76, 184, + 21, 248, 139, 76, 184, 21, 238, 91, 76, 184, 21, 237, 83, 76, 184, 21, + 222, 76, 184, 21, 238, 226, 76, 184, 21, 238, 141, 76, 184, 21, 216, 76, + 184, 21, 228, 233, 76, 184, 21, 228, 193, 76, 184, 21, 234, 236, 76, 184, + 21, 234, 43, 76, 184, 21, 240, 41, 76, 184, 21, 234, 8, 76, 184, 21, 227, + 102, 76, 184, 21, 232, 147, 76, 184, 21, 231, 163, 76, 184, 21, 219, 76, + 184, 21, 254, 139, 76, 184, 21, 254, 138, 76, 184, 21, 254, 137, 76, 184, + 21, 228, 31, 76, 184, 21, 251, 87, 76, 184, 21, 251, 86, 76, 184, 21, + 253, 156, 76, 184, 21, 252, 196, 76, 184, 228, 72, 250, 136, 76, 184, 61, + 127, 76, 184, 61, 111, 76, 184, 61, 230, 112, 76, 184, 61, 229, 79, 76, + 184, 61, 246, 31, 121, 5, 1, 183, 71, 121, 5, 1, 183, 72, 121, 5, 1, 183, + 67, 121, 5, 1, 183, 255, 60, 121, 5, 1, 183, 73, 121, 5, 1, 183, 236, + 202, 121, 5, 1, 232, 93, 71, 121, 5, 1, 232, 93, 72, 121, 5, 1, 232, 93, + 67, 121, 5, 1, 232, 93, 255, 60, 121, 5, 1, 232, 93, 73, 121, 5, 1, 232, + 93, 236, 202, 121, 5, 1, 254, 128, 121, 5, 1, 236, 152, 121, 5, 1, 228, + 63, 121, 5, 1, 227, 208, 121, 5, 1, 192, 121, 5, 1, 236, 74, 121, 5, 1, + 253, 85, 121, 5, 1, 230, 125, 121, 5, 1, 250, 248, 121, 5, 1, 252, 72, + 121, 5, 1, 241, 97, 121, 5, 1, 240, 224, 121, 5, 1, 247, 180, 121, 5, 1, + 249, 18, 121, 5, 1, 228, 208, 121, 5, 1, 248, 174, 121, 5, 1, 230, 75, + 121, 5, 1, 248, 188, 121, 5, 1, 227, 85, 121, 5, 1, 248, 184, 121, 5, 1, + 227, 67, 121, 5, 1, 248, 196, 121, 5, 1, 248, 250, 121, 5, 1, 248, 241, + 121, 5, 1, 248, 234, 121, 5, 1, 248, 224, 121, 5, 1, 236, 226, 121, 5, 1, + 248, 162, 121, 3, 1, 183, 71, 121, 3, 1, 183, 72, 121, 3, 1, 183, 67, + 121, 3, 1, 183, 255, 60, 121, 3, 1, 183, 73, 121, 3, 1, 183, 236, 202, + 121, 3, 1, 232, 93, 71, 121, 3, 1, 232, 93, 72, 121, 3, 1, 232, 93, 67, + 121, 3, 1, 232, 93, 255, 60, 121, 3, 1, 232, 93, 73, 121, 3, 1, 232, 93, + 236, 202, 121, 3, 1, 254, 128, 121, 3, 1, 236, 152, 121, 3, 1, 228, 63, + 121, 3, 1, 227, 208, 121, 3, 1, 192, 121, 3, 1, 236, 74, 121, 3, 1, 253, + 85, 121, 3, 1, 230, 125, 121, 3, 1, 250, 248, 121, 3, 1, 252, 72, 121, 3, + 1, 241, 97, 121, 3, 1, 240, 224, 121, 3, 1, 247, 180, 121, 3, 1, 249, 18, + 121, 3, 1, 228, 208, 121, 3, 1, 248, 174, 121, 3, 1, 230, 75, 121, 3, 1, + 248, 188, 121, 3, 1, 227, 85, 121, 3, 1, 248, 184, 121, 3, 1, 227, 67, + 121, 3, 1, 248, 196, 121, 3, 1, 248, 250, 121, 3, 1, 248, 241, 121, 3, 1, + 248, 234, 121, 3, 1, 248, 224, 121, 3, 1, 236, 226, 121, 3, 1, 248, 162, + 207, 1, 236, 73, 207, 1, 229, 201, 207, 1, 240, 167, 207, 1, 248, 102, + 207, 1, 230, 54, 207, 1, 231, 216, 207, 1, 231, 22, 207, 1, 252, 26, 207, + 1, 227, 210, 207, 1, 246, 30, 207, 1, 253, 42, 207, 1, 251, 1, 207, 1, + 247, 201, 207, 1, 228, 163, 207, 1, 230, 58, 207, 1, 227, 25, 207, 1, + 239, 38, 207, 1, 241, 34, 207, 1, 228, 80, 207, 1, 246, 251, 207, 1, 239, + 159, 207, 1, 238, 196, 207, 1, 241, 212, 207, 1, 249, 17, 207, 1, 254, + 164, 207, 1, 255, 78, 207, 1, 236, 211, 207, 1, 228, 74, 207, 1, 236, + 164, 207, 1, 255, 60, 207, 1, 234, 88, 207, 1, 237, 74, 207, 1, 249, 27, + 207, 1, 255, 63, 207, 1, 245, 225, 207, 1, 229, 0, 207, 1, 236, 247, 207, + 1, 236, 197, 207, 1, 236, 225, 207, 1, 254, 131, 207, 1, 254, 197, 207, + 1, 236, 183, 207, 1, 255, 48, 207, 1, 248, 192, 207, 1, 254, 178, 207, 1, + 249, 34, 207, 1, 245, 228, 207, 1, 227, 191, 236, 173, 1, 255, 38, 236, + 173, 1, 253, 166, 236, 173, 1, 230, 182, 236, 173, 1, 241, 107, 236, 173, + 1, 228, 54, 236, 173, 1, 240, 194, 236, 173, 1, 250, 247, 236, 173, 1, + 234, 236, 236, 173, 1, 234, 8, 236, 173, 1, 232, 106, 236, 173, 1, 250, + 208, 236, 173, 1, 252, 136, 236, 173, 1, 247, 208, 236, 173, 1, 248, 139, + 236, 173, 1, 235, 90, 236, 173, 1, 241, 9, 236, 173, 1, 240, 37, 236, + 173, 1, 238, 206, 236, 173, 1, 237, 64, 236, 173, 1, 228, 115, 236, 173, + 1, 219, 236, 173, 1, 216, 236, 173, 1, 67, 236, 173, 1, 72, 236, 173, 1, + 71, 236, 173, 1, 73, 236, 173, 1, 79, 236, 173, 1, 255, 104, 236, 173, 1, + 249, 22, 236, 173, 1, 236, 202, 236, 173, 26, 227, 80, 236, 173, 26, 127, + 236, 173, 26, 111, 236, 173, 26, 166, 236, 173, 26, 177, 236, 173, 26, + 176, 236, 173, 26, 187, 236, 173, 26, 203, 236, 173, 26, 195, 236, 173, + 26, 202, 172, 4, 67, 172, 4, 72, 172, 4, 71, 172, 4, 73, 172, 4, 79, 172, + 4, 241, 107, 172, 4, 241, 48, 172, 4, 201, 172, 4, 240, 219, 172, 4, 240, + 168, 172, 4, 240, 127, 172, 4, 240, 92, 172, 4, 240, 41, 172, 4, 239, + 254, 172, 4, 239, 209, 172, 4, 239, 167, 172, 4, 239, 135, 172, 4, 222, + 172, 4, 239, 40, 172, 4, 238, 226, 172, 4, 238, 175, 172, 4, 238, 141, + 172, 4, 238, 91, 172, 4, 238, 9, 172, 4, 237, 209, 172, 4, 237, 138, 172, + 4, 237, 83, 172, 4, 236, 142, 172, 4, 236, 80, 172, 4, 236, 8, 172, 4, + 235, 207, 172, 4, 235, 124, 172, 4, 234, 236, 172, 4, 234, 203, 172, 4, + 234, 145, 172, 4, 234, 91, 172, 4, 234, 43, 172, 4, 234, 8, 172, 4, 233, + 203, 172, 4, 232, 51, 172, 4, 231, 216, 172, 4, 231, 62, 172, 4, 230, + 182, 172, 4, 230, 131, 172, 4, 230, 15, 172, 4, 87, 172, 4, 229, 106, + 172, 4, 228, 143, 172, 4, 228, 112, 172, 4, 228, 92, 172, 4, 228, 82, + 172, 4, 228, 54, 172, 4, 228, 51, 172, 4, 227, 102, 172, 4, 227, 27, 151, + 1, 67, 151, 33, 21, 71, 151, 33, 21, 79, 151, 33, 21, 165, 144, 151, 33, + 21, 72, 151, 33, 21, 73, 151, 33, 239, 233, 69, 151, 21, 45, 234, 108, + 46, 151, 21, 254, 236, 151, 21, 228, 177, 151, 1, 201, 151, 1, 240, 194, + 151, 1, 247, 208, 151, 1, 247, 115, 151, 1, 252, 176, 151, 1, 252, 96, + 151, 1, 241, 107, 151, 1, 237, 57, 151, 1, 229, 130, 151, 1, 229, 120, + 151, 1, 251, 41, 151, 1, 251, 26, 151, 1, 237, 150, 151, 1, 230, 182, + 151, 1, 230, 87, 151, 1, 251, 102, 151, 1, 250, 208, 151, 1, 238, 91, + 151, 1, 236, 142, 151, 1, 236, 33, 151, 1, 253, 166, 151, 1, 253, 46, + 151, 1, 222, 151, 1, 216, 151, 1, 234, 236, 151, 1, 240, 41, 151, 1, 228, + 233, 151, 1, 232, 147, 151, 1, 231, 163, 151, 1, 234, 8, 151, 1, 227, + 102, 151, 1, 219, 151, 1, 240, 143, 151, 1, 229, 108, 151, 21, 253, 144, + 48, 151, 21, 252, 142, 151, 21, 53, 46, 151, 228, 182, 151, 26, 127, 151, + 26, 111, 151, 26, 166, 151, 26, 177, 151, 61, 230, 112, 151, 61, 229, 79, + 151, 61, 236, 210, 246, 31, 151, 61, 236, 210, 230, 32, 151, 235, 122, + 250, 100, 151, 235, 122, 3, 252, 5, 151, 235, 122, 252, 5, 151, 235, 122, + 251, 157, 125, 151, 235, 122, 239, 79, 151, 235, 122, 239, 143, 151, 235, + 122, 251, 70, 151, 235, 122, 45, 251, 70, 151, 235, 122, 239, 188, 37, + 20, 12, 235, 128, 37, 20, 12, 251, 56, 37, 20, 12, 236, 50, 37, 20, 12, + 236, 150, 248, 254, 37, 20, 12, 236, 150, 250, 155, 37, 20, 12, 228, 227, + 248, 254, 37, 20, 12, 228, 227, 250, 155, 37, 20, 12, 240, 229, 37, 20, + 12, 230, 196, 37, 20, 12, 236, 112, 37, 20, 12, 227, 147, 37, 20, 12, + 227, 148, 250, 155, 37, 20, 12, 240, 97, 37, 20, 12, 254, 231, 248, 254, + 37, 20, 12, 248, 152, 248, 254, 37, 20, 12, 230, 119, 37, 20, 12, 240, + 205, 37, 20, 12, 254, 223, 37, 20, 12, 254, 224, 250, 155, 37, 20, 12, + 230, 201, 37, 20, 12, 230, 41, 37, 20, 12, 236, 220, 254, 198, 37, 20, + 12, 247, 64, 254, 198, 37, 20, 12, 235, 127, 37, 20, 12, 252, 90, 37, 20, + 12, 228, 218, 37, 20, 12, 241, 125, 254, 198, 37, 20, 12, 240, 207, 254, + 198, 37, 20, 12, 240, 206, 254, 198, 37, 20, 12, 233, 225, 37, 20, 12, + 236, 104, 37, 20, 12, 231, 107, 254, 226, 37, 20, 12, 236, 149, 254, 198, + 37, 20, 12, 228, 226, 254, 198, 37, 20, 12, 254, 227, 254, 198, 37, 20, + 12, 254, 221, 37, 20, 12, 240, 135, 37, 20, 12, 234, 155, 37, 20, 12, + 236, 6, 254, 198, 37, 20, 12, 229, 252, 37, 20, 12, 255, 7, 37, 20, 12, + 233, 184, 37, 20, 12, 230, 204, 254, 198, 37, 20, 12, 230, 204, 239, 6, + 231, 105, 37, 20, 12, 236, 145, 254, 198, 37, 20, 12, 230, 71, 37, 20, + 12, 239, 234, 37, 20, 12, 249, 50, 37, 20, 12, 229, 184, 37, 20, 12, 230, + 104, 37, 20, 12, 240, 100, 37, 20, 12, 254, 231, 248, 152, 237, 255, 37, + 20, 12, 247, 233, 254, 198, 37, 20, 12, 241, 199, 37, 20, 12, 229, 160, + 254, 198, 37, 20, 12, 240, 231, 229, 159, 37, 20, 12, 236, 65, 37, 20, + 12, 235, 131, 37, 20, 12, 240, 117, 37, 20, 12, 252, 42, 254, 198, 37, + 20, 12, 234, 214, 37, 20, 12, 236, 115, 254, 198, 37, 20, 12, 236, 113, + 254, 198, 37, 20, 12, 245, 223, 37, 20, 12, 238, 77, 37, 20, 12, 236, 38, + 37, 20, 12, 240, 118, 255, 25, 37, 20, 12, 229, 160, 255, 25, 37, 20, 12, + 231, 89, 37, 20, 12, 247, 39, 37, 20, 12, 241, 125, 237, 255, 37, 20, 12, + 236, 220, 237, 255, 37, 20, 12, 236, 150, 237, 255, 37, 20, 12, 236, 37, + 37, 20, 12, 240, 105, 37, 20, 12, 236, 36, 37, 20, 12, 240, 99, 37, 20, + 12, 236, 66, 237, 255, 37, 20, 12, 240, 206, 238, 0, 254, 247, 37, 20, + 12, 240, 207, 238, 0, 254, 247, 37, 20, 12, 227, 145, 37, 20, 12, 254, + 224, 237, 255, 37, 20, 12, 254, 225, 230, 202, 237, 255, 37, 20, 12, 227, + 146, 37, 20, 12, 240, 98, 37, 20, 12, 248, 249, 37, 20, 12, 252, 91, 37, + 20, 12, 238, 204, 241, 124, 37, 20, 12, 228, 227, 237, 255, 37, 20, 12, + 236, 6, 237, 255, 37, 20, 12, 235, 132, 237, 255, 37, 20, 12, 236, 217, + 37, 20, 12, 254, 240, 37, 20, 12, 239, 113, 37, 20, 12, 236, 113, 237, + 255, 37, 20, 12, 236, 115, 237, 255, 37, 20, 12, 248, 175, 236, 114, 37, + 20, 12, 240, 48, 37, 20, 12, 254, 241, 37, 20, 12, 229, 160, 237, 255, + 37, 20, 12, 248, 252, 37, 20, 12, 230, 204, 237, 255, 37, 20, 12, 230, + 197, 37, 20, 12, 252, 42, 237, 255, 37, 20, 12, 248, 207, 37, 20, 12, + 233, 185, 237, 255, 37, 20, 12, 228, 40, 240, 135, 37, 20, 12, 229, 157, + 37, 20, 12, 235, 133, 37, 20, 12, 229, 161, 37, 20, 12, 229, 158, 37, 20, + 12, 235, 130, 37, 20, 12, 229, 156, 37, 20, 12, 235, 129, 37, 20, 12, + 247, 63, 37, 20, 12, 254, 193, 37, 20, 12, 248, 175, 254, 193, 37, 20, + 12, 236, 145, 237, 255, 37, 20, 12, 230, 70, 248, 183, 37, 20, 12, 230, + 70, 248, 151, 37, 20, 12, 230, 72, 254, 228, 37, 20, 12, 230, 65, 241, 3, + 254, 220, 37, 20, 12, 240, 230, 37, 20, 12, 248, 225, 37, 20, 12, 227, + 189, 240, 228, 37, 20, 12, 227, 189, 254, 247, 37, 20, 12, 231, 106, 37, + 20, 12, 240, 136, 254, 247, 37, 20, 12, 250, 156, 254, 198, 37, 20, 12, + 240, 101, 254, 198, 37, 20, 12, 240, 101, 255, 25, 37, 20, 12, 240, 101, + 237, 255, 37, 20, 12, 254, 227, 237, 255, 37, 20, 12, 254, 229, 37, 20, + 12, 250, 155, 37, 20, 12, 229, 169, 37, 20, 12, 230, 96, 37, 20, 12, 240, + 109, 37, 20, 12, 239, 237, 248, 221, 252, 35, 37, 20, 12, 239, 237, 249, + 51, 252, 36, 37, 20, 12, 239, 237, 229, 171, 252, 36, 37, 20, 12, 239, + 237, 230, 106, 252, 36, 37, 20, 12, 239, 237, 241, 197, 252, 35, 37, 20, + 12, 247, 64, 238, 0, 254, 247, 37, 20, 12, 247, 64, 236, 105, 254, 189, + 37, 20, 12, 247, 64, 236, 105, 250, 212, 37, 20, 12, 250, 171, 37, 20, + 12, 250, 172, 236, 105, 254, 190, 240, 228, 37, 20, 12, 250, 172, 236, + 105, 254, 190, 254, 247, 37, 20, 12, 250, 172, 236, 105, 250, 212, 37, + 20, 12, 229, 175, 37, 20, 12, 254, 194, 37, 20, 12, 241, 201, 37, 20, 12, + 250, 191, 37, 20, 12, 255, 61, 235, 194, 254, 195, 37, 20, 12, 255, 61, + 254, 192, 37, 20, 12, 255, 61, 254, 195, 37, 20, 12, 255, 61, 239, 1, 37, + 20, 12, 255, 61, 239, 9, 37, 20, 12, 255, 61, 247, 65, 37, 20, 12, 255, + 61, 247, 62, 37, 20, 12, 255, 61, 235, 194, 247, 65, 37, 20, 12, 239, 58, + 235, 138, 245, 221, 37, 20, 12, 239, 58, 255, 27, 235, 138, 245, 221, 37, + 20, 12, 239, 58, 250, 211, 245, 221, 37, 20, 12, 239, 58, 255, 27, 250, + 211, 245, 221, 37, 20, 12, 239, 58, 229, 164, 245, 221, 37, 20, 12, 239, + 58, 229, 176, 37, 20, 12, 239, 58, 230, 100, 245, 221, 37, 20, 12, 239, + 58, 230, 100, 239, 240, 245, 221, 37, 20, 12, 239, 58, 239, 240, 245, + 221, 37, 20, 12, 239, 58, 235, 219, 245, 221, 37, 20, 12, 241, 127, 230, + 115, 245, 222, 37, 20, 12, 254, 225, 230, 115, 245, 222, 37, 20, 12, 248, + 120, 230, 97, 37, 20, 12, 248, 120, 238, 167, 37, 20, 12, 248, 120, 250, + 176, 37, 20, 12, 239, 58, 228, 222, 245, 221, 37, 20, 12, 239, 58, 235, + 137, 245, 221, 37, 20, 12, 239, 58, 235, 219, 230, 100, 245, 221, 37, 20, + 12, 247, 60, 238, 94, 254, 228, 37, 20, 12, 247, 60, 238, 94, 250, 154, + 37, 20, 12, 248, 232, 241, 3, 247, 233, 228, 164, 37, 20, 12, 241, 200, + 37, 20, 12, 241, 198, 37, 20, 12, 247, 233, 254, 199, 250, 210, 245, 220, + 37, 20, 12, 247, 233, 250, 189, 236, 142, 37, 20, 12, 247, 233, 250, 189, + 238, 77, 37, 20, 12, 247, 233, 238, 73, 245, 221, 37, 20, 12, 247, 233, + 250, 189, 250, 202, 37, 20, 12, 247, 233, 231, 245, 250, 188, 250, 202, + 37, 20, 12, 247, 233, 250, 189, 240, 219, 37, 20, 12, 247, 233, 250, 189, + 227, 27, 37, 20, 12, 247, 233, 250, 189, 237, 210, 240, 228, 37, 20, 12, + 247, 233, 250, 189, 237, 210, 254, 247, 37, 20, 12, 247, 233, 239, 86, + 252, 37, 250, 176, 37, 20, 12, 247, 233, 239, 86, 252, 37, 238, 167, 37, + 20, 12, 248, 82, 231, 245, 252, 37, 228, 221, 37, 20, 12, 247, 233, 231, + 245, 252, 37, 230, 205, 37, 20, 12, 247, 233, 238, 1, 37, 20, 12, 252, + 38, 227, 7, 37, 20, 12, 252, 38, 240, 134, 37, 20, 12, 252, 38, 231, 190, + 37, 20, 12, 247, 233, 220, 227, 188, 230, 101, 37, 20, 12, 247, 233, 248, + 233, 254, 242, 37, 20, 12, 227, 188, 229, 165, 37, 20, 12, 250, 184, 229, + 165, 37, 20, 12, 250, 184, 230, 101, 37, 20, 12, 250, 184, 254, 230, 249, + 51, 250, 111, 37, 20, 12, 250, 184, 238, 165, 230, 105, 250, 111, 37, 20, + 12, 250, 184, 250, 168, 248, 160, 250, 111, 37, 20, 12, 250, 184, 229, + 173, 236, 223, 250, 111, 37, 20, 12, 227, 188, 254, 230, 249, 51, 250, + 111, 37, 20, 12, 227, 188, 238, 165, 230, 105, 250, 111, 37, 20, 12, 227, + 188, 250, 168, 248, 160, 250, 111, 37, 20, 12, 227, 188, 229, 173, 236, + 223, 250, 111, 37, 20, 12, 247, 165, 250, 183, 37, 20, 12, 247, 165, 227, + 187, 37, 20, 12, 250, 190, 254, 230, 238, 205, 37, 20, 12, 250, 190, 254, + 230, 239, 25, 37, 20, 12, 250, 190, 250, 155, 37, 20, 12, 250, 190, 230, + 63, 37, 20, 12, 232, 36, 230, 63, 37, 20, 12, 232, 36, 230, 64, 250, 146, + 37, 20, 12, 232, 36, 230, 64, 229, 166, 37, 20, 12, 232, 36, 230, 64, + 230, 94, 37, 20, 12, 232, 36, 254, 171, 37, 20, 12, 232, 36, 254, 172, + 250, 146, 37, 20, 12, 232, 36, 254, 172, 229, 166, 37, 20, 12, 232, 36, + 254, 172, 230, 94, 37, 20, 12, 250, 169, 247, 151, 37, 20, 12, 250, 175, + 236, 167, 37, 20, 12, 231, 100, 37, 20, 12, 254, 188, 236, 142, 37, 20, + 12, 254, 188, 228, 164, 37, 20, 12, 254, 188, 247, 208, 37, 20, 12, 254, + 188, 250, 202, 37, 20, 12, 254, 188, 240, 219, 37, 20, 12, 254, 188, 227, + 27, 37, 20, 12, 254, 188, 237, 209, 37, 20, 12, 240, 206, 238, 0, 239, 8, + 37, 20, 12, 240, 207, 238, 0, 239, 8, 37, 20, 12, 240, 206, 238, 0, 240, + 228, 37, 20, 12, 240, 207, 238, 0, 240, 228, 37, 20, 12, 240, 136, 240, + 228, 37, 20, 12, 247, 64, 238, 0, 240, 228, 20, 12, 232, 29, 253, 141, + 20, 12, 45, 253, 141, 20, 12, 30, 253, 141, 20, 12, 234, 158, 30, 253, + 141, 20, 12, 251, 53, 253, 141, 20, 12, 232, 93, 253, 141, 20, 12, 40, + 234, 176, 52, 20, 12, 38, 234, 176, 52, 20, 12, 234, 176, 250, 98, 20, + 12, 251, 84, 233, 188, 20, 12, 251, 103, 252, 154, 20, 12, 233, 188, 20, + 12, 251, 224, 20, 12, 234, 174, 248, 71, 20, 12, 234, 174, 248, 70, 20, + 12, 234, 174, 248, 69, 20, 12, 248, 87, 20, 12, 248, 88, 46, 20, 12, 252, + 233, 69, 20, 12, 252, 171, 20, 12, 252, 240, 20, 12, 104, 20, 12, 236, + 209, 231, 119, 20, 12, 229, 65, 231, 119, 20, 12, 230, 28, 231, 119, 20, + 12, 247, 255, 231, 119, 20, 12, 248, 47, 231, 119, 20, 12, 232, 4, 231, + 119, 20, 12, 232, 2, 247, 241, 20, 12, 247, 253, 247, 241, 20, 12, 247, + 209, 251, 249, 20, 12, 247, 209, 251, 250, 236, 169, 255, 20, 20, 12, + 247, 209, 251, 250, 236, 169, 253, 131, 20, 12, 252, 179, 251, 249, 20, + 12, 248, 141, 251, 249, 20, 12, 248, 141, 251, 250, 236, 169, 255, 20, + 20, 12, 248, 141, 251, 250, 236, 169, 253, 131, 20, 12, 249, 74, 251, + 248, 20, 12, 249, 74, 251, 247, 20, 12, 45, 232, 131, 20, 12, 45, 248, + 36, 20, 12, 248, 37, 229, 0, 20, 12, 248, 37, 249, 88, 20, 12, 238, 66, + 229, 0, 20, 12, 238, 66, 249, 88, 20, 12, 232, 132, 229, 0, 20, 12, 232, + 132, 249, 88, 20, 12, 235, 31, 188, 232, 131, 20, 12, 235, 31, 188, 248, + 36, 20, 12, 251, 212, 229, 255, 20, 12, 251, 125, 229, 255, 20, 12, 236, + 169, 255, 20, 20, 12, 236, 169, 253, 131, 20, 12, 235, 18, 255, 20, 20, + 12, 235, 18, 253, 131, 20, 12, 238, 136, 234, 164, 20, 12, 228, 93, 234, + 164, 20, 12, 137, 234, 164, 20, 12, 235, 31, 234, 164, 20, 12, 249, 8, + 234, 164, 20, 12, 231, 255, 234, 164, 20, 12, 230, 42, 234, 164, 20, 12, + 231, 250, 234, 164, 20, 12, 236, 210, 246, 32, 229, 77, 234, 164, 20, 12, + 228, 55, 237, 113, 20, 12, 235, 214, 237, 113, 20, 12, 218, 228, 55, 237, + 113, 20, 12, 31, 237, 114, 228, 95, 20, 12, 31, 237, 114, 253, 15, 20, + 12, 229, 183, 237, 114, 88, 228, 95, 20, 12, 229, 183, 237, 114, 88, 253, + 15, 20, 12, 229, 183, 237, 114, 40, 228, 95, 20, 12, 229, 183, 237, 114, + 40, 253, 15, 20, 12, 229, 183, 237, 114, 38, 228, 95, 20, 12, 229, 183, + 237, 114, 38, 253, 15, 20, 12, 229, 183, 237, 114, 92, 228, 95, 20, 12, + 229, 183, 237, 114, 92, 253, 15, 20, 12, 229, 183, 237, 114, 88, 38, 228, + 95, 20, 12, 229, 183, 237, 114, 88, 38, 253, 15, 20, 12, 238, 160, 237, + 114, 228, 95, 20, 12, 238, 160, 237, 114, 253, 15, 20, 12, 229, 180, 237, + 114, 92, 228, 95, 20, 12, 229, 180, 237, 114, 92, 253, 15, 20, 12, 236, + 107, 237, 113, 20, 12, 228, 169, 237, 113, 20, 12, 237, 114, 253, 15, 20, + 12, 237, 80, 237, 113, 20, 12, 251, 229, 237, 114, 228, 95, 20, 12, 251, + 229, 237, 114, 253, 15, 20, 12, 252, 231, 20, 12, 228, 93, 237, 115, 20, + 12, 137, 237, 115, 20, 12, 235, 31, 237, 115, 20, 12, 249, 8, 237, 115, + 20, 12, 231, 255, 237, 115, 20, 12, 230, 42, 237, 115, 20, 12, 231, 250, + 237, 115, 20, 12, 236, 210, 246, 32, 229, 77, 237, 115, 20, 12, 50, 231, + 102, 20, 12, 50, 231, 176, 231, 102, 20, 12, 50, 229, 188, 20, 12, 50, + 229, 187, 20, 12, 50, 229, 186, 20, 12, 248, 61, 229, 188, 20, 12, 248, + 61, 229, 187, 20, 12, 248, 61, 229, 186, 20, 12, 50, 254, 142, 250, 100, + 20, 12, 50, 248, 42, 20, 12, 50, 248, 41, 20, 12, 50, 248, 40, 20, 12, + 50, 248, 39, 20, 12, 50, 248, 38, 20, 12, 253, 80, 253, 90, 20, 12, 248, + 228, 253, 90, 20, 12, 253, 80, 230, 11, 20, 12, 248, 228, 230, 11, 20, + 12, 253, 80, 231, 232, 20, 12, 248, 228, 231, 232, 20, 12, 253, 80, 236, + 15, 20, 12, 248, 228, 236, 15, 20, 12, 50, 255, 90, 20, 12, 50, 231, 121, + 20, 12, 50, 230, 110, 20, 12, 50, 231, 122, 20, 12, 50, 239, 69, 20, 12, + 50, 239, 68, 20, 12, 50, 255, 89, 20, 12, 50, 239, 142, 20, 12, 254, 179, + 229, 0, 20, 12, 254, 179, 249, 88, 20, 12, 50, 250, 108, 20, 12, 50, 234, + 106, 20, 12, 50, 248, 31, 20, 12, 50, 231, 228, 20, 12, 50, 253, 63, 20, + 12, 50, 45, 229, 212, 20, 12, 50, 229, 170, 229, 212, 20, 12, 234, 109, + 20, 12, 231, 58, 20, 12, 227, 103, 20, 12, 236, 7, 20, 12, 238, 254, 20, + 12, 248, 4, 20, 12, 251, 158, 20, 12, 250, 249, 20, 12, 247, 55, 237, + 116, 231, 239, 20, 12, 247, 55, 237, 116, 237, 139, 231, 239, 20, 12, + 229, 198, 20, 12, 229, 95, 20, 12, 241, 143, 229, 95, 20, 12, 229, 96, + 231, 239, 20, 12, 229, 96, 229, 0, 20, 12, 236, 179, 231, 78, 20, 12, + 236, 179, 231, 75, 20, 12, 236, 179, 231, 74, 20, 12, 236, 179, 231, 73, + 20, 12, 236, 179, 231, 72, 20, 12, 236, 179, 231, 71, 20, 12, 236, 179, + 231, 70, 20, 12, 236, 179, 231, 69, 20, 12, 236, 179, 231, 68, 20, 12, + 236, 179, 231, 77, 20, 12, 236, 179, 231, 76, 20, 12, 246, 217, 20, 12, + 238, 8, 20, 12, 248, 228, 147, 231, 96, 20, 12, 250, 243, 231, 239, 20, + 12, 50, 92, 252, 245, 20, 12, 50, 88, 252, 245, 20, 12, 50, 246, 223, 20, + 12, 50, 231, 222, 235, 222, 20, 12, 236, 77, 69, 20, 12, 236, 77, 88, 69, + 20, 12, 137, 236, 77, 69, 20, 12, 247, 78, 229, 0, 20, 12, 247, 78, 249, + 88, 20, 12, 2, 248, 60, 20, 12, 251, 71, 20, 12, 251, 72, 255, 30, 20, + 12, 239, 48, 20, 12, 239, 150, 20, 12, 252, 229, 20, 12, 232, 180, 228, + 95, 20, 12, 232, 180, 253, 15, 20, 12, 238, 194, 20, 12, 238, 195, 253, + 15, 20, 12, 232, 174, 228, 95, 20, 12, 232, 174, 253, 15, 20, 12, 247, + 223, 228, 95, 20, 12, 247, 223, 253, 15, 20, 12, 239, 151, 236, 54, 234, + 164, 20, 12, 239, 151, 241, 196, 234, 164, 20, 12, 252, 230, 234, 164, + 20, 12, 232, 180, 234, 164, 20, 12, 238, 195, 234, 164, 20, 12, 232, 174, + 234, 164, 20, 12, 230, 114, 236, 52, 251, 141, 235, 146, 236, 53, 20, 12, + 230, 114, 236, 52, 251, 141, 235, 146, 241, 195, 20, 12, 230, 114, 236, + 52, 251, 141, 235, 146, 236, 54, 250, 162, 20, 12, 230, 114, 241, 194, + 251, 141, 235, 146, 236, 53, 20, 12, 230, 114, 241, 194, 251, 141, 235, + 146, 241, 195, 20, 12, 230, 114, 241, 194, 251, 141, 235, 146, 241, 196, + 250, 162, 20, 12, 230, 114, 241, 194, 251, 141, 235, 146, 241, 196, 250, + 161, 20, 12, 230, 114, 241, 194, 251, 141, 235, 146, 241, 196, 250, 160, + 20, 12, 251, 155, 20, 12, 247, 40, 252, 179, 251, 249, 20, 12, 247, 40, + 248, 141, 251, 249, 20, 12, 31, 217, 20, 12, 228, 181, 20, 12, 235, 205, + 20, 12, 251, 242, 20, 12, 233, 216, 20, 12, 251, 244, 20, 12, 229, 203, + 20, 12, 235, 188, 20, 12, 235, 189, 248, 33, 20, 12, 233, 217, 248, 33, + 20, 12, 229, 204, 234, 163, 20, 12, 236, 43, 231, 55, 17, 228, 172, 126, + 230, 253, 17, 228, 172, 126, 230, 242, 17, 228, 172, 126, 230, 232, 17, + 228, 172, 126, 230, 225, 17, 228, 172, 126, 230, 217, 17, 228, 172, 126, + 230, 211, 17, 228, 172, 126, 230, 210, 17, 228, 172, 126, 230, 209, 17, + 228, 172, 126, 230, 208, 17, 228, 172, 126, 230, 252, 17, 228, 172, 126, + 230, 251, 17, 228, 172, 126, 230, 250, 17, 228, 172, 126, 230, 249, 17, + 228, 172, 126, 230, 248, 17, 228, 172, 126, 230, 247, 17, 228, 172, 126, + 230, 246, 17, 228, 172, 126, 230, 245, 17, 228, 172, 126, 230, 244, 17, + 228, 172, 126, 230, 243, 17, 228, 172, 126, 230, 241, 17, 228, 172, 126, + 230, 240, 17, 228, 172, 126, 230, 239, 17, 228, 172, 126, 230, 238, 17, + 228, 172, 126, 230, 237, 17, 228, 172, 126, 230, 216, 17, 228, 172, 126, + 230, 215, 17, 228, 172, 126, 230, 214, 17, 228, 172, 126, 230, 213, 17, + 228, 172, 126, 230, 212, 17, 241, 162, 126, 230, 253, 17, 241, 162, 126, + 230, 242, 17, 241, 162, 126, 230, 225, 17, 241, 162, 126, 230, 217, 17, + 241, 162, 126, 230, 210, 17, 241, 162, 126, 230, 209, 17, 241, 162, 126, + 230, 251, 17, 241, 162, 126, 230, 250, 17, 241, 162, 126, 230, 249, 17, + 241, 162, 126, 230, 248, 17, 241, 162, 126, 230, 245, 17, 241, 162, 126, + 230, 244, 17, 241, 162, 126, 230, 243, 17, 241, 162, 126, 230, 238, 17, + 241, 162, 126, 230, 237, 17, 241, 162, 126, 230, 236, 17, 241, 162, 126, + 230, 235, 17, 241, 162, 126, 230, 234, 17, 241, 162, 126, 230, 233, 17, + 241, 162, 126, 230, 231, 17, 241, 162, 126, 230, 230, 17, 241, 162, 126, + 230, 229, 17, 241, 162, 126, 230, 228, 17, 241, 162, 126, 230, 227, 17, + 241, 162, 126, 230, 226, 17, 241, 162, 126, 230, 224, 17, 241, 162, 126, + 230, 223, 17, 241, 162, 126, 230, 222, 17, 241, 162, 126, 230, 221, 17, + 241, 162, 126, 230, 220, 17, 241, 162, 126, 230, 219, 17, 241, 162, 126, + 230, 218, 17, 241, 162, 126, 230, 216, 17, 241, 162, 126, 230, 215, 17, + 241, 162, 126, 230, 214, 17, 241, 162, 126, 230, 213, 17, 241, 162, 126, + 230, 212, 50, 17, 20, 229, 167, 50, 17, 20, 230, 95, 50, 17, 20, 236, 59, + 17, 20, 239, 236, 238, 166, 28, 249, 32, 250, 170, 28, 246, 200, 249, 32, + 250, 170, 28, 246, 34, 249, 32, 250, 170, 28, 249, 31, 246, 201, 250, + 170, 28, 249, 31, 246, 33, 250, 170, 28, 249, 32, 120, 28, 252, 107, 120, + 28, 247, 231, 252, 5, 120, 28, 238, 187, 120, 28, 253, 136, 120, 28, 240, + 217, 231, 231, 120, 28, 251, 182, 120, 28, 254, 165, 120, 28, 236, 186, + 120, 28, 252, 235, 236, 164, 120, 28, 250, 245, 128, 250, 143, 120, 28, + 250, 140, 120, 28, 227, 151, 120, 28, 241, 188, 120, 28, 236, 63, 120, + 28, 234, 202, 120, 28, 251, 192, 120, 28, 246, 63, 253, 163, 120, 28, + 228, 138, 120, 28, 248, 20, 120, 28, 255, 77, 120, 28, 234, 181, 120, 28, + 234, 168, 120, 28, 249, 30, 120, 28, 241, 38, 120, 28, 251, 187, 120, 28, + 248, 227, 120, 28, 249, 60, 120, 28, 252, 86, 120, 28, 250, 251, 120, 28, + 16, 234, 167, 120, 28, 236, 136, 120, 28, 239, 239, 120, 28, 251, 237, + 120, 28, 240, 160, 120, 28, 247, 182, 120, 28, 231, 85, 120, 28, 235, + 115, 120, 28, 247, 230, 120, 28, 234, 169, 120, 28, 240, 6, 128, 238, + 173, 120, 28, 234, 165, 120, 28, 247, 68, 153, 239, 28, 120, 28, 248, + 229, 120, 28, 231, 90, 120, 28, 247, 41, 120, 28, 248, 223, 120, 28, 236, + 89, 120, 28, 234, 100, 120, 28, 248, 32, 120, 28, 228, 220, 128, 228, + 126, 120, 28, 251, 195, 120, 28, 239, 38, 120, 28, 248, 176, 120, 28, + 229, 8, 120, 28, 250, 163, 120, 28, 251, 239, 238, 147, 120, 28, 247, 30, + 120, 28, 247, 183, 241, 192, 120, 28, 239, 54, 120, 28, 255, 87, 120, 28, + 248, 239, 120, 28, 249, 89, 120, 28, 228, 124, 120, 28, 232, 26, 120, 28, + 241, 168, 120, 28, 250, 222, 120, 28, 251, 58, 120, 28, 250, 159, 120, + 28, 248, 155, 120, 28, 232, 153, 120, 28, 231, 92, 120, 28, 246, 225, + 120, 28, 251, 208, 120, 28, 251, 235, 120, 28, 248, 124, 120, 28, 255, + 62, 120, 28, 251, 207, 120, 28, 236, 212, 230, 77, 228, 204, 120, 28, + 250, 178, 120, 28, 240, 34, 120, 28, 248, 1, 10, 16, 5, 67, 10, 16, 5, + 217, 10, 16, 5, 252, 178, 10, 16, 5, 209, 10, 16, 5, 72, 10, 16, 5, 248, + 140, 10, 16, 5, 210, 10, 16, 5, 192, 10, 16, 5, 71, 10, 16, 5, 221, 10, + 16, 5, 241, 12, 10, 16, 5, 162, 10, 16, 5, 173, 10, 16, 5, 197, 10, 16, + 5, 73, 10, 16, 5, 223, 10, 16, 5, 235, 93, 10, 16, 5, 144, 10, 16, 5, + 193, 10, 16, 5, 214, 10, 16, 5, 79, 10, 16, 5, 179, 10, 16, 5, 228, 144, + 10, 16, 5, 206, 10, 16, 5, 228, 7, 10, 16, 5, 227, 103, 10, 16, 3, 67, + 10, 16, 3, 217, 10, 16, 3, 252, 178, 10, 16, 3, 209, 10, 16, 3, 72, 10, + 16, 3, 248, 140, 10, 16, 3, 210, 10, 16, 3, 192, 10, 16, 3, 71, 10, 16, + 3, 221, 10, 16, 3, 241, 12, 10, 16, 3, 162, 10, 16, 3, 173, 10, 16, 3, + 197, 10, 16, 3, 73, 10, 16, 3, 223, 10, 16, 3, 235, 93, 10, 16, 3, 144, + 10, 16, 3, 193, 10, 16, 3, 214, 10, 16, 3, 79, 10, 16, 3, 179, 10, 16, 3, + 228, 144, 10, 16, 3, 206, 10, 16, 3, 228, 7, 10, 16, 3, 227, 103, 10, 24, + 5, 67, 10, 24, 5, 217, 10, 24, 5, 252, 178, 10, 24, 5, 209, 10, 24, 5, + 72, 10, 24, 5, 248, 140, 10, 24, 5, 210, 10, 24, 5, 192, 10, 24, 5, 71, + 10, 24, 5, 221, 10, 24, 5, 241, 12, 10, 24, 5, 162, 10, 24, 5, 173, 10, + 24, 5, 197, 10, 24, 5, 73, 10, 24, 5, 223, 10, 24, 5, 235, 93, 10, 24, 5, + 144, 10, 24, 5, 193, 10, 24, 5, 214, 10, 24, 5, 79, 10, 24, 5, 179, 10, + 24, 5, 228, 144, 10, 24, 5, 206, 10, 24, 5, 228, 7, 10, 24, 5, 227, 103, + 10, 24, 3, 67, 10, 24, 3, 217, 10, 24, 3, 252, 178, 10, 24, 3, 209, 10, + 24, 3, 72, 10, 24, 3, 248, 140, 10, 24, 3, 210, 10, 24, 3, 71, 10, 24, 3, + 221, 10, 24, 3, 241, 12, 10, 24, 3, 162, 10, 24, 3, 173, 10, 24, 3, 197, + 10, 24, 3, 73, 10, 24, 3, 223, 10, 24, 3, 235, 93, 10, 24, 3, 144, 10, + 24, 3, 193, 10, 24, 3, 214, 10, 24, 3, 79, 10, 24, 3, 179, 10, 24, 3, + 228, 144, 10, 24, 3, 206, 10, 24, 3, 228, 7, 10, 24, 3, 227, 103, 10, 16, + 24, 5, 67, 10, 16, 24, 5, 217, 10, 16, 24, 5, 252, 178, 10, 16, 24, 5, + 209, 10, 16, 24, 5, 72, 10, 16, 24, 5, 248, 140, 10, 16, 24, 5, 210, 10, + 16, 24, 5, 192, 10, 16, 24, 5, 71, 10, 16, 24, 5, 221, 10, 16, 24, 5, + 241, 12, 10, 16, 24, 5, 162, 10, 16, 24, 5, 173, 10, 16, 24, 5, 197, 10, + 16, 24, 5, 73, 10, 16, 24, 5, 223, 10, 16, 24, 5, 235, 93, 10, 16, 24, 5, + 144, 10, 16, 24, 5, 193, 10, 16, 24, 5, 214, 10, 16, 24, 5, 79, 10, 16, + 24, 5, 179, 10, 16, 24, 5, 228, 144, 10, 16, 24, 5, 206, 10, 16, 24, 5, + 228, 7, 10, 16, 24, 5, 227, 103, 10, 16, 24, 3, 67, 10, 16, 24, 3, 217, + 10, 16, 24, 3, 252, 178, 10, 16, 24, 3, 209, 10, 16, 24, 3, 72, 10, 16, + 24, 3, 248, 140, 10, 16, 24, 3, 210, 10, 16, 24, 3, 192, 10, 16, 24, 3, + 71, 10, 16, 24, 3, 221, 10, 16, 24, 3, 241, 12, 10, 16, 24, 3, 162, 10, + 16, 24, 3, 173, 10, 16, 24, 3, 197, 10, 16, 24, 3, 73, 10, 16, 24, 3, + 223, 10, 16, 24, 3, 235, 93, 10, 16, 24, 3, 144, 10, 16, 24, 3, 193, 10, + 16, 24, 3, 214, 10, 16, 24, 3, 79, 10, 16, 24, 3, 179, 10, 16, 24, 3, + 228, 144, 10, 16, 24, 3, 206, 10, 16, 24, 3, 228, 7, 10, 16, 24, 3, 227, + 103, 10, 84, 5, 67, 10, 84, 5, 252, 178, 10, 84, 5, 209, 10, 84, 5, 210, + 10, 84, 5, 221, 10, 84, 5, 241, 12, 10, 84, 5, 197, 10, 84, 5, 73, 10, + 84, 5, 223, 10, 84, 5, 235, 93, 10, 84, 5, 193, 10, 84, 5, 214, 10, 84, + 5, 79, 10, 84, 5, 179, 10, 84, 5, 228, 144, 10, 84, 5, 206, 10, 84, 5, + 228, 7, 10, 84, 5, 227, 103, 10, 84, 3, 67, 10, 84, 3, 217, 10, 84, 3, + 252, 178, 10, 84, 3, 209, 10, 84, 3, 248, 140, 10, 84, 3, 192, 10, 84, 3, + 71, 10, 84, 3, 221, 10, 84, 3, 241, 12, 10, 84, 3, 162, 10, 84, 3, 173, + 10, 84, 3, 197, 10, 84, 3, 223, 10, 84, 3, 235, 93, 10, 84, 3, 144, 10, + 84, 3, 193, 10, 84, 3, 214, 10, 84, 3, 79, 10, 84, 3, 179, 10, 84, 3, + 228, 144, 10, 84, 3, 206, 10, 84, 3, 228, 7, 10, 84, 3, 227, 103, 10, 16, + 84, 5, 67, 10, 16, 84, 5, 217, 10, 16, 84, 5, 252, 178, 10, 16, 84, 5, + 209, 10, 16, 84, 5, 72, 10, 16, 84, 5, 248, 140, 10, 16, 84, 5, 210, 10, + 16, 84, 5, 192, 10, 16, 84, 5, 71, 10, 16, 84, 5, 221, 10, 16, 84, 5, + 241, 12, 10, 16, 84, 5, 162, 10, 16, 84, 5, 173, 10, 16, 84, 5, 197, 10, + 16, 84, 5, 73, 10, 16, 84, 5, 223, 10, 16, 84, 5, 235, 93, 10, 16, 84, 5, + 144, 10, 16, 84, 5, 193, 10, 16, 84, 5, 214, 10, 16, 84, 5, 79, 10, 16, + 84, 5, 179, 10, 16, 84, 5, 228, 144, 10, 16, 84, 5, 206, 10, 16, 84, 5, + 228, 7, 10, 16, 84, 5, 227, 103, 10, 16, 84, 3, 67, 10, 16, 84, 3, 217, + 10, 16, 84, 3, 252, 178, 10, 16, 84, 3, 209, 10, 16, 84, 3, 72, 10, 16, + 84, 3, 248, 140, 10, 16, 84, 3, 210, 10, 16, 84, 3, 192, 10, 16, 84, 3, + 71, 10, 16, 84, 3, 221, 10, 16, 84, 3, 241, 12, 10, 16, 84, 3, 162, 10, + 16, 84, 3, 173, 10, 16, 84, 3, 197, 10, 16, 84, 3, 73, 10, 16, 84, 3, + 223, 10, 16, 84, 3, 235, 93, 10, 16, 84, 3, 144, 10, 16, 84, 3, 193, 10, + 16, 84, 3, 214, 10, 16, 84, 3, 79, 10, 16, 84, 3, 179, 10, 16, 84, 3, + 228, 144, 10, 16, 84, 3, 206, 10, 16, 84, 3, 228, 7, 10, 16, 84, 3, 227, + 103, 10, 93, 5, 67, 10, 93, 5, 217, 10, 93, 5, 209, 10, 93, 5, 72, 10, + 93, 5, 248, 140, 10, 93, 5, 210, 10, 93, 5, 221, 10, 93, 5, 241, 12, 10, + 93, 5, 162, 10, 93, 5, 173, 10, 93, 5, 197, 10, 93, 5, 73, 10, 93, 5, + 223, 10, 93, 5, 235, 93, 10, 93, 5, 193, 10, 93, 5, 214, 10, 93, 5, 79, + 10, 93, 5, 179, 10, 93, 5, 228, 144, 10, 93, 5, 206, 10, 93, 5, 228, 7, + 10, 93, 3, 67, 10, 93, 3, 217, 10, 93, 3, 252, 178, 10, 93, 3, 209, 10, + 93, 3, 72, 10, 93, 3, 248, 140, 10, 93, 3, 210, 10, 93, 3, 192, 10, 93, + 3, 71, 10, 93, 3, 221, 10, 93, 3, 241, 12, 10, 93, 3, 162, 10, 93, 3, + 173, 10, 93, 3, 197, 10, 93, 3, 73, 10, 93, 3, 223, 10, 93, 3, 235, 93, + 10, 93, 3, 144, 10, 93, 3, 193, 10, 93, 3, 214, 10, 93, 3, 79, 10, 93, 3, + 179, 10, 93, 3, 228, 144, 10, 93, 3, 206, 10, 93, 3, 228, 7, 10, 93, 3, + 227, 103, 10, 138, 5, 67, 10, 138, 5, 217, 10, 138, 5, 209, 10, 138, 5, + 72, 10, 138, 5, 248, 140, 10, 138, 5, 210, 10, 138, 5, 71, 10, 138, 5, + 221, 10, 138, 5, 241, 12, 10, 138, 5, 162, 10, 138, 5, 173, 10, 138, 5, + 73, 10, 138, 5, 193, 10, 138, 5, 214, 10, 138, 5, 79, 10, 138, 5, 179, + 10, 138, 5, 228, 144, 10, 138, 5, 206, 10, 138, 5, 228, 7, 10, 138, 3, + 67, 10, 138, 3, 217, 10, 138, 3, 252, 178, 10, 138, 3, 209, 10, 138, 3, + 72, 10, 138, 3, 248, 140, 10, 138, 3, 210, 10, 138, 3, 192, 10, 138, 3, + 71, 10, 138, 3, 221, 10, 138, 3, 241, 12, 10, 138, 3, 162, 10, 138, 3, + 173, 10, 138, 3, 197, 10, 138, 3, 73, 10, 138, 3, 223, 10, 138, 3, 235, + 93, 10, 138, 3, 144, 10, 138, 3, 193, 10, 138, 3, 214, 10, 138, 3, 79, + 10, 138, 3, 179, 10, 138, 3, 228, 144, 10, 138, 3, 206, 10, 138, 3, 228, + 7, 10, 138, 3, 227, 103, 10, 16, 93, 5, 67, 10, 16, 93, 5, 217, 10, 16, + 93, 5, 252, 178, 10, 16, 93, 5, 209, 10, 16, 93, 5, 72, 10, 16, 93, 5, + 248, 140, 10, 16, 93, 5, 210, 10, 16, 93, 5, 192, 10, 16, 93, 5, 71, 10, + 16, 93, 5, 221, 10, 16, 93, 5, 241, 12, 10, 16, 93, 5, 162, 10, 16, 93, + 5, 173, 10, 16, 93, 5, 197, 10, 16, 93, 5, 73, 10, 16, 93, 5, 223, 10, + 16, 93, 5, 235, 93, 10, 16, 93, 5, 144, 10, 16, 93, 5, 193, 10, 16, 93, + 5, 214, 10, 16, 93, 5, 79, 10, 16, 93, 5, 179, 10, 16, 93, 5, 228, 144, + 10, 16, 93, 5, 206, 10, 16, 93, 5, 228, 7, 10, 16, 93, 5, 227, 103, 10, + 16, 93, 3, 67, 10, 16, 93, 3, 217, 10, 16, 93, 3, 252, 178, 10, 16, 93, + 3, 209, 10, 16, 93, 3, 72, 10, 16, 93, 3, 248, 140, 10, 16, 93, 3, 210, + 10, 16, 93, 3, 192, 10, 16, 93, 3, 71, 10, 16, 93, 3, 221, 10, 16, 93, 3, + 241, 12, 10, 16, 93, 3, 162, 10, 16, 93, 3, 173, 10, 16, 93, 3, 197, 10, + 16, 93, 3, 73, 10, 16, 93, 3, 223, 10, 16, 93, 3, 235, 93, 10, 16, 93, 3, + 144, 10, 16, 93, 3, 193, 10, 16, 93, 3, 214, 10, 16, 93, 3, 79, 10, 16, + 93, 3, 179, 10, 16, 93, 3, 228, 144, 10, 16, 93, 3, 206, 10, 16, 93, 3, + 228, 7, 10, 16, 93, 3, 227, 103, 10, 27, 5, 67, 10, 27, 5, 217, 10, 27, + 5, 252, 178, 10, 27, 5, 209, 10, 27, 5, 72, 10, 27, 5, 248, 140, 10, 27, + 5, 210, 10, 27, 5, 192, 10, 27, 5, 71, 10, 27, 5, 221, 10, 27, 5, 241, + 12, 10, 27, 5, 162, 10, 27, 5, 173, 10, 27, 5, 197, 10, 27, 5, 73, 10, + 27, 5, 223, 10, 27, 5, 235, 93, 10, 27, 5, 144, 10, 27, 5, 193, 10, 27, + 5, 214, 10, 27, 5, 79, 10, 27, 5, 179, 10, 27, 5, 228, 144, 10, 27, 5, + 206, 10, 27, 5, 228, 7, 10, 27, 5, 227, 103, 10, 27, 3, 67, 10, 27, 3, + 217, 10, 27, 3, 252, 178, 10, 27, 3, 209, 10, 27, 3, 72, 10, 27, 3, 248, + 140, 10, 27, 3, 210, 10, 27, 3, 192, 10, 27, 3, 71, 10, 27, 3, 221, 10, + 27, 3, 241, 12, 10, 27, 3, 162, 10, 27, 3, 173, 10, 27, 3, 197, 10, 27, + 3, 73, 10, 27, 3, 223, 10, 27, 3, 235, 93, 10, 27, 3, 144, 10, 27, 3, + 193, 10, 27, 3, 214, 10, 27, 3, 79, 10, 27, 3, 179, 10, 27, 3, 228, 144, + 10, 27, 3, 206, 10, 27, 3, 228, 7, 10, 27, 3, 227, 103, 10, 27, 16, 5, + 67, 10, 27, 16, 5, 217, 10, 27, 16, 5, 252, 178, 10, 27, 16, 5, 209, 10, + 27, 16, 5, 72, 10, 27, 16, 5, 248, 140, 10, 27, 16, 5, 210, 10, 27, 16, + 5, 192, 10, 27, 16, 5, 71, 10, 27, 16, 5, 221, 10, 27, 16, 5, 241, 12, + 10, 27, 16, 5, 162, 10, 27, 16, 5, 173, 10, 27, 16, 5, 197, 10, 27, 16, + 5, 73, 10, 27, 16, 5, 223, 10, 27, 16, 5, 235, 93, 10, 27, 16, 5, 144, + 10, 27, 16, 5, 193, 10, 27, 16, 5, 214, 10, 27, 16, 5, 79, 10, 27, 16, 5, + 179, 10, 27, 16, 5, 228, 144, 10, 27, 16, 5, 206, 10, 27, 16, 5, 228, 7, + 10, 27, 16, 5, 227, 103, 10, 27, 16, 3, 67, 10, 27, 16, 3, 217, 10, 27, + 16, 3, 252, 178, 10, 27, 16, 3, 209, 10, 27, 16, 3, 72, 10, 27, 16, 3, + 248, 140, 10, 27, 16, 3, 210, 10, 27, 16, 3, 192, 10, 27, 16, 3, 71, 10, + 27, 16, 3, 221, 10, 27, 16, 3, 241, 12, 10, 27, 16, 3, 162, 10, 27, 16, + 3, 173, 10, 27, 16, 3, 197, 10, 27, 16, 3, 73, 10, 27, 16, 3, 223, 10, + 27, 16, 3, 235, 93, 10, 27, 16, 3, 144, 10, 27, 16, 3, 193, 10, 27, 16, + 3, 214, 10, 27, 16, 3, 79, 10, 27, 16, 3, 179, 10, 27, 16, 3, 228, 144, + 10, 27, 16, 3, 206, 10, 27, 16, 3, 228, 7, 10, 27, 16, 3, 227, 103, 10, + 27, 24, 5, 67, 10, 27, 24, 5, 217, 10, 27, 24, 5, 252, 178, 10, 27, 24, + 5, 209, 10, 27, 24, 5, 72, 10, 27, 24, 5, 248, 140, 10, 27, 24, 5, 210, + 10, 27, 24, 5, 192, 10, 27, 24, 5, 71, 10, 27, 24, 5, 221, 10, 27, 24, 5, + 241, 12, 10, 27, 24, 5, 162, 10, 27, 24, 5, 173, 10, 27, 24, 5, 197, 10, + 27, 24, 5, 73, 10, 27, 24, 5, 223, 10, 27, 24, 5, 235, 93, 10, 27, 24, 5, + 144, 10, 27, 24, 5, 193, 10, 27, 24, 5, 214, 10, 27, 24, 5, 79, 10, 27, + 24, 5, 179, 10, 27, 24, 5, 228, 144, 10, 27, 24, 5, 206, 10, 27, 24, 5, + 228, 7, 10, 27, 24, 5, 227, 103, 10, 27, 24, 3, 67, 10, 27, 24, 3, 217, + 10, 27, 24, 3, 252, 178, 10, 27, 24, 3, 209, 10, 27, 24, 3, 72, 10, 27, + 24, 3, 248, 140, 10, 27, 24, 3, 210, 10, 27, 24, 3, 192, 10, 27, 24, 3, + 71, 10, 27, 24, 3, 221, 10, 27, 24, 3, 241, 12, 10, 27, 24, 3, 162, 10, + 27, 24, 3, 173, 10, 27, 24, 3, 197, 10, 27, 24, 3, 73, 10, 27, 24, 3, + 223, 10, 27, 24, 3, 235, 93, 10, 27, 24, 3, 144, 10, 27, 24, 3, 193, 10, + 27, 24, 3, 214, 10, 27, 24, 3, 79, 10, 27, 24, 3, 179, 10, 27, 24, 3, + 228, 144, 10, 27, 24, 3, 206, 10, 27, 24, 3, 228, 7, 10, 27, 24, 3, 227, + 103, 10, 27, 16, 24, 5, 67, 10, 27, 16, 24, 5, 217, 10, 27, 16, 24, 5, + 252, 178, 10, 27, 16, 24, 5, 209, 10, 27, 16, 24, 5, 72, 10, 27, 16, 24, + 5, 248, 140, 10, 27, 16, 24, 5, 210, 10, 27, 16, 24, 5, 192, 10, 27, 16, + 24, 5, 71, 10, 27, 16, 24, 5, 221, 10, 27, 16, 24, 5, 241, 12, 10, 27, + 16, 24, 5, 162, 10, 27, 16, 24, 5, 173, 10, 27, 16, 24, 5, 197, 10, 27, + 16, 24, 5, 73, 10, 27, 16, 24, 5, 223, 10, 27, 16, 24, 5, 235, 93, 10, + 27, 16, 24, 5, 144, 10, 27, 16, 24, 5, 193, 10, 27, 16, 24, 5, 214, 10, + 27, 16, 24, 5, 79, 10, 27, 16, 24, 5, 179, 10, 27, 16, 24, 5, 228, 144, + 10, 27, 16, 24, 5, 206, 10, 27, 16, 24, 5, 228, 7, 10, 27, 16, 24, 5, + 227, 103, 10, 27, 16, 24, 3, 67, 10, 27, 16, 24, 3, 217, 10, 27, 16, 24, + 3, 252, 178, 10, 27, 16, 24, 3, 209, 10, 27, 16, 24, 3, 72, 10, 27, 16, + 24, 3, 248, 140, 10, 27, 16, 24, 3, 210, 10, 27, 16, 24, 3, 192, 10, 27, + 16, 24, 3, 71, 10, 27, 16, 24, 3, 221, 10, 27, 16, 24, 3, 241, 12, 10, + 27, 16, 24, 3, 162, 10, 27, 16, 24, 3, 173, 10, 27, 16, 24, 3, 197, 10, + 27, 16, 24, 3, 73, 10, 27, 16, 24, 3, 223, 10, 27, 16, 24, 3, 235, 93, + 10, 27, 16, 24, 3, 144, 10, 27, 16, 24, 3, 193, 10, 27, 16, 24, 3, 214, + 10, 27, 16, 24, 3, 79, 10, 27, 16, 24, 3, 179, 10, 27, 16, 24, 3, 228, + 144, 10, 27, 16, 24, 3, 206, 10, 27, 16, 24, 3, 228, 7, 10, 27, 16, 24, + 3, 227, 103, 10, 160, 5, 67, 10, 160, 5, 217, 10, 160, 5, 252, 178, 10, + 160, 5, 209, 10, 160, 5, 72, 10, 160, 5, 248, 140, 10, 160, 5, 210, 10, + 160, 5, 192, 10, 160, 5, 71, 10, 160, 5, 221, 10, 160, 5, 241, 12, 10, 160, 5, 162, 10, 160, 5, 173, 10, 160, 5, 197, 10, 160, 5, 73, 10, 160, - 5, 223, 10, 160, 5, 255, 20, 10, 160, 5, 144, 10, 160, 5, 193, 10, 160, - 5, 214, 10, 160, 5, 79, 10, 160, 5, 179, 10, 160, 5, 255, 16, 10, 160, 5, - 206, 10, 160, 5, 255, 14, 10, 160, 5, 255, 17, 10, 160, 3, 67, 10, 160, - 3, 217, 10, 160, 3, 255, 18, 10, 160, 3, 209, 10, 160, 3, 72, 10, 160, 3, - 255, 19, 10, 160, 3, 210, 10, 160, 3, 192, 10, 160, 3, 71, 10, 160, 3, - 221, 10, 160, 3, 255, 15, 10, 160, 3, 162, 10, 160, 3, 173, 10, 160, 3, - 197, 10, 160, 3, 73, 10, 160, 3, 223, 10, 160, 3, 255, 20, 10, 160, 3, - 144, 10, 160, 3, 193, 10, 160, 3, 214, 10, 160, 3, 79, 10, 160, 3, 179, - 10, 160, 3, 255, 16, 10, 160, 3, 206, 10, 160, 3, 255, 14, 10, 160, 3, - 255, 17, 10, 24, 3, 238, 70, 71, 10, 24, 3, 238, 70, 221, 10, 16, 5, 240, - 22, 10, 16, 5, 242, 242, 10, 16, 5, 240, 10, 10, 16, 5, 240, 28, 10, 16, - 5, 236, 165, 10, 16, 5, 242, 251, 10, 16, 5, 248, 87, 10, 16, 5, 240, 38, - 10, 16, 5, 242, 237, 10, 16, 5, 240, 41, 10, 16, 5, 240, 33, 10, 16, 5, - 253, 154, 10, 16, 5, 253, 150, 10, 16, 5, 253, 188, 10, 16, 5, 236, 169, - 10, 16, 5, 253, 147, 10, 16, 5, 248, 73, 10, 16, 5, 243, 0, 91, 10, 16, - 5, 240, 21, 10, 16, 5, 248, 85, 10, 16, 5, 236, 160, 10, 16, 5, 248, 68, - 10, 16, 5, 248, 67, 10, 16, 5, 248, 69, 10, 16, 5, 240, 20, 10, 16, 240, - 79, 10, 16, 3, 240, 22, 10, 16, 3, 242, 242, 10, 16, 3, 240, 10, 10, 16, - 3, 240, 28, 10, 16, 3, 236, 165, 10, 16, 3, 242, 251, 10, 16, 3, 248, 87, - 10, 16, 3, 240, 38, 10, 16, 3, 242, 237, 10, 16, 3, 240, 41, 10, 16, 3, - 240, 33, 10, 16, 3, 253, 154, 10, 16, 3, 253, 150, 10, 16, 3, 253, 188, - 10, 16, 3, 236, 169, 10, 16, 3, 253, 147, 10, 16, 3, 248, 73, 10, 16, 3, - 30, 240, 21, 10, 16, 3, 240, 21, 10, 16, 3, 248, 85, 10, 16, 3, 236, 160, - 10, 16, 3, 248, 68, 10, 16, 3, 248, 67, 10, 16, 3, 248, 69, 10, 16, 3, - 240, 20, 10, 16, 238, 100, 231, 90, 10, 16, 238, 57, 91, 10, 16, 243, 0, - 91, 10, 16, 243, 29, 91, 10, 16, 254, 11, 91, 10, 16, 253, 218, 91, 10, - 16, 255, 29, 91, 10, 24, 5, 240, 22, 10, 24, 5, 242, 242, 10, 24, 5, 240, - 10, 10, 24, 5, 240, 28, 10, 24, 5, 236, 165, 10, 24, 5, 242, 251, 10, 24, - 5, 248, 87, 10, 24, 5, 240, 38, 10, 24, 5, 242, 237, 10, 24, 5, 240, 41, - 10, 24, 5, 240, 33, 10, 24, 5, 253, 154, 10, 24, 5, 253, 150, 10, 24, 5, - 253, 188, 10, 24, 5, 236, 169, 10, 24, 5, 253, 147, 10, 24, 5, 248, 73, - 10, 24, 5, 243, 0, 91, 10, 24, 5, 240, 21, 10, 24, 5, 248, 85, 10, 24, 5, - 236, 160, 10, 24, 5, 248, 68, 10, 24, 5, 248, 67, 10, 24, 5, 248, 69, 10, - 24, 5, 240, 20, 10, 24, 240, 79, 10, 24, 3, 240, 22, 10, 24, 3, 242, 242, - 10, 24, 3, 240, 10, 10, 24, 3, 240, 28, 10, 24, 3, 236, 165, 10, 24, 3, - 242, 251, 10, 24, 3, 248, 87, 10, 24, 3, 240, 38, 10, 24, 3, 242, 237, - 10, 24, 3, 240, 41, 10, 24, 3, 240, 33, 10, 24, 3, 253, 154, 10, 24, 3, - 253, 150, 10, 24, 3, 253, 188, 10, 24, 3, 236, 169, 10, 24, 3, 253, 147, - 10, 24, 3, 248, 73, 10, 24, 3, 30, 240, 21, 10, 24, 3, 240, 21, 10, 24, - 3, 248, 85, 10, 24, 3, 236, 160, 10, 24, 3, 248, 68, 10, 24, 3, 248, 67, - 10, 24, 3, 248, 69, 10, 24, 3, 240, 20, 10, 24, 238, 100, 231, 90, 10, - 24, 238, 57, 91, 10, 24, 243, 0, 91, 10, 24, 243, 29, 91, 10, 24, 254, - 11, 91, 10, 24, 253, 218, 91, 10, 24, 255, 29, 91, 10, 16, 24, 5, 240, - 22, 10, 16, 24, 5, 242, 242, 10, 16, 24, 5, 240, 10, 10, 16, 24, 5, 240, - 28, 10, 16, 24, 5, 236, 165, 10, 16, 24, 5, 242, 251, 10, 16, 24, 5, 248, - 87, 10, 16, 24, 5, 240, 38, 10, 16, 24, 5, 242, 237, 10, 16, 24, 5, 240, - 41, 10, 16, 24, 5, 240, 33, 10, 16, 24, 5, 253, 154, 10, 16, 24, 5, 253, - 150, 10, 16, 24, 5, 253, 188, 10, 16, 24, 5, 236, 169, 10, 16, 24, 5, - 253, 147, 10, 16, 24, 5, 248, 73, 10, 16, 24, 5, 243, 0, 91, 10, 16, 24, - 5, 240, 21, 10, 16, 24, 5, 248, 85, 10, 16, 24, 5, 236, 160, 10, 16, 24, - 5, 248, 68, 10, 16, 24, 5, 248, 67, 10, 16, 24, 5, 248, 69, 10, 16, 24, - 5, 240, 20, 10, 16, 24, 240, 79, 10, 16, 24, 3, 240, 22, 10, 16, 24, 3, - 242, 242, 10, 16, 24, 3, 240, 10, 10, 16, 24, 3, 240, 28, 10, 16, 24, 3, - 236, 165, 10, 16, 24, 3, 242, 251, 10, 16, 24, 3, 248, 87, 10, 16, 24, 3, - 240, 38, 10, 16, 24, 3, 242, 237, 10, 16, 24, 3, 240, 41, 10, 16, 24, 3, - 240, 33, 10, 16, 24, 3, 253, 154, 10, 16, 24, 3, 253, 150, 10, 16, 24, 3, - 253, 188, 10, 16, 24, 3, 236, 169, 10, 16, 24, 3, 253, 147, 10, 16, 24, - 3, 248, 73, 10, 16, 24, 3, 30, 240, 21, 10, 16, 24, 3, 240, 21, 10, 16, - 24, 3, 248, 85, 10, 16, 24, 3, 236, 160, 10, 16, 24, 3, 248, 68, 10, 16, - 24, 3, 248, 67, 10, 16, 24, 3, 248, 69, 10, 16, 24, 3, 240, 20, 10, 16, - 24, 238, 100, 231, 90, 10, 16, 24, 238, 57, 91, 10, 16, 24, 243, 0, 91, - 10, 16, 24, 243, 29, 91, 10, 16, 24, 254, 11, 91, 10, 16, 24, 253, 218, - 91, 10, 16, 24, 255, 29, 91, 10, 27, 16, 5, 240, 22, 10, 27, 16, 5, 242, - 242, 10, 27, 16, 5, 240, 10, 10, 27, 16, 5, 240, 28, 10, 27, 16, 5, 236, - 165, 10, 27, 16, 5, 242, 251, 10, 27, 16, 5, 248, 87, 10, 27, 16, 5, 240, - 38, 10, 27, 16, 5, 242, 237, 10, 27, 16, 5, 240, 41, 10, 27, 16, 5, 240, - 33, 10, 27, 16, 5, 253, 154, 10, 27, 16, 5, 253, 150, 10, 27, 16, 5, 253, - 188, 10, 27, 16, 5, 236, 169, 10, 27, 16, 5, 253, 147, 10, 27, 16, 5, - 248, 73, 10, 27, 16, 5, 243, 0, 91, 10, 27, 16, 5, 240, 21, 10, 27, 16, - 5, 248, 85, 10, 27, 16, 5, 236, 160, 10, 27, 16, 5, 248, 68, 10, 27, 16, - 5, 248, 67, 10, 27, 16, 5, 248, 69, 10, 27, 16, 5, 240, 20, 10, 27, 16, - 240, 79, 10, 27, 16, 3, 240, 22, 10, 27, 16, 3, 242, 242, 10, 27, 16, 3, - 240, 10, 10, 27, 16, 3, 240, 28, 10, 27, 16, 3, 236, 165, 10, 27, 16, 3, - 242, 251, 10, 27, 16, 3, 248, 87, 10, 27, 16, 3, 240, 38, 10, 27, 16, 3, - 242, 237, 10, 27, 16, 3, 240, 41, 10, 27, 16, 3, 240, 33, 10, 27, 16, 3, - 253, 154, 10, 27, 16, 3, 253, 150, 10, 27, 16, 3, 253, 188, 10, 27, 16, - 3, 236, 169, 10, 27, 16, 3, 253, 147, 10, 27, 16, 3, 248, 73, 10, 27, 16, - 3, 30, 240, 21, 10, 27, 16, 3, 240, 21, 10, 27, 16, 3, 248, 85, 10, 27, - 16, 3, 236, 160, 10, 27, 16, 3, 248, 68, 10, 27, 16, 3, 248, 67, 10, 27, - 16, 3, 248, 69, 10, 27, 16, 3, 240, 20, 10, 27, 16, 238, 100, 231, 90, - 10, 27, 16, 238, 57, 91, 10, 27, 16, 243, 0, 91, 10, 27, 16, 243, 29, 91, - 10, 27, 16, 254, 11, 91, 10, 27, 16, 253, 218, 91, 10, 27, 16, 255, 29, - 91, 10, 27, 16, 24, 5, 240, 22, 10, 27, 16, 24, 5, 242, 242, 10, 27, 16, - 24, 5, 240, 10, 10, 27, 16, 24, 5, 240, 28, 10, 27, 16, 24, 5, 236, 165, - 10, 27, 16, 24, 5, 242, 251, 10, 27, 16, 24, 5, 248, 87, 10, 27, 16, 24, - 5, 240, 38, 10, 27, 16, 24, 5, 242, 237, 10, 27, 16, 24, 5, 240, 41, 10, - 27, 16, 24, 5, 240, 33, 10, 27, 16, 24, 5, 253, 154, 10, 27, 16, 24, 5, - 253, 150, 10, 27, 16, 24, 5, 253, 188, 10, 27, 16, 24, 5, 236, 169, 10, - 27, 16, 24, 5, 253, 147, 10, 27, 16, 24, 5, 248, 73, 10, 27, 16, 24, 5, - 243, 0, 91, 10, 27, 16, 24, 5, 240, 21, 10, 27, 16, 24, 5, 248, 85, 10, - 27, 16, 24, 5, 236, 160, 10, 27, 16, 24, 5, 248, 68, 10, 27, 16, 24, 5, - 248, 67, 10, 27, 16, 24, 5, 248, 69, 10, 27, 16, 24, 5, 240, 20, 10, 27, - 16, 24, 240, 79, 10, 27, 16, 24, 3, 240, 22, 10, 27, 16, 24, 3, 242, 242, - 10, 27, 16, 24, 3, 240, 10, 10, 27, 16, 24, 3, 240, 28, 10, 27, 16, 24, - 3, 236, 165, 10, 27, 16, 24, 3, 242, 251, 10, 27, 16, 24, 3, 248, 87, 10, - 27, 16, 24, 3, 240, 38, 10, 27, 16, 24, 3, 242, 237, 10, 27, 16, 24, 3, - 240, 41, 10, 27, 16, 24, 3, 240, 33, 10, 27, 16, 24, 3, 253, 154, 10, 27, - 16, 24, 3, 253, 150, 10, 27, 16, 24, 3, 253, 188, 10, 27, 16, 24, 3, 236, - 169, 10, 27, 16, 24, 3, 253, 147, 10, 27, 16, 24, 3, 248, 73, 10, 27, 16, - 24, 3, 30, 240, 21, 10, 27, 16, 24, 3, 240, 21, 10, 27, 16, 24, 3, 248, - 85, 10, 27, 16, 24, 3, 236, 160, 10, 27, 16, 24, 3, 248, 68, 10, 27, 16, - 24, 3, 248, 67, 10, 27, 16, 24, 3, 248, 69, 10, 27, 16, 24, 3, 240, 20, - 10, 27, 16, 24, 238, 100, 231, 90, 10, 27, 16, 24, 238, 57, 91, 10, 27, - 16, 24, 243, 0, 91, 10, 27, 16, 24, 243, 29, 91, 10, 27, 16, 24, 254, 11, - 91, 10, 27, 16, 24, 253, 218, 91, 10, 27, 16, 24, 255, 29, 91, 10, 16, - 26, 242, 217, 10, 16, 26, 127, 10, 16, 26, 111, 10, 16, 26, 166, 10, 16, - 26, 177, 10, 16, 26, 176, 10, 16, 26, 187, 10, 16, 26, 203, 10, 16, 26, - 195, 10, 16, 26, 202, 10, 138, 26, 242, 217, 10, 138, 26, 127, 10, 138, - 26, 111, 10, 138, 26, 166, 10, 138, 26, 177, 10, 138, 26, 176, 10, 138, - 26, 187, 10, 138, 26, 203, 10, 138, 26, 195, 10, 138, 26, 202, 10, 27, - 26, 242, 217, 10, 27, 26, 127, 10, 27, 26, 111, 10, 27, 26, 166, 10, 27, - 26, 177, 10, 27, 26, 176, 10, 27, 26, 187, 10, 27, 26, 203, 10, 27, 26, - 195, 10, 27, 26, 202, 10, 27, 16, 26, 242, 217, 10, 27, 16, 26, 127, 10, - 27, 16, 26, 111, 10, 27, 16, 26, 166, 10, 27, 16, 26, 177, 10, 27, 16, - 26, 176, 10, 27, 16, 26, 187, 10, 27, 16, 26, 203, 10, 27, 16, 26, 195, - 10, 27, 16, 26, 202, 10, 160, 26, 242, 217, 10, 160, 26, 127, 10, 160, - 26, 111, 10, 160, 26, 166, 10, 160, 26, 177, 10, 160, 26, 176, 10, 160, - 26, 187, 10, 160, 26, 203, 10, 160, 26, 195, 10, 160, 26, 202, 7, 9, 227, - 16, 7, 9, 227, 17, 7, 9, 227, 18, 7, 9, 227, 19, 7, 9, 227, 20, 7, 9, - 227, 21, 7, 9, 227, 22, 7, 9, 227, 23, 7, 9, 227, 24, 7, 9, 227, 25, 7, - 9, 227, 26, 7, 9, 227, 27, 7, 9, 227, 28, 7, 9, 227, 29, 7, 9, 227, 30, - 7, 9, 227, 31, 7, 9, 227, 32, 7, 9, 227, 33, 7, 9, 227, 34, 7, 9, 227, - 35, 7, 9, 227, 36, 7, 9, 227, 37, 7, 9, 227, 38, 7, 9, 227, 39, 7, 9, - 227, 40, 7, 9, 227, 41, 7, 9, 227, 42, 7, 9, 227, 43, 7, 9, 227, 44, 7, - 9, 227, 45, 7, 9, 227, 46, 7, 9, 227, 47, 7, 9, 227, 48, 7, 9, 227, 49, - 7, 9, 227, 50, 7, 9, 227, 51, 7, 9, 227, 52, 7, 9, 227, 53, 7, 9, 227, - 54, 7, 9, 227, 55, 7, 9, 227, 56, 7, 9, 227, 57, 7, 9, 227, 58, 7, 9, - 227, 59, 7, 9, 227, 60, 7, 9, 227, 61, 7, 9, 227, 62, 7, 9, 227, 63, 7, - 9, 227, 64, 7, 9, 227, 65, 7, 9, 227, 66, 7, 9, 227, 67, 7, 9, 227, 68, - 7, 9, 227, 69, 7, 9, 227, 70, 7, 9, 227, 71, 7, 9, 227, 72, 7, 9, 227, - 73, 7, 9, 227, 74, 7, 9, 227, 75, 7, 9, 227, 76, 7, 9, 227, 77, 7, 9, - 227, 78, 7, 9, 227, 79, 7, 9, 227, 80, 7, 9, 227, 81, 7, 9, 227, 82, 7, - 9, 227, 83, 7, 9, 227, 84, 7, 9, 227, 85, 7, 9, 227, 86, 7, 9, 227, 87, - 7, 9, 227, 88, 7, 9, 227, 89, 7, 9, 227, 90, 7, 9, 227, 91, 7, 9, 227, - 92, 7, 9, 227, 93, 7, 9, 227, 94, 7, 9, 227, 95, 7, 9, 227, 96, 7, 9, - 227, 97, 7, 9, 227, 98, 7, 9, 227, 99, 7, 9, 227, 100, 7, 9, 227, 101, 7, - 9, 227, 102, 7, 9, 227, 103, 7, 9, 227, 104, 7, 9, 227, 105, 7, 9, 227, - 106, 7, 9, 227, 107, 7, 9, 227, 108, 7, 9, 227, 109, 7, 9, 227, 110, 7, - 9, 227, 111, 7, 9, 227, 112, 7, 9, 227, 113, 7, 9, 227, 114, 7, 9, 227, - 115, 7, 9, 227, 116, 7, 9, 227, 117, 7, 9, 227, 118, 7, 9, 227, 119, 7, - 9, 227, 120, 7, 9, 227, 121, 7, 9, 227, 122, 7, 9, 227, 123, 7, 9, 227, - 124, 7, 9, 227, 125, 7, 9, 227, 126, 7, 9, 227, 127, 7, 9, 227, 128, 7, - 9, 227, 129, 7, 9, 227, 130, 7, 9, 227, 131, 7, 9, 227, 132, 7, 9, 227, - 133, 7, 9, 227, 134, 7, 9, 227, 135, 7, 9, 227, 136, 7, 9, 227, 137, 7, - 9, 227, 138, 7, 9, 227, 139, 7, 9, 227, 140, 7, 9, 227, 141, 7, 9, 227, - 142, 7, 9, 227, 143, 7, 9, 227, 144, 7, 9, 227, 145, 7, 9, 227, 146, 7, - 9, 227, 147, 7, 9, 227, 148, 7, 9, 227, 149, 7, 9, 227, 150, 7, 9, 227, - 151, 7, 9, 227, 152, 7, 9, 227, 153, 7, 9, 227, 154, 7, 9, 227, 155, 7, - 9, 227, 156, 7, 9, 227, 157, 7, 9, 227, 158, 7, 9, 227, 159, 7, 9, 227, - 160, 7, 9, 227, 161, 7, 9, 227, 162, 7, 9, 227, 163, 7, 9, 227, 164, 7, - 9, 227, 165, 7, 9, 227, 166, 7, 9, 227, 167, 7, 9, 227, 168, 7, 9, 227, - 169, 7, 9, 227, 170, 7, 9, 227, 171, 7, 9, 227, 172, 7, 9, 227, 173, 7, - 9, 227, 174, 7, 9, 227, 175, 7, 9, 227, 176, 7, 9, 227, 177, 7, 9, 227, - 178, 7, 9, 227, 179, 7, 9, 227, 180, 7, 9, 227, 181, 7, 9, 227, 182, 7, - 9, 227, 183, 7, 9, 227, 184, 7, 9, 227, 185, 7, 9, 227, 186, 7, 9, 227, - 187, 7, 9, 227, 188, 7, 9, 227, 189, 7, 9, 227, 190, 7, 9, 227, 191, 7, - 9, 227, 192, 7, 9, 227, 193, 7, 9, 227, 194, 7, 9, 227, 195, 7, 9, 227, - 196, 7, 9, 227, 197, 7, 9, 227, 198, 7, 9, 227, 199, 7, 9, 227, 200, 7, - 9, 227, 201, 7, 9, 227, 202, 7, 9, 227, 203, 7, 9, 227, 204, 7, 9, 227, - 205, 7, 9, 227, 206, 7, 9, 227, 207, 7, 9, 227, 208, 7, 9, 227, 209, 7, - 9, 227, 210, 7, 9, 227, 211, 7, 9, 227, 212, 7, 9, 227, 213, 7, 9, 227, - 214, 7, 9, 227, 215, 7, 9, 227, 216, 7, 9, 227, 217, 7, 9, 227, 218, 7, - 9, 227, 219, 7, 9, 227, 220, 7, 9, 227, 221, 7, 9, 227, 222, 7, 9, 227, - 223, 7, 9, 227, 224, 7, 9, 227, 225, 7, 9, 227, 226, 7, 9, 227, 227, 7, - 9, 227, 228, 7, 9, 227, 229, 7, 9, 227, 230, 7, 9, 227, 231, 7, 9, 227, - 232, 7, 9, 227, 233, 7, 9, 227, 234, 7, 9, 227, 235, 7, 9, 227, 236, 7, - 9, 227, 237, 7, 9, 227, 238, 7, 9, 227, 239, 7, 9, 227, 240, 7, 9, 227, - 241, 7, 9, 227, 242, 7, 9, 227, 243, 7, 9, 227, 244, 7, 9, 227, 245, 7, - 9, 227, 246, 7, 9, 227, 247, 7, 9, 227, 248, 7, 9, 227, 249, 7, 9, 227, - 250, 7, 9, 227, 251, 7, 9, 227, 252, 7, 9, 227, 253, 7, 9, 227, 254, 7, - 9, 227, 255, 7, 9, 228, 0, 7, 9, 228, 1, 7, 9, 228, 2, 7, 9, 228, 3, 7, - 9, 228, 4, 7, 9, 228, 5, 7, 9, 228, 6, 7, 9, 228, 7, 7, 9, 228, 8, 7, 9, - 228, 9, 7, 9, 228, 10, 7, 9, 228, 11, 7, 9, 228, 12, 7, 9, 228, 13, 7, 9, - 228, 14, 7, 9, 228, 15, 7, 9, 228, 16, 7, 9, 228, 17, 7, 9, 228, 18, 7, - 9, 228, 19, 7, 9, 228, 20, 7, 9, 228, 21, 7, 9, 228, 22, 7, 9, 228, 23, - 7, 9, 228, 24, 7, 9, 228, 25, 7, 9, 228, 26, 7, 9, 228, 27, 7, 9, 228, - 28, 7, 9, 228, 29, 7, 9, 228, 30, 7, 9, 228, 31, 7, 9, 228, 32, 7, 9, - 228, 33, 7, 9, 228, 34, 7, 9, 228, 35, 7, 9, 228, 36, 7, 9, 228, 37, 7, - 9, 228, 38, 7, 9, 228, 39, 7, 9, 228, 40, 7, 9, 228, 41, 7, 9, 228, 42, - 7, 9, 228, 43, 7, 9, 228, 44, 7, 9, 228, 45, 7, 9, 228, 46, 7, 9, 228, - 47, 7, 9, 228, 48, 7, 9, 228, 49, 7, 9, 228, 50, 7, 9, 228, 51, 7, 9, - 228, 52, 7, 9, 228, 53, 7, 9, 228, 54, 7, 9, 228, 55, 7, 9, 228, 56, 7, - 9, 228, 57, 7, 9, 228, 58, 7, 9, 228, 59, 7, 9, 228, 60, 7, 9, 228, 61, - 7, 9, 228, 62, 7, 9, 228, 63, 7, 9, 228, 64, 7, 9, 228, 65, 7, 9, 228, - 66, 7, 9, 228, 67, 7, 9, 228, 68, 7, 9, 228, 69, 7, 9, 228, 70, 7, 9, - 228, 71, 7, 9, 228, 72, 7, 9, 228, 73, 7, 9, 228, 74, 7, 9, 228, 75, 7, - 9, 228, 76, 7, 9, 228, 77, 7, 9, 228, 78, 7, 9, 228, 79, 7, 9, 228, 80, - 7, 9, 228, 81, 7, 9, 228, 82, 7, 9, 228, 83, 7, 9, 228, 84, 7, 9, 228, - 85, 7, 9, 228, 86, 7, 9, 228, 87, 7, 9, 228, 88, 7, 9, 228, 89, 7, 9, - 228, 90, 7, 9, 228, 91, 7, 9, 228, 92, 7, 9, 228, 93, 7, 9, 228, 94, 7, - 9, 228, 95, 7, 9, 228, 96, 7, 9, 228, 97, 7, 9, 228, 98, 7, 9, 228, 99, - 7, 9, 228, 100, 7, 9, 228, 101, 7, 9, 228, 102, 7, 9, 228, 103, 7, 9, - 228, 104, 7, 9, 228, 105, 7, 9, 228, 106, 7, 9, 228, 107, 7, 9, 228, 108, - 7, 9, 228, 109, 7, 9, 228, 110, 7, 9, 228, 111, 7, 9, 228, 112, 7, 9, - 228, 113, 7, 9, 228, 114, 7, 9, 228, 115, 7, 9, 228, 116, 7, 9, 228, 117, - 7, 9, 228, 118, 7, 9, 228, 119, 7, 9, 228, 120, 7, 9, 228, 121, 7, 9, - 228, 122, 7, 9, 228, 123, 7, 9, 228, 124, 7, 9, 228, 125, 7, 9, 228, 126, - 7, 9, 228, 127, 7, 9, 228, 128, 7, 9, 228, 129, 7, 9, 228, 130, 7, 9, - 228, 131, 7, 9, 228, 132, 7, 9, 228, 133, 7, 9, 228, 134, 7, 9, 228, 135, - 7, 9, 228, 136, 7, 9, 228, 137, 7, 9, 228, 138, 7, 9, 228, 139, 7, 9, - 228, 140, 7, 9, 228, 141, 7, 9, 228, 142, 7, 9, 228, 143, 7, 9, 228, 144, - 7, 9, 228, 145, 7, 9, 228, 146, 7, 9, 228, 147, 7, 9, 228, 148, 7, 9, - 228, 149, 7, 9, 228, 150, 7, 9, 228, 151, 7, 9, 228, 152, 7, 9, 228, 153, - 7, 9, 228, 154, 7, 9, 228, 155, 7, 9, 228, 156, 7, 9, 228, 157, 7, 9, - 228, 158, 7, 9, 228, 159, 7, 9, 228, 160, 7, 9, 228, 161, 7, 9, 228, 162, - 7, 9, 228, 163, 7, 9, 228, 164, 7, 9, 228, 165, 7, 9, 228, 166, 7, 9, - 228, 167, 7, 9, 228, 168, 7, 9, 228, 169, 7, 9, 228, 170, 7, 9, 228, 171, - 7, 9, 228, 172, 7, 9, 228, 173, 7, 9, 228, 174, 7, 9, 228, 175, 7, 9, - 228, 176, 7, 9, 228, 177, 7, 9, 228, 178, 7, 9, 228, 179, 7, 9, 228, 180, - 7, 9, 228, 181, 7, 9, 228, 182, 7, 9, 228, 183, 7, 9, 228, 184, 7, 9, - 228, 185, 7, 9, 228, 186, 7, 9, 228, 187, 7, 9, 228, 188, 7, 9, 228, 189, - 7, 9, 228, 190, 7, 9, 228, 191, 7, 9, 228, 192, 7, 9, 228, 193, 7, 9, - 228, 194, 7, 9, 228, 195, 7, 9, 228, 196, 7, 9, 228, 197, 7, 9, 228, 198, - 7, 9, 228, 199, 7, 9, 228, 200, 7, 9, 228, 201, 7, 9, 228, 202, 7, 9, - 228, 203, 7, 9, 228, 204, 7, 9, 228, 205, 7, 9, 228, 206, 7, 9, 228, 207, - 7, 9, 228, 208, 7, 9, 228, 209, 7, 9, 228, 210, 7, 9, 228, 211, 7, 9, - 228, 212, 7, 9, 228, 213, 7, 9, 228, 214, 7, 9, 228, 215, 7, 9, 228, 216, - 7, 9, 228, 217, 7, 9, 228, 218, 7, 9, 228, 219, 7, 9, 228, 220, 7, 9, - 228, 221, 7, 9, 228, 222, 7, 9, 228, 223, 7, 9, 228, 224, 7, 9, 228, 225, - 7, 9, 228, 226, 7, 9, 228, 227, 7, 9, 228, 228, 7, 9, 228, 229, 7, 9, - 228, 230, 7, 9, 228, 231, 7, 9, 228, 232, 7, 9, 228, 233, 7, 9, 228, 234, - 7, 9, 228, 235, 7, 9, 228, 236, 7, 9, 228, 237, 7, 9, 228, 238, 7, 9, - 228, 239, 7, 9, 228, 240, 7, 9, 228, 241, 7, 9, 228, 242, 7, 9, 228, 243, - 7, 9, 228, 244, 7, 9, 228, 245, 7, 9, 228, 246, 7, 9, 228, 247, 7, 9, - 228, 248, 7, 9, 228, 249, 7, 9, 228, 250, 7, 9, 228, 251, 7, 9, 228, 252, - 7, 9, 228, 253, 7, 9, 228, 254, 7, 9, 228, 255, 7, 9, 229, 0, 7, 9, 229, - 1, 7, 9, 229, 2, 7, 9, 229, 3, 7, 9, 229, 4, 7, 9, 229, 5, 7, 9, 229, 6, - 7, 9, 229, 7, 7, 9, 229, 8, 7, 9, 229, 9, 7, 9, 229, 10, 7, 9, 229, 11, - 7, 9, 229, 12, 7, 9, 229, 13, 7, 9, 229, 14, 7, 9, 229, 15, 7, 9, 229, - 16, 7, 9, 229, 17, 7, 9, 229, 18, 7, 9, 229, 19, 7, 9, 229, 20, 7, 9, - 229, 21, 7, 9, 229, 22, 7, 9, 229, 23, 7, 9, 229, 24, 7, 9, 229, 25, 7, - 9, 229, 26, 7, 9, 229, 27, 7, 9, 229, 28, 7, 9, 229, 29, 7, 9, 229, 30, - 7, 9, 229, 31, 7, 9, 229, 32, 7, 9, 229, 33, 7, 9, 229, 34, 7, 9, 229, - 35, 7, 9, 229, 36, 7, 9, 229, 37, 7, 9, 229, 38, 7, 9, 229, 39, 7, 9, - 229, 40, 7, 9, 229, 41, 7, 9, 229, 42, 7, 9, 229, 43, 7, 9, 229, 44, 7, - 9, 229, 45, 237, 194, 249, 173, 97, 240, 15, 97, 233, 54, 69, 97, 235, - 51, 69, 97, 61, 52, 97, 240, 114, 52, 97, 238, 107, 52, 97, 234, 17, 97, - 233, 59, 97, 40, 232, 74, 97, 38, 232, 74, 97, 235, 52, 97, 248, 49, 52, - 97, 240, 27, 97, 231, 94, 97, 248, 37, 208, 97, 236, 177, 97, 26, 242, - 217, 97, 26, 127, 97, 26, 111, 97, 26, 166, 97, 26, 177, 97, 26, 176, 97, - 26, 187, 97, 26, 203, 97, 26, 195, 97, 26, 202, 97, 240, 24, 97, 234, 14, - 97, 235, 44, 52, 97, 240, 7, 52, 97, 232, 68, 52, 97, 236, 156, 69, 97, - 234, 20, 254, 20, 97, 8, 5, 1, 67, 97, 8, 5, 1, 217, 97, 8, 5, 1, 255, - 18, 97, 8, 5, 1, 209, 97, 8, 5, 1, 72, 97, 8, 5, 1, 255, 19, 97, 8, 5, 1, - 210, 97, 8, 5, 1, 192, 97, 8, 5, 1, 71, 97, 8, 5, 1, 221, 97, 8, 5, 1, - 255, 15, 97, 8, 5, 1, 162, 97, 8, 5, 1, 173, 97, 8, 5, 1, 197, 97, 8, 5, - 1, 73, 97, 8, 5, 1, 223, 97, 8, 5, 1, 255, 20, 97, 8, 5, 1, 144, 97, 8, + 5, 223, 10, 160, 5, 235, 93, 10, 160, 5, 144, 10, 160, 5, 193, 10, 160, + 5, 214, 10, 160, 5, 79, 10, 160, 5, 179, 10, 160, 5, 228, 144, 10, 160, + 5, 206, 10, 160, 5, 228, 7, 10, 160, 5, 227, 103, 10, 160, 3, 67, 10, + 160, 3, 217, 10, 160, 3, 252, 178, 10, 160, 3, 209, 10, 160, 3, 72, 10, + 160, 3, 248, 140, 10, 160, 3, 210, 10, 160, 3, 192, 10, 160, 3, 71, 10, + 160, 3, 221, 10, 160, 3, 241, 12, 10, 160, 3, 162, 10, 160, 3, 173, 10, + 160, 3, 197, 10, 160, 3, 73, 10, 160, 3, 223, 10, 160, 3, 235, 93, 10, + 160, 3, 144, 10, 160, 3, 193, 10, 160, 3, 214, 10, 160, 3, 79, 10, 160, + 3, 179, 10, 160, 3, 228, 144, 10, 160, 3, 206, 10, 160, 3, 228, 7, 10, + 160, 3, 227, 103, 10, 24, 3, 250, 99, 71, 10, 24, 3, 250, 99, 221, 10, + 16, 5, 255, 21, 10, 16, 5, 253, 53, 10, 16, 5, 247, 195, 10, 16, 5, 250, + 229, 10, 16, 5, 248, 204, 10, 16, 5, 227, 79, 10, 16, 5, 248, 177, 10, + 16, 5, 230, 60, 10, 16, 5, 241, 137, 10, 16, 5, 240, 245, 10, 16, 5, 240, + 23, 10, 16, 5, 238, 141, 10, 16, 5, 237, 83, 10, 16, 5, 228, 46, 10, 16, + 5, 236, 214, 10, 16, 5, 236, 8, 10, 16, 5, 234, 147, 10, 16, 5, 230, 61, + 91, 10, 16, 5, 232, 41, 10, 16, 5, 230, 146, 10, 16, 5, 228, 252, 10, 16, + 5, 236, 25, 10, 16, 5, 252, 63, 10, 16, 5, 235, 134, 10, 16, 5, 236, 216, + 10, 16, 238, 85, 10, 16, 3, 255, 21, 10, 16, 3, 253, 53, 10, 16, 3, 247, + 195, 10, 16, 3, 250, 229, 10, 16, 3, 248, 204, 10, 16, 3, 227, 79, 10, + 16, 3, 248, 177, 10, 16, 3, 230, 60, 10, 16, 3, 241, 137, 10, 16, 3, 240, + 245, 10, 16, 3, 240, 23, 10, 16, 3, 238, 141, 10, 16, 3, 237, 83, 10, 16, + 3, 228, 46, 10, 16, 3, 236, 214, 10, 16, 3, 236, 8, 10, 16, 3, 234, 147, + 10, 16, 3, 30, 232, 41, 10, 16, 3, 232, 41, 10, 16, 3, 230, 146, 10, 16, + 3, 228, 252, 10, 16, 3, 236, 25, 10, 16, 3, 252, 63, 10, 16, 3, 235, 134, + 10, 16, 3, 236, 216, 10, 16, 236, 102, 250, 179, 10, 16, 248, 205, 91, + 10, 16, 230, 61, 91, 10, 16, 240, 246, 91, 10, 16, 236, 26, 91, 10, 16, + 234, 148, 91, 10, 16, 236, 9, 91, 10, 24, 5, 255, 21, 10, 24, 5, 253, 53, + 10, 24, 5, 247, 195, 10, 24, 5, 250, 229, 10, 24, 5, 248, 204, 10, 24, 5, + 227, 79, 10, 24, 5, 248, 177, 10, 24, 5, 230, 60, 10, 24, 5, 241, 137, + 10, 24, 5, 240, 245, 10, 24, 5, 240, 23, 10, 24, 5, 238, 141, 10, 24, 5, + 237, 83, 10, 24, 5, 228, 46, 10, 24, 5, 236, 214, 10, 24, 5, 236, 8, 10, + 24, 5, 234, 147, 10, 24, 5, 230, 61, 91, 10, 24, 5, 232, 41, 10, 24, 5, + 230, 146, 10, 24, 5, 228, 252, 10, 24, 5, 236, 25, 10, 24, 5, 252, 63, + 10, 24, 5, 235, 134, 10, 24, 5, 236, 216, 10, 24, 238, 85, 10, 24, 3, + 255, 21, 10, 24, 3, 253, 53, 10, 24, 3, 247, 195, 10, 24, 3, 250, 229, + 10, 24, 3, 248, 204, 10, 24, 3, 227, 79, 10, 24, 3, 248, 177, 10, 24, 3, + 230, 60, 10, 24, 3, 241, 137, 10, 24, 3, 240, 245, 10, 24, 3, 240, 23, + 10, 24, 3, 238, 141, 10, 24, 3, 237, 83, 10, 24, 3, 228, 46, 10, 24, 3, + 236, 214, 10, 24, 3, 236, 8, 10, 24, 3, 234, 147, 10, 24, 3, 30, 232, 41, + 10, 24, 3, 232, 41, 10, 24, 3, 230, 146, 10, 24, 3, 228, 252, 10, 24, 3, + 236, 25, 10, 24, 3, 252, 63, 10, 24, 3, 235, 134, 10, 24, 3, 236, 216, + 10, 24, 236, 102, 250, 179, 10, 24, 248, 205, 91, 10, 24, 230, 61, 91, + 10, 24, 240, 246, 91, 10, 24, 236, 26, 91, 10, 24, 234, 148, 91, 10, 24, + 236, 9, 91, 10, 16, 24, 5, 255, 21, 10, 16, 24, 5, 253, 53, 10, 16, 24, + 5, 247, 195, 10, 16, 24, 5, 250, 229, 10, 16, 24, 5, 248, 204, 10, 16, + 24, 5, 227, 79, 10, 16, 24, 5, 248, 177, 10, 16, 24, 5, 230, 60, 10, 16, + 24, 5, 241, 137, 10, 16, 24, 5, 240, 245, 10, 16, 24, 5, 240, 23, 10, 16, + 24, 5, 238, 141, 10, 16, 24, 5, 237, 83, 10, 16, 24, 5, 228, 46, 10, 16, + 24, 5, 236, 214, 10, 16, 24, 5, 236, 8, 10, 16, 24, 5, 234, 147, 10, 16, + 24, 5, 230, 61, 91, 10, 16, 24, 5, 232, 41, 10, 16, 24, 5, 230, 146, 10, + 16, 24, 5, 228, 252, 10, 16, 24, 5, 236, 25, 10, 16, 24, 5, 252, 63, 10, + 16, 24, 5, 235, 134, 10, 16, 24, 5, 236, 216, 10, 16, 24, 238, 85, 10, + 16, 24, 3, 255, 21, 10, 16, 24, 3, 253, 53, 10, 16, 24, 3, 247, 195, 10, + 16, 24, 3, 250, 229, 10, 16, 24, 3, 248, 204, 10, 16, 24, 3, 227, 79, 10, + 16, 24, 3, 248, 177, 10, 16, 24, 3, 230, 60, 10, 16, 24, 3, 241, 137, 10, + 16, 24, 3, 240, 245, 10, 16, 24, 3, 240, 23, 10, 16, 24, 3, 238, 141, 10, + 16, 24, 3, 237, 83, 10, 16, 24, 3, 228, 46, 10, 16, 24, 3, 236, 214, 10, + 16, 24, 3, 236, 8, 10, 16, 24, 3, 234, 147, 10, 16, 24, 3, 30, 232, 41, + 10, 16, 24, 3, 232, 41, 10, 16, 24, 3, 230, 146, 10, 16, 24, 3, 228, 252, + 10, 16, 24, 3, 236, 25, 10, 16, 24, 3, 252, 63, 10, 16, 24, 3, 235, 134, + 10, 16, 24, 3, 236, 216, 10, 16, 24, 236, 102, 250, 179, 10, 16, 24, 248, + 205, 91, 10, 16, 24, 230, 61, 91, 10, 16, 24, 240, 246, 91, 10, 16, 24, + 236, 26, 91, 10, 16, 24, 234, 148, 91, 10, 16, 24, 236, 9, 91, 10, 27, + 16, 5, 255, 21, 10, 27, 16, 5, 253, 53, 10, 27, 16, 5, 247, 195, 10, 27, + 16, 5, 250, 229, 10, 27, 16, 5, 248, 204, 10, 27, 16, 5, 227, 79, 10, 27, + 16, 5, 248, 177, 10, 27, 16, 5, 230, 60, 10, 27, 16, 5, 241, 137, 10, 27, + 16, 5, 240, 245, 10, 27, 16, 5, 240, 23, 10, 27, 16, 5, 238, 141, 10, 27, + 16, 5, 237, 83, 10, 27, 16, 5, 228, 46, 10, 27, 16, 5, 236, 214, 10, 27, + 16, 5, 236, 8, 10, 27, 16, 5, 234, 147, 10, 27, 16, 5, 230, 61, 91, 10, + 27, 16, 5, 232, 41, 10, 27, 16, 5, 230, 146, 10, 27, 16, 5, 228, 252, 10, + 27, 16, 5, 236, 25, 10, 27, 16, 5, 252, 63, 10, 27, 16, 5, 235, 134, 10, + 27, 16, 5, 236, 216, 10, 27, 16, 238, 85, 10, 27, 16, 3, 255, 21, 10, 27, + 16, 3, 253, 53, 10, 27, 16, 3, 247, 195, 10, 27, 16, 3, 250, 229, 10, 27, + 16, 3, 248, 204, 10, 27, 16, 3, 227, 79, 10, 27, 16, 3, 248, 177, 10, 27, + 16, 3, 230, 60, 10, 27, 16, 3, 241, 137, 10, 27, 16, 3, 240, 245, 10, 27, + 16, 3, 240, 23, 10, 27, 16, 3, 238, 141, 10, 27, 16, 3, 237, 83, 10, 27, + 16, 3, 228, 46, 10, 27, 16, 3, 236, 214, 10, 27, 16, 3, 236, 8, 10, 27, + 16, 3, 234, 147, 10, 27, 16, 3, 30, 232, 41, 10, 27, 16, 3, 232, 41, 10, + 27, 16, 3, 230, 146, 10, 27, 16, 3, 228, 252, 10, 27, 16, 3, 236, 25, 10, + 27, 16, 3, 252, 63, 10, 27, 16, 3, 235, 134, 10, 27, 16, 3, 236, 216, 10, + 27, 16, 236, 102, 250, 179, 10, 27, 16, 248, 205, 91, 10, 27, 16, 230, + 61, 91, 10, 27, 16, 240, 246, 91, 10, 27, 16, 236, 26, 91, 10, 27, 16, + 234, 148, 91, 10, 27, 16, 236, 9, 91, 10, 27, 16, 24, 5, 255, 21, 10, 27, + 16, 24, 5, 253, 53, 10, 27, 16, 24, 5, 247, 195, 10, 27, 16, 24, 5, 250, + 229, 10, 27, 16, 24, 5, 248, 204, 10, 27, 16, 24, 5, 227, 79, 10, 27, 16, + 24, 5, 248, 177, 10, 27, 16, 24, 5, 230, 60, 10, 27, 16, 24, 5, 241, 137, + 10, 27, 16, 24, 5, 240, 245, 10, 27, 16, 24, 5, 240, 23, 10, 27, 16, 24, + 5, 238, 141, 10, 27, 16, 24, 5, 237, 83, 10, 27, 16, 24, 5, 228, 46, 10, + 27, 16, 24, 5, 236, 214, 10, 27, 16, 24, 5, 236, 8, 10, 27, 16, 24, 5, + 234, 147, 10, 27, 16, 24, 5, 230, 61, 91, 10, 27, 16, 24, 5, 232, 41, 10, + 27, 16, 24, 5, 230, 146, 10, 27, 16, 24, 5, 228, 252, 10, 27, 16, 24, 5, + 236, 25, 10, 27, 16, 24, 5, 252, 63, 10, 27, 16, 24, 5, 235, 134, 10, 27, + 16, 24, 5, 236, 216, 10, 27, 16, 24, 238, 85, 10, 27, 16, 24, 3, 255, 21, + 10, 27, 16, 24, 3, 253, 53, 10, 27, 16, 24, 3, 247, 195, 10, 27, 16, 24, + 3, 250, 229, 10, 27, 16, 24, 3, 248, 204, 10, 27, 16, 24, 3, 227, 79, 10, + 27, 16, 24, 3, 248, 177, 10, 27, 16, 24, 3, 230, 60, 10, 27, 16, 24, 3, + 241, 137, 10, 27, 16, 24, 3, 240, 245, 10, 27, 16, 24, 3, 240, 23, 10, + 27, 16, 24, 3, 238, 141, 10, 27, 16, 24, 3, 237, 83, 10, 27, 16, 24, 3, + 228, 46, 10, 27, 16, 24, 3, 236, 214, 10, 27, 16, 24, 3, 236, 8, 10, 27, + 16, 24, 3, 234, 147, 10, 27, 16, 24, 3, 30, 232, 41, 10, 27, 16, 24, 3, + 232, 41, 10, 27, 16, 24, 3, 230, 146, 10, 27, 16, 24, 3, 228, 252, 10, + 27, 16, 24, 3, 236, 25, 10, 27, 16, 24, 3, 252, 63, 10, 27, 16, 24, 3, + 235, 134, 10, 27, 16, 24, 3, 236, 216, 10, 27, 16, 24, 236, 102, 250, + 179, 10, 27, 16, 24, 248, 205, 91, 10, 27, 16, 24, 230, 61, 91, 10, 27, + 16, 24, 240, 246, 91, 10, 27, 16, 24, 236, 26, 91, 10, 27, 16, 24, 234, + 148, 91, 10, 27, 16, 24, 236, 9, 91, 10, 16, 26, 227, 80, 10, 16, 26, + 127, 10, 16, 26, 111, 10, 16, 26, 166, 10, 16, 26, 177, 10, 16, 26, 176, + 10, 16, 26, 187, 10, 16, 26, 203, 10, 16, 26, 195, 10, 16, 26, 202, 10, + 138, 26, 227, 80, 10, 138, 26, 127, 10, 138, 26, 111, 10, 138, 26, 166, + 10, 138, 26, 177, 10, 138, 26, 176, 10, 138, 26, 187, 10, 138, 26, 203, + 10, 138, 26, 195, 10, 138, 26, 202, 10, 27, 26, 227, 80, 10, 27, 26, 127, + 10, 27, 26, 111, 10, 27, 26, 166, 10, 27, 26, 177, 10, 27, 26, 176, 10, + 27, 26, 187, 10, 27, 26, 203, 10, 27, 26, 195, 10, 27, 26, 202, 10, 27, + 16, 26, 227, 80, 10, 27, 16, 26, 127, 10, 27, 16, 26, 111, 10, 27, 16, + 26, 166, 10, 27, 16, 26, 177, 10, 27, 16, 26, 176, 10, 27, 16, 26, 187, + 10, 27, 16, 26, 203, 10, 27, 16, 26, 195, 10, 27, 16, 26, 202, 10, 160, + 26, 227, 80, 10, 160, 26, 127, 10, 160, 26, 111, 10, 160, 26, 166, 10, + 160, 26, 177, 10, 160, 26, 176, 10, 160, 26, 187, 10, 160, 26, 203, 10, + 160, 26, 195, 10, 160, 26, 202, 7, 9, 245, 217, 7, 9, 245, 216, 7, 9, + 245, 215, 7, 9, 245, 214, 7, 9, 245, 213, 7, 9, 245, 212, 7, 9, 245, 211, + 7, 9, 245, 210, 7, 9, 245, 209, 7, 9, 245, 208, 7, 9, 245, 207, 7, 9, + 245, 206, 7, 9, 245, 205, 7, 9, 245, 204, 7, 9, 245, 203, 7, 9, 245, 202, + 7, 9, 245, 201, 7, 9, 245, 200, 7, 9, 245, 199, 7, 9, 245, 198, 7, 9, + 245, 197, 7, 9, 245, 196, 7, 9, 245, 195, 7, 9, 245, 194, 7, 9, 245, 193, + 7, 9, 245, 192, 7, 9, 245, 191, 7, 9, 245, 190, 7, 9, 245, 189, 7, 9, + 245, 188, 7, 9, 245, 187, 7, 9, 245, 186, 7, 9, 245, 185, 7, 9, 245, 184, + 7, 9, 245, 183, 7, 9, 245, 182, 7, 9, 245, 181, 7, 9, 245, 180, 7, 9, + 245, 179, 7, 9, 245, 178, 7, 9, 245, 177, 7, 9, 245, 176, 7, 9, 245, 175, + 7, 9, 245, 174, 7, 9, 245, 173, 7, 9, 245, 172, 7, 9, 245, 171, 7, 9, + 245, 170, 7, 9, 245, 169, 7, 9, 245, 168, 7, 9, 245, 167, 7, 9, 245, 166, + 7, 9, 245, 165, 7, 9, 245, 164, 7, 9, 245, 163, 7, 9, 245, 162, 7, 9, + 245, 161, 7, 9, 245, 160, 7, 9, 245, 159, 7, 9, 245, 158, 7, 9, 245, 157, + 7, 9, 245, 156, 7, 9, 245, 155, 7, 9, 245, 154, 7, 9, 245, 153, 7, 9, + 245, 152, 7, 9, 245, 151, 7, 9, 245, 150, 7, 9, 245, 149, 7, 9, 245, 148, + 7, 9, 245, 147, 7, 9, 245, 146, 7, 9, 245, 145, 7, 9, 245, 144, 7, 9, + 245, 143, 7, 9, 245, 142, 7, 9, 245, 141, 7, 9, 245, 140, 7, 9, 245, 139, + 7, 9, 245, 138, 7, 9, 245, 137, 7, 9, 245, 136, 7, 9, 245, 135, 7, 9, + 245, 134, 7, 9, 245, 133, 7, 9, 245, 132, 7, 9, 245, 131, 7, 9, 245, 130, + 7, 9, 245, 129, 7, 9, 245, 128, 7, 9, 245, 127, 7, 9, 245, 126, 7, 9, + 245, 125, 7, 9, 245, 124, 7, 9, 245, 123, 7, 9, 245, 122, 7, 9, 245, 121, + 7, 9, 245, 120, 7, 9, 245, 119, 7, 9, 245, 118, 7, 9, 245, 117, 7, 9, + 245, 116, 7, 9, 245, 115, 7, 9, 245, 114, 7, 9, 245, 113, 7, 9, 245, 112, + 7, 9, 245, 111, 7, 9, 245, 110, 7, 9, 245, 109, 7, 9, 245, 108, 7, 9, + 245, 107, 7, 9, 245, 106, 7, 9, 245, 105, 7, 9, 245, 104, 7, 9, 245, 103, + 7, 9, 245, 102, 7, 9, 245, 101, 7, 9, 245, 100, 7, 9, 245, 99, 7, 9, 245, + 98, 7, 9, 245, 97, 7, 9, 245, 96, 7, 9, 245, 95, 7, 9, 245, 94, 7, 9, + 245, 93, 7, 9, 245, 92, 7, 9, 245, 91, 7, 9, 245, 90, 7, 9, 245, 89, 7, + 9, 245, 88, 7, 9, 245, 87, 7, 9, 245, 86, 7, 9, 245, 85, 7, 9, 245, 84, + 7, 9, 245, 83, 7, 9, 245, 82, 7, 9, 245, 81, 7, 9, 245, 80, 7, 9, 245, + 79, 7, 9, 245, 78, 7, 9, 245, 77, 7, 9, 245, 76, 7, 9, 245, 75, 7, 9, + 245, 74, 7, 9, 245, 73, 7, 9, 245, 72, 7, 9, 245, 71, 7, 9, 245, 70, 7, + 9, 245, 69, 7, 9, 245, 68, 7, 9, 245, 67, 7, 9, 245, 66, 7, 9, 245, 65, + 7, 9, 245, 64, 7, 9, 245, 63, 7, 9, 245, 62, 7, 9, 245, 61, 7, 9, 245, + 60, 7, 9, 245, 59, 7, 9, 245, 58, 7, 9, 245, 57, 7, 9, 245, 56, 7, 9, + 245, 55, 7, 9, 245, 54, 7, 9, 245, 53, 7, 9, 245, 52, 7, 9, 245, 51, 7, + 9, 245, 50, 7, 9, 245, 49, 7, 9, 245, 48, 7, 9, 245, 47, 7, 9, 245, 46, + 7, 9, 245, 45, 7, 9, 245, 44, 7, 9, 245, 43, 7, 9, 245, 42, 7, 9, 245, + 41, 7, 9, 245, 40, 7, 9, 245, 39, 7, 9, 245, 38, 7, 9, 245, 37, 7, 9, + 245, 36, 7, 9, 245, 35, 7, 9, 245, 34, 7, 9, 245, 33, 7, 9, 245, 32, 7, + 9, 245, 31, 7, 9, 245, 30, 7, 9, 245, 29, 7, 9, 245, 28, 7, 9, 245, 27, + 7, 9, 245, 26, 7, 9, 245, 25, 7, 9, 245, 24, 7, 9, 245, 23, 7, 9, 245, + 22, 7, 9, 245, 21, 7, 9, 245, 20, 7, 9, 245, 19, 7, 9, 245, 18, 7, 9, + 245, 17, 7, 9, 245, 16, 7, 9, 245, 15, 7, 9, 245, 14, 7, 9, 245, 13, 7, + 9, 245, 12, 7, 9, 245, 11, 7, 9, 245, 10, 7, 9, 245, 9, 7, 9, 245, 8, 7, + 9, 245, 7, 7, 9, 245, 6, 7, 9, 245, 5, 7, 9, 245, 4, 7, 9, 245, 3, 7, 9, + 245, 2, 7, 9, 245, 1, 7, 9, 245, 0, 7, 9, 244, 255, 7, 9, 244, 254, 7, 9, + 244, 253, 7, 9, 244, 252, 7, 9, 244, 251, 7, 9, 244, 250, 7, 9, 244, 249, + 7, 9, 244, 248, 7, 9, 244, 247, 7, 9, 244, 246, 7, 9, 244, 245, 7, 9, + 244, 244, 7, 9, 244, 243, 7, 9, 244, 242, 7, 9, 244, 241, 7, 9, 244, 240, + 7, 9, 244, 239, 7, 9, 244, 238, 7, 9, 244, 237, 7, 9, 244, 236, 7, 9, + 244, 235, 7, 9, 244, 234, 7, 9, 244, 233, 7, 9, 244, 232, 7, 9, 244, 231, + 7, 9, 244, 230, 7, 9, 244, 229, 7, 9, 244, 228, 7, 9, 244, 227, 7, 9, + 244, 226, 7, 9, 244, 225, 7, 9, 244, 224, 7, 9, 244, 223, 7, 9, 244, 222, + 7, 9, 244, 221, 7, 9, 244, 220, 7, 9, 244, 219, 7, 9, 244, 218, 7, 9, + 244, 217, 7, 9, 244, 216, 7, 9, 244, 215, 7, 9, 244, 214, 7, 9, 244, 213, + 7, 9, 244, 212, 7, 9, 244, 211, 7, 9, 244, 210, 7, 9, 244, 209, 7, 9, + 244, 208, 7, 9, 244, 207, 7, 9, 244, 206, 7, 9, 244, 205, 7, 9, 244, 204, + 7, 9, 244, 203, 7, 9, 244, 202, 7, 9, 244, 201, 7, 9, 244, 200, 7, 9, + 244, 199, 7, 9, 244, 198, 7, 9, 244, 197, 7, 9, 244, 196, 7, 9, 244, 195, + 7, 9, 244, 194, 7, 9, 244, 193, 7, 9, 244, 192, 7, 9, 244, 191, 7, 9, + 244, 190, 7, 9, 244, 189, 7, 9, 244, 188, 7, 9, 244, 187, 7, 9, 244, 186, + 7, 9, 244, 185, 7, 9, 244, 184, 7, 9, 244, 183, 7, 9, 244, 182, 7, 9, + 244, 181, 7, 9, 244, 180, 7, 9, 244, 179, 7, 9, 244, 178, 7, 9, 244, 177, + 7, 9, 244, 176, 7, 9, 244, 175, 7, 9, 244, 174, 7, 9, 244, 173, 7, 9, + 244, 172, 7, 9, 244, 171, 7, 9, 244, 170, 7, 9, 244, 169, 7, 9, 244, 168, + 7, 9, 244, 167, 7, 9, 244, 166, 7, 9, 244, 165, 7, 9, 244, 164, 7, 9, + 244, 163, 7, 9, 244, 162, 7, 9, 244, 161, 7, 9, 244, 160, 7, 9, 244, 159, + 7, 9, 244, 158, 7, 9, 244, 157, 7, 9, 244, 156, 7, 9, 244, 155, 7, 9, + 244, 154, 7, 9, 244, 153, 7, 9, 244, 152, 7, 9, 244, 151, 7, 9, 244, 150, + 7, 9, 244, 149, 7, 9, 244, 148, 7, 9, 244, 147, 7, 9, 244, 146, 7, 9, + 244, 145, 7, 9, 244, 144, 7, 9, 244, 143, 7, 9, 244, 142, 7, 9, 244, 141, + 7, 9, 244, 140, 7, 9, 244, 139, 7, 9, 244, 138, 7, 9, 244, 137, 7, 9, + 244, 136, 7, 9, 244, 135, 7, 9, 244, 134, 7, 9, 244, 133, 7, 9, 244, 132, + 7, 9, 244, 131, 7, 9, 244, 130, 7, 9, 244, 129, 7, 9, 244, 128, 7, 9, + 244, 127, 7, 9, 244, 126, 7, 9, 244, 125, 7, 9, 244, 124, 7, 9, 244, 123, + 7, 9, 244, 122, 7, 9, 244, 121, 7, 9, 244, 120, 7, 9, 244, 119, 7, 9, + 244, 118, 7, 9, 244, 117, 7, 9, 244, 116, 7, 9, 244, 115, 7, 9, 244, 114, + 7, 9, 244, 113, 7, 9, 244, 112, 7, 9, 244, 111, 7, 9, 244, 110, 7, 9, + 244, 109, 7, 9, 244, 108, 7, 9, 244, 107, 7, 9, 244, 106, 7, 9, 244, 105, + 7, 9, 244, 104, 7, 9, 244, 103, 7, 9, 244, 102, 7, 9, 244, 101, 7, 9, + 244, 100, 7, 9, 244, 99, 7, 9, 244, 98, 7, 9, 244, 97, 7, 9, 244, 96, 7, + 9, 244, 95, 7, 9, 244, 94, 7, 9, 244, 93, 7, 9, 244, 92, 7, 9, 244, 91, + 7, 9, 244, 90, 7, 9, 244, 89, 7, 9, 244, 88, 7, 9, 244, 87, 7, 9, 244, + 86, 7, 9, 244, 85, 7, 9, 244, 84, 7, 9, 244, 83, 7, 9, 244, 82, 7, 9, + 244, 81, 7, 9, 244, 80, 7, 9, 244, 79, 7, 9, 244, 78, 7, 9, 244, 77, 7, + 9, 244, 76, 7, 9, 244, 75, 7, 9, 244, 74, 7, 9, 244, 73, 7, 9, 244, 72, + 7, 9, 244, 71, 7, 9, 244, 70, 7, 9, 244, 69, 7, 9, 244, 68, 7, 9, 244, + 67, 7, 9, 244, 66, 7, 9, 244, 65, 7, 9, 244, 64, 7, 9, 244, 63, 7, 9, + 244, 62, 7, 9, 244, 61, 7, 9, 244, 60, 7, 9, 244, 59, 7, 9, 244, 58, 7, + 9, 244, 57, 7, 9, 244, 56, 7, 9, 244, 55, 7, 9, 244, 54, 7, 9, 244, 53, + 7, 9, 244, 52, 7, 9, 244, 51, 7, 9, 244, 50, 7, 9, 244, 49, 7, 9, 244, + 48, 7, 9, 244, 47, 7, 9, 244, 46, 7, 9, 244, 45, 7, 9, 244, 44, 7, 9, + 244, 43, 7, 9, 244, 42, 7, 9, 244, 41, 7, 9, 244, 40, 7, 9, 244, 39, 7, + 9, 244, 38, 7, 9, 244, 37, 7, 9, 244, 36, 7, 9, 244, 35, 7, 9, 244, 34, + 7, 9, 244, 33, 7, 9, 244, 32, 7, 9, 244, 31, 7, 9, 244, 30, 7, 9, 244, + 29, 7, 9, 244, 28, 7, 9, 244, 27, 7, 9, 244, 26, 7, 9, 244, 25, 7, 9, + 244, 24, 7, 9, 244, 23, 7, 9, 244, 22, 7, 9, 244, 21, 7, 9, 244, 20, 7, + 9, 244, 19, 7, 9, 244, 18, 7, 9, 244, 17, 7, 9, 244, 16, 7, 9, 244, 15, + 7, 9, 244, 14, 7, 9, 244, 13, 7, 9, 244, 12, 7, 9, 244, 11, 7, 9, 244, + 10, 7, 9, 244, 9, 7, 9, 244, 8, 7, 9, 244, 7, 7, 9, 244, 6, 7, 9, 244, 5, + 7, 9, 244, 4, 7, 9, 244, 3, 7, 9, 244, 2, 7, 9, 244, 1, 7, 9, 244, 0, 7, + 9, 243, 255, 7, 9, 243, 254, 7, 9, 243, 253, 7, 9, 243, 252, 7, 9, 243, + 251, 7, 9, 243, 250, 7, 9, 243, 249, 7, 9, 243, 248, 7, 9, 243, 247, 7, + 9, 243, 246, 7, 9, 243, 245, 7, 9, 243, 244, 7, 9, 243, 243, 7, 9, 243, + 242, 7, 9, 243, 241, 7, 9, 243, 240, 7, 9, 243, 239, 7, 9, 243, 238, 7, + 9, 243, 237, 7, 9, 243, 236, 7, 9, 243, 235, 7, 9, 243, 234, 7, 9, 243, + 233, 7, 9, 243, 232, 7, 9, 243, 231, 7, 9, 243, 230, 7, 9, 243, 229, 7, + 9, 243, 228, 7, 9, 243, 227, 7, 9, 243, 226, 7, 9, 243, 225, 7, 9, 243, + 224, 7, 9, 243, 223, 7, 9, 243, 222, 7, 9, 243, 221, 7, 9, 243, 220, 7, + 9, 243, 219, 7, 9, 243, 218, 7, 9, 243, 217, 7, 9, 243, 216, 7, 9, 243, + 215, 7, 9, 243, 214, 7, 9, 243, 213, 7, 9, 243, 212, 7, 9, 243, 211, 7, + 9, 243, 210, 7, 9, 243, 209, 7, 9, 243, 208, 7, 9, 243, 207, 7, 9, 243, + 206, 7, 9, 243, 205, 7, 9, 243, 204, 7, 9, 243, 203, 7, 9, 243, 202, 7, + 9, 243, 201, 7, 9, 243, 200, 7, 9, 243, 199, 7, 9, 243, 198, 7, 9, 243, + 197, 7, 9, 243, 196, 7, 9, 243, 195, 7, 9, 243, 194, 7, 9, 243, 193, 7, + 9, 243, 192, 7, 9, 243, 191, 7, 9, 243, 190, 7, 9, 243, 189, 7, 9, 243, + 188, 240, 18, 230, 173, 97, 231, 193, 97, 248, 156, 69, 97, 235, 13, 69, + 97, 61, 52, 97, 250, 107, 52, 97, 236, 56, 52, 97, 255, 11, 97, 254, 222, + 97, 40, 236, 106, 97, 38, 236, 106, 97, 254, 159, 97, 235, 214, 52, 97, + 251, 214, 97, 245, 247, 97, 247, 231, 208, 97, 231, 208, 97, 26, 227, 80, + 97, 26, 127, 97, 26, 111, 97, 26, 166, 97, 26, 177, 97, 26, 176, 97, 26, + 187, 97, 26, 203, 97, 26, 195, 97, 26, 202, 97, 251, 219, 97, 232, 176, + 97, 239, 228, 52, 97, 248, 202, 52, 97, 247, 43, 52, 97, 235, 23, 69, 97, + 251, 213, 254, 153, 97, 8, 5, 1, 67, 97, 8, 5, 1, 217, 97, 8, 5, 1, 252, + 178, 97, 8, 5, 1, 209, 97, 8, 5, 1, 72, 97, 8, 5, 1, 248, 140, 97, 8, 5, + 1, 210, 97, 8, 5, 1, 192, 97, 8, 5, 1, 71, 97, 8, 5, 1, 221, 97, 8, 5, 1, + 241, 12, 97, 8, 5, 1, 162, 97, 8, 5, 1, 173, 97, 8, 5, 1, 197, 97, 8, 5, + 1, 73, 97, 8, 5, 1, 223, 97, 8, 5, 1, 235, 93, 97, 8, 5, 1, 144, 97, 8, 5, 1, 193, 97, 8, 5, 1, 214, 97, 8, 5, 1, 79, 97, 8, 5, 1, 179, 97, 8, 5, - 1, 255, 16, 97, 8, 5, 1, 206, 97, 8, 5, 1, 255, 14, 97, 8, 5, 1, 255, 17, - 97, 40, 31, 104, 97, 238, 75, 236, 177, 97, 38, 31, 104, 97, 190, 238, - 54, 97, 170, 242, 224, 97, 242, 245, 238, 54, 97, 8, 3, 1, 67, 97, 8, 3, - 1, 217, 97, 8, 3, 1, 255, 18, 97, 8, 3, 1, 209, 97, 8, 3, 1, 72, 97, 8, - 3, 1, 255, 19, 97, 8, 3, 1, 210, 97, 8, 3, 1, 192, 97, 8, 3, 1, 71, 97, - 8, 3, 1, 221, 97, 8, 3, 1, 255, 15, 97, 8, 3, 1, 162, 97, 8, 3, 1, 173, - 97, 8, 3, 1, 197, 97, 8, 3, 1, 73, 97, 8, 3, 1, 223, 97, 8, 3, 1, 255, - 20, 97, 8, 3, 1, 144, 97, 8, 3, 1, 193, 97, 8, 3, 1, 214, 97, 8, 3, 1, - 79, 97, 8, 3, 1, 179, 97, 8, 3, 1, 255, 16, 97, 8, 3, 1, 206, 97, 8, 3, - 1, 255, 14, 97, 8, 3, 1, 255, 17, 97, 40, 242, 225, 104, 97, 59, 242, - 224, 97, 38, 242, 225, 104, 97, 169, 241, 43, 249, 173, 34, 232, 211, 34, - 232, 212, 34, 232, 213, 34, 232, 214, 34, 232, 215, 34, 232, 216, 34, - 232, 217, 34, 232, 218, 34, 232, 219, 34, 232, 220, 34, 232, 221, 34, - 232, 222, 34, 232, 223, 34, 232, 224, 34, 232, 225, 34, 232, 226, 34, - 232, 227, 34, 232, 228, 34, 232, 229, 34, 232, 230, 34, 232, 231, 34, - 232, 232, 34, 232, 233, 34, 232, 234, 34, 232, 235, 34, 232, 236, 34, - 232, 237, 34, 232, 238, 34, 232, 239, 34, 232, 240, 34, 232, 241, 34, - 232, 242, 34, 232, 243, 34, 232, 244, 34, 232, 245, 34, 232, 246, 34, - 232, 247, 34, 232, 248, 34, 232, 249, 34, 232, 250, 34, 232, 251, 34, - 232, 252, 34, 232, 253, 34, 232, 254, 34, 232, 255, 34, 233, 0, 34, 233, - 1, 34, 233, 2, 34, 233, 3, 34, 233, 4, 34, 233, 5, 34, 233, 6, 34, 233, - 7, 34, 233, 8, 34, 233, 9, 34, 233, 10, 34, 233, 11, 34, 233, 12, 34, - 233, 13, 34, 233, 14, 34, 233, 15, 34, 233, 16, 34, 233, 17, 34, 233, 18, - 34, 233, 19, 34, 233, 20, 34, 233, 21, 34, 233, 22, 34, 233, 23, 34, 233, - 24, 34, 233, 25, 34, 233, 26, 34, 233, 27, 34, 233, 28, 34, 233, 29, 34, - 233, 30, 34, 233, 31, 34, 233, 32, 34, 233, 33, 34, 233, 34, 34, 233, 35, - 34, 233, 36, 34, 233, 37, 34, 231, 153, 34, 231, 154, 34, 231, 155, 34, - 231, 156, 34, 231, 157, 34, 231, 158, 34, 231, 159, 34, 231, 160, 34, - 231, 161, 34, 231, 162, 34, 231, 163, 34, 231, 164, 34, 231, 165, 34, - 231, 166, 34, 231, 167, 34, 231, 168, 34, 231, 169, 34, 231, 170, 34, - 231, 171, 34, 231, 172, 34, 231, 173, 34, 231, 174, 34, 231, 175, 34, - 231, 176, 34, 231, 177, 34, 231, 178, 34, 231, 179, 34, 231, 180, 34, - 231, 181, 34, 231, 182, 34, 231, 183, 34, 231, 184, 34, 231, 185, 34, - 231, 186, 34, 231, 187, 34, 231, 188, 34, 231, 189, 34, 231, 190, 34, - 231, 191, 34, 231, 192, 34, 231, 193, 34, 231, 194, 34, 231, 195, 34, - 231, 196, 34, 231, 197, 34, 231, 198, 34, 231, 199, 34, 231, 200, 34, - 231, 201, 34, 231, 202, 34, 231, 203, 34, 231, 204, 34, 231, 205, 34, - 231, 206, 34, 231, 207, 34, 231, 208, 34, 231, 209, 34, 231, 210, 34, - 231, 211, 34, 231, 212, 34, 231, 213, 34, 231, 214, 34, 231, 215, 34, - 231, 216, 34, 231, 217, 34, 231, 218, 34, 231, 219, 34, 231, 220, 34, - 231, 221, 34, 231, 222, 34, 231, 223, 34, 231, 224, 34, 231, 225, 34, - 231, 226, 34, 231, 227, 34, 231, 228, 34, 231, 229, 34, 231, 230, 34, - 231, 231, 34, 231, 232, 34, 231, 233, 34, 231, 234, 34, 231, 235, 34, - 231, 236, 34, 231, 237, 34, 231, 238, 34, 231, 239, 34, 231, 240, 34, - 231, 241, 34, 231, 242, 34, 231, 243, 34, 231, 244, 34, 231, 245, 34, - 231, 246, 34, 231, 247, 34, 231, 248, 34, 231, 249, 34, 231, 250, 34, - 231, 251, 34, 231, 252, 34, 231, 253, 34, 231, 254, 34, 231, 255, 34, - 232, 0, 34, 232, 1, 34, 232, 2, 34, 232, 3, 34, 232, 4, 34, 232, 5, 34, - 232, 6, 34, 232, 7, 34, 232, 8, 34, 232, 9, 34, 232, 10, 34, 232, 11, 34, - 232, 12, 34, 232, 13, 34, 232, 14, 34, 232, 15, 34, 232, 16, 34, 232, 17, - 34, 232, 18, 34, 232, 19, 34, 232, 20, 34, 232, 21, 34, 232, 22, 34, 232, - 23, 34, 232, 24, 34, 232, 25, 34, 232, 26, 34, 232, 27, 34, 232, 28, 34, - 232, 29, 34, 232, 30, 34, 232, 31, 34, 232, 32, 34, 232, 33, 34, 232, 34, - 34, 232, 35, 34, 232, 36, 34, 232, 37, 34, 232, 38, 34, 232, 39, 34, 232, - 40, 34, 232, 41, 34, 232, 42, 34, 232, 43, 34, 232, 44, 34, 232, 45, 34, - 232, 46, 34, 232, 47, 34, 232, 48, 34, 232, 49, 34, 232, 50, 34, 232, 51, - 34, 232, 52, 34, 232, 53, + 1, 228, 144, 97, 8, 5, 1, 206, 97, 8, 5, 1, 228, 7, 97, 8, 5, 1, 227, + 103, 97, 40, 31, 104, 97, 234, 158, 231, 208, 97, 38, 31, 104, 97, 190, + 255, 90, 97, 170, 239, 193, 97, 247, 46, 255, 90, 97, 8, 3, 1, 67, 97, 8, + 3, 1, 217, 97, 8, 3, 1, 252, 178, 97, 8, 3, 1, 209, 97, 8, 3, 1, 72, 97, + 8, 3, 1, 248, 140, 97, 8, 3, 1, 210, 97, 8, 3, 1, 192, 97, 8, 3, 1, 71, + 97, 8, 3, 1, 221, 97, 8, 3, 1, 241, 12, 97, 8, 3, 1, 162, 97, 8, 3, 1, + 173, 97, 8, 3, 1, 197, 97, 8, 3, 1, 73, 97, 8, 3, 1, 223, 97, 8, 3, 1, + 235, 93, 97, 8, 3, 1, 144, 97, 8, 3, 1, 193, 97, 8, 3, 1, 214, 97, 8, 3, + 1, 79, 97, 8, 3, 1, 179, 97, 8, 3, 1, 228, 144, 97, 8, 3, 1, 206, 97, 8, + 3, 1, 228, 7, 97, 8, 3, 1, 227, 103, 97, 40, 251, 134, 104, 97, 59, 239, + 193, 97, 38, 251, 134, 104, 97, 169, 252, 164, 230, 173, 34, 233, 104, + 34, 233, 93, 34, 233, 82, 34, 233, 70, 34, 233, 59, 34, 233, 48, 34, 233, + 37, 34, 233, 26, 34, 233, 15, 34, 233, 7, 34, 233, 6, 34, 233, 5, 34, + 233, 4, 34, 233, 2, 34, 233, 1, 34, 233, 0, 34, 232, 255, 34, 232, 254, + 34, 232, 253, 34, 232, 252, 34, 232, 251, 34, 232, 250, 34, 232, 249, 34, + 232, 247, 34, 232, 246, 34, 232, 245, 34, 232, 244, 34, 232, 243, 34, + 232, 242, 34, 232, 241, 34, 232, 240, 34, 232, 239, 34, 232, 238, 34, + 232, 236, 34, 232, 235, 34, 232, 234, 34, 232, 233, 34, 232, 232, 34, + 232, 231, 34, 232, 230, 34, 232, 229, 34, 232, 228, 34, 232, 227, 34, + 232, 225, 34, 232, 224, 34, 232, 223, 34, 232, 222, 34, 232, 221, 34, + 232, 220, 34, 232, 219, 34, 232, 218, 34, 232, 217, 34, 232, 216, 34, + 232, 214, 34, 232, 213, 34, 232, 212, 34, 232, 211, 34, 232, 210, 34, + 232, 209, 34, 232, 208, 34, 232, 207, 34, 232, 206, 34, 232, 205, 34, + 232, 203, 34, 232, 202, 34, 232, 201, 34, 232, 200, 34, 232, 199, 34, + 232, 198, 34, 232, 197, 34, 232, 196, 34, 232, 195, 34, 232, 194, 34, + 232, 192, 34, 232, 191, 34, 232, 190, 34, 232, 189, 34, 232, 188, 34, + 232, 187, 34, 232, 186, 34, 232, 185, 34, 232, 184, 34, 232, 183, 34, + 233, 180, 34, 233, 179, 34, 233, 178, 34, 233, 177, 34, 233, 176, 34, + 233, 175, 34, 233, 174, 34, 233, 173, 34, 233, 172, 34, 233, 171, 34, + 233, 169, 34, 233, 168, 34, 233, 167, 34, 233, 166, 34, 233, 165, 34, + 233, 164, 34, 233, 163, 34, 233, 162, 34, 233, 161, 34, 233, 160, 34, + 233, 158, 34, 233, 157, 34, 233, 156, 34, 233, 155, 34, 233, 154, 34, + 233, 153, 34, 233, 152, 34, 233, 151, 34, 233, 150, 34, 233, 149, 34, + 233, 147, 34, 233, 146, 34, 233, 145, 34, 233, 144, 34, 233, 143, 34, + 233, 142, 34, 233, 141, 34, 233, 140, 34, 233, 139, 34, 233, 138, 34, + 233, 136, 34, 233, 135, 34, 233, 134, 34, 233, 133, 34, 233, 132, 34, + 233, 131, 34, 233, 130, 34, 233, 129, 34, 233, 128, 34, 233, 127, 34, + 233, 125, 34, 233, 124, 34, 233, 123, 34, 233, 122, 34, 233, 121, 34, + 233, 120, 34, 233, 119, 34, 233, 118, 34, 233, 117, 34, 233, 116, 34, + 233, 114, 34, 233, 113, 34, 233, 112, 34, 233, 111, 34, 233, 110, 34, + 233, 109, 34, 233, 108, 34, 233, 107, 34, 233, 106, 34, 233, 105, 34, + 233, 103, 34, 233, 102, 34, 233, 101, 34, 233, 100, 34, 233, 99, 34, 233, + 98, 34, 233, 97, 34, 233, 96, 34, 233, 95, 34, 233, 94, 34, 233, 92, 34, + 233, 91, 34, 233, 90, 34, 233, 89, 34, 233, 88, 34, 233, 87, 34, 233, 86, + 34, 233, 85, 34, 233, 84, 34, 233, 83, 34, 233, 81, 34, 233, 80, 34, 233, + 79, 34, 233, 78, 34, 233, 77, 34, 233, 76, 34, 233, 75, 34, 233, 74, 34, + 233, 73, 34, 233, 72, 34, 233, 69, 34, 233, 68, 34, 233, 67, 34, 233, 66, + 34, 233, 65, 34, 233, 64, 34, 233, 63, 34, 233, 62, 34, 233, 61, 34, 233, + 60, 34, 233, 58, 34, 233, 57, 34, 233, 56, 34, 233, 55, 34, 233, 54, 34, + 233, 53, 34, 233, 52, 34, 233, 51, 34, 233, 50, 34, 233, 49, 34, 233, 47, + 34, 233, 46, 34, 233, 45, 34, 233, 44, 34, 233, 43, 34, 233, 42, 34, 233, + 41, 34, 233, 40, 34, 233, 39, 34, 233, 38, 34, 233, 36, 34, 233, 35, 34, + 233, 34, 34, 233, 33, 34, 233, 32, 34, 233, 31, 34, 233, 30, 34, 233, 29, + 34, 233, 28, 34, 233, 27, 34, 233, 25, 34, 233, 24, 34, 233, 23, 34, 233, + 22, 34, 233, 21, 34, 233, 20, 34, 233, 19, 34, 233, 18, 34, 233, 17, 34, + 233, 16, 34, 233, 14, 34, 233, 13, 34, 233, 12, 34, 233, 11, 34, 233, 10, + 34, 233, 9, 34, 233, 8, }; static unsigned char phrasebook_offset1[] = { Modified: python/branches/py3k/Objects/unicodectype.c ============================================================================== --- python/branches/py3k/Objects/unicodectype.c (original) +++ python/branches/py3k/Objects/unicodectype.c Fri Jul 4 17:55:02 2008 @@ -21,7 +21,7 @@ #define UPPER_MASK 0x80 #define XID_START_MASK 0x100 #define XID_CONTINUE_MASK 0x200 -#define NONPRINTABLE_MASK 0x400 +#define PRINTABLE_MASK 0x400 typedef struct { const Py_UNICODE upper; @@ -693,7 +693,7 @@ { const _PyUnicode_TypeRecord *ctype = gettyperecord(ch); - return (ctype->flags & NONPRINTABLE_MASK) == 0; + return (ctype->flags & PRINTABLE_MASK) != 0; } #ifndef WANT_WCTYPE_FUNCTIONS Modified: python/branches/py3k/Objects/unicodetype_db.h ============================================================================== --- python/branches/py3k/Objects/unicodetype_db.h (original) +++ python/branches/py3k/Objects/unicodetype_db.h Fri Jul 4 17:55:02 2008 @@ -3,150 +3,150 @@ /* a list of unique character type descriptors */ const _PyUnicode_TypeRecord _PyUnicode_TypeRecords[] = { {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 1024}, - {0, 0, 0, 0, 0, 1056}, - {0, 0, 0, 0, 0, 1072}, {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 518}, - {0, 0, 0, 1, 1, 518}, - {0, 0, 0, 2, 2, 518}, - {0, 0, 0, 3, 3, 518}, - {0, 0, 0, 4, 4, 518}, - {0, 0, 0, 5, 5, 518}, - {0, 0, 0, 6, 6, 518}, - {0, 0, 0, 7, 7, 518}, - {0, 0, 0, 8, 8, 518}, - {0, 0, 0, 9, 9, 518}, - {0, 32, 0, 0, 0, 897}, - {0, 0, 0, 0, 0, 512}, - {65504, 0, 65504, 0, 0, 777}, - {0, 0, 0, 0, 0, 777}, - {0, 0, 0, 0, 2, 4}, - {0, 0, 0, 0, 3, 4}, - {743, 0, 743, 0, 0, 777}, - {0, 0, 0, 0, 1, 4}, - {121, 0, 121, 0, 0, 777}, - {0, 1, 0, 0, 0, 897}, - {65535, 0, 65535, 0, 0, 777}, - {0, 65337, 0, 0, 0, 897}, - {65304, 0, 65304, 0, 0, 777}, - {0, 65415, 0, 0, 0, 897}, - {65236, 0, 65236, 0, 0, 777}, - {0, 210, 0, 0, 0, 897}, - {0, 206, 0, 0, 0, 897}, - {0, 205, 0, 0, 0, 897}, - {0, 79, 0, 0, 0, 897}, - {0, 202, 0, 0, 0, 897}, - {0, 203, 0, 0, 0, 897}, - {0, 207, 0, 0, 0, 897}, - {97, 0, 97, 0, 0, 777}, - {0, 211, 0, 0, 0, 897}, - {0, 209, 0, 0, 0, 897}, - {163, 0, 163, 0, 0, 777}, - {0, 213, 0, 0, 0, 897}, - {130, 0, 130, 0, 0, 777}, - {0, 214, 0, 0, 0, 897}, - {0, 218, 0, 0, 0, 897}, - {0, 217, 0, 0, 0, 897}, - {0, 219, 0, 0, 0, 897}, - {0, 0, 0, 0, 0, 769}, - {56, 0, 56, 0, 0, 777}, - {0, 2, 1, 0, 0, 897}, - {65535, 1, 0, 0, 0, 833}, - {65534, 0, 65535, 0, 0, 777}, - {65457, 0, 65457, 0, 0, 777}, - {0, 65439, 0, 0, 0, 897}, - {0, 65480, 0, 0, 0, 897}, - {0, 65406, 0, 0, 0, 897}, - {0, 0, 0, 0, 0, 897}, - {0, 65373, 0, 0, 0, 897}, - {0, 83, 0, 0, 0, 897}, - {65326, 0, 65326, 0, 0, 777}, - {65330, 0, 65330, 0, 0, 777}, - {65331, 0, 65331, 0, 0, 777}, - {65334, 0, 65334, 0, 0, 777}, - {65333, 0, 65333, 0, 0, 777}, - {65329, 0, 65329, 0, 0, 777}, - {65327, 0, 65327, 0, 0, 777}, - {65325, 0, 65325, 0, 0, 777}, - {65323, 0, 65323, 0, 0, 777}, - {65322, 0, 65322, 0, 0, 777}, - {65318, 0, 65318, 0, 0, 777}, - {65319, 0, 65319, 0, 0, 777}, - {65317, 0, 65317, 0, 0, 777}, - {65453, 0, 65453, 0, 0, 777}, - {84, 0, 84, 0, 0, 512}, - {0, 0, 0, 0, 0, 1}, - {0, 38, 0, 0, 0, 897}, - {0, 37, 0, 0, 0, 897}, - {0, 64, 0, 0, 0, 897}, - {0, 63, 0, 0, 0, 897}, - {65498, 0, 65498, 0, 0, 777}, - {65499, 0, 65499, 0, 0, 777}, - {65505, 0, 65505, 0, 0, 777}, - {65472, 0, 65472, 0, 0, 777}, - {65473, 0, 65473, 0, 0, 777}, - {65474, 0, 65474, 0, 0, 777}, - {65479, 0, 65479, 0, 0, 777}, - {65489, 0, 65489, 0, 0, 777}, - {65482, 0, 65482, 0, 0, 777}, - {65450, 0, 65450, 0, 0, 777}, - {65456, 0, 65456, 0, 0, 777}, - {7, 0, 7, 0, 0, 777}, - {0, 65476, 0, 0, 0, 897}, - {65440, 0, 65440, 0, 0, 777}, - {0, 65529, 0, 0, 0, 897}, - {0, 80, 0, 0, 0, 897}, - {0, 48, 0, 0, 0, 897}, - {65488, 0, 65488, 0, 0, 777}, - {0, 0, 0, 0, 0, 513}, - {0, 7264, 0, 0, 0, 897}, - {0, 0, 0, 0, 1, 516}, - {0, 0, 0, 0, 2, 516}, - {0, 0, 0, 0, 3, 516}, - {0, 0, 0, 0, 4, 516}, - {0, 0, 0, 0, 5, 516}, - {0, 0, 0, 0, 6, 516}, - {0, 0, 0, 0, 7, 516}, - {0, 0, 0, 0, 8, 516}, - {0, 0, 0, 0, 9, 516}, - {0, 0, 0, 0, 0, 768}, - {65477, 0, 65477, 0, 0, 777}, - {8, 0, 8, 0, 0, 777}, - {0, 65528, 0, 0, 0, 897}, - {74, 0, 74, 0, 0, 777}, - {86, 0, 86, 0, 0, 777}, - {100, 0, 100, 0, 0, 777}, - {128, 0, 128, 0, 0, 777}, - {112, 0, 112, 0, 0, 777}, - {126, 0, 126, 0, 0, 777}, - {0, 65528, 0, 0, 0, 833}, - {9, 0, 9, 0, 0, 777}, - {0, 65462, 0, 0, 0, 897}, - {0, 65527, 0, 0, 0, 833}, - {58331, 0, 58331, 0, 0, 777}, - {0, 65450, 0, 0, 0, 897}, - {0, 65436, 0, 0, 0, 897}, - {0, 65424, 0, 0, 0, 897}, - {0, 65408, 0, 0, 0, 897}, - {0, 65410, 0, 0, 0, 897}, - {0, 0, 0, 0, 0, 4}, - {0, 0, 0, 0, 4, 4}, - {0, 0, 0, 0, 5, 4}, - {0, 0, 0, 0, 6, 4}, - {0, 0, 0, 0, 7, 4}, - {0, 0, 0, 0, 8, 4}, - {0, 0, 0, 0, 9, 4}, - {0, 58019, 0, 0, 0, 897}, - {0, 57153, 0, 0, 0, 897}, - {0, 57274, 0, 0, 0, 897}, - {0, 16, 0, 0, 0, 768}, - {65520, 0, 65520, 0, 0, 768}, - {0, 26, 0, 0, 0, 0}, - {65510, 0, 65510, 0, 0, 0}, - {58272, 0, 58272, 0, 0, 777}, - {0, 40, 0, 0, 0, 897}, - {65496, 0, 65496, 0, 0, 777}, + {0, 0, 0, 0, 0, 32}, + {0, 0, 0, 0, 0, 48}, + {0, 0, 0, 0, 0, 1024}, + {0, 0, 0, 0, 0, 1542}, + {0, 0, 0, 1, 1, 1542}, + {0, 0, 0, 2, 2, 1542}, + {0, 0, 0, 3, 3, 1542}, + {0, 0, 0, 4, 4, 1542}, + {0, 0, 0, 5, 5, 1542}, + {0, 0, 0, 6, 6, 1542}, + {0, 0, 0, 7, 7, 1542}, + {0, 0, 0, 8, 8, 1542}, + {0, 0, 0, 9, 9, 1542}, + {0, 32, 0, 0, 0, 1921}, + {0, 0, 0, 0, 0, 1536}, + {65504, 0, 65504, 0, 0, 1801}, + {0, 0, 0, 0, 0, 1801}, + {0, 0, 0, 0, 2, 1028}, + {0, 0, 0, 0, 3, 1028}, + {743, 0, 743, 0, 0, 1801}, + {0, 0, 0, 0, 1, 1028}, + {121, 0, 121, 0, 0, 1801}, + {0, 1, 0, 0, 0, 1921}, + {65535, 0, 65535, 0, 0, 1801}, + {0, 65337, 0, 0, 0, 1921}, + {65304, 0, 65304, 0, 0, 1801}, + {0, 65415, 0, 0, 0, 1921}, + {65236, 0, 65236, 0, 0, 1801}, + {0, 210, 0, 0, 0, 1921}, + {0, 206, 0, 0, 0, 1921}, + {0, 205, 0, 0, 0, 1921}, + {0, 79, 0, 0, 0, 1921}, + {0, 202, 0, 0, 0, 1921}, + {0, 203, 0, 0, 0, 1921}, + {0, 207, 0, 0, 0, 1921}, + {97, 0, 97, 0, 0, 1801}, + {0, 211, 0, 0, 0, 1921}, + {0, 209, 0, 0, 0, 1921}, + {163, 0, 163, 0, 0, 1801}, + {0, 213, 0, 0, 0, 1921}, + {130, 0, 130, 0, 0, 1801}, + {0, 214, 0, 0, 0, 1921}, + {0, 218, 0, 0, 0, 1921}, + {0, 217, 0, 0, 0, 1921}, + {0, 219, 0, 0, 0, 1921}, + {0, 0, 0, 0, 0, 1793}, + {56, 0, 56, 0, 0, 1801}, + {0, 2, 1, 0, 0, 1921}, + {65535, 1, 0, 0, 0, 1857}, + {65534, 0, 65535, 0, 0, 1801}, + {65457, 0, 65457, 0, 0, 1801}, + {0, 65439, 0, 0, 0, 1921}, + {0, 65480, 0, 0, 0, 1921}, + {0, 65406, 0, 0, 0, 1921}, + {0, 0, 0, 0, 0, 1921}, + {0, 65373, 0, 0, 0, 1921}, + {0, 83, 0, 0, 0, 1921}, + {65326, 0, 65326, 0, 0, 1801}, + {65330, 0, 65330, 0, 0, 1801}, + {65331, 0, 65331, 0, 0, 1801}, + {65334, 0, 65334, 0, 0, 1801}, + {65333, 0, 65333, 0, 0, 1801}, + {65329, 0, 65329, 0, 0, 1801}, + {65327, 0, 65327, 0, 0, 1801}, + {65325, 0, 65325, 0, 0, 1801}, + {65323, 0, 65323, 0, 0, 1801}, + {65322, 0, 65322, 0, 0, 1801}, + {65318, 0, 65318, 0, 0, 1801}, + {65319, 0, 65319, 0, 0, 1801}, + {65317, 0, 65317, 0, 0, 1801}, + {65453, 0, 65453, 0, 0, 1801}, + {84, 0, 84, 0, 0, 1536}, + {0, 0, 0, 0, 0, 1025}, + {0, 38, 0, 0, 0, 1921}, + {0, 37, 0, 0, 0, 1921}, + {0, 64, 0, 0, 0, 1921}, + {0, 63, 0, 0, 0, 1921}, + {65498, 0, 65498, 0, 0, 1801}, + {65499, 0, 65499, 0, 0, 1801}, + {65505, 0, 65505, 0, 0, 1801}, + {65472, 0, 65472, 0, 0, 1801}, + {65473, 0, 65473, 0, 0, 1801}, + {65474, 0, 65474, 0, 0, 1801}, + {65479, 0, 65479, 0, 0, 1801}, + {65489, 0, 65489, 0, 0, 1801}, + {65482, 0, 65482, 0, 0, 1801}, + {65450, 0, 65450, 0, 0, 1801}, + {65456, 0, 65456, 0, 0, 1801}, + {7, 0, 7, 0, 0, 1801}, + {0, 65476, 0, 0, 0, 1921}, + {65440, 0, 65440, 0, 0, 1801}, + {0, 65529, 0, 0, 0, 1921}, + {0, 80, 0, 0, 0, 1921}, + {0, 48, 0, 0, 0, 1921}, + {65488, 0, 65488, 0, 0, 1801}, + {0, 0, 0, 0, 0, 1537}, + {0, 7264, 0, 0, 0, 1921}, + {0, 0, 0, 0, 1, 1540}, + {0, 0, 0, 0, 2, 1540}, + {0, 0, 0, 0, 3, 1540}, + {0, 0, 0, 0, 4, 1540}, + {0, 0, 0, 0, 5, 1540}, + {0, 0, 0, 0, 6, 1540}, + {0, 0, 0, 0, 7, 1540}, + {0, 0, 0, 0, 8, 1540}, + {0, 0, 0, 0, 9, 1540}, + {0, 0, 0, 0, 0, 1792}, + {65477, 0, 65477, 0, 0, 1801}, + {8, 0, 8, 0, 0, 1801}, + {0, 65528, 0, 0, 0, 1921}, + {74, 0, 74, 0, 0, 1801}, + {86, 0, 86, 0, 0, 1801}, + {100, 0, 100, 0, 0, 1801}, + {128, 0, 128, 0, 0, 1801}, + {112, 0, 112, 0, 0, 1801}, + {126, 0, 126, 0, 0, 1801}, + {0, 65528, 0, 0, 0, 1857}, + {9, 0, 9, 0, 0, 1801}, + {0, 65462, 0, 0, 0, 1921}, + {0, 65527, 0, 0, 0, 1857}, + {58331, 0, 58331, 0, 0, 1801}, + {0, 65450, 0, 0, 0, 1921}, + {0, 65436, 0, 0, 0, 1921}, + {0, 65424, 0, 0, 0, 1921}, + {0, 65408, 0, 0, 0, 1921}, + {0, 65410, 0, 0, 0, 1921}, + {0, 0, 0, 0, 0, 1028}, + {0, 0, 0, 0, 4, 1028}, + {0, 0, 0, 0, 5, 1028}, + {0, 0, 0, 0, 6, 1028}, + {0, 0, 0, 0, 7, 1028}, + {0, 0, 0, 0, 8, 1028}, + {0, 0, 0, 0, 9, 1028}, + {0, 58019, 0, 0, 0, 1921}, + {0, 57153, 0, 0, 0, 1921}, + {0, 57274, 0, 0, 0, 1921}, + {0, 16, 0, 0, 0, 1792}, + {65520, 0, 65520, 0, 0, 1792}, + {0, 26, 0, 0, 0, 1024}, + {65510, 0, 65510, 0, 0, 1024}, + {58272, 0, 58272, 0, 0, 1801}, + {0, 40, 0, 0, 0, 1921}, + {65496, 0, 65496, 0, 0, 1801}, }; /* type indexes */ @@ -1323,6 +1323,3 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, }; - - - Modified: python/branches/py3k/Tools/unicode/makeunicodedata.py ============================================================================== --- python/branches/py3k/Tools/unicode/makeunicodedata.py (original) +++ python/branches/py3k/Tools/unicode/makeunicodedata.py Fri Jul 4 17:55:02 2008 @@ -20,7 +20,7 @@ # 2002-11-25 mvl add UNIDATA_VERSION # 2004-05-29 perky add east asian width information # 2006-03-10 mvl update to Unicode 4.1; add UCD 3.2 delta -# 2008-06-11 gb add NONPRINTABLE_MASK for Atsuo Ishimoto's ascii() patch +# 2008-06-11 gb add PRINTABLE_MASK for Atsuo Ishimoto's ascii() patch # # written by Fredrik Lundh (fredrik at pythonware.com) # @@ -61,7 +61,7 @@ UPPER_MASK = 0x80 XID_START_MASK = 0x100 XID_CONTINUE_MASK = 0x200 -NONPRINTABLE_MASK = 0x400 +PRINTABLE_MASK = 0x400 def maketables(trace=0): @@ -373,10 +373,8 @@ flags |= TITLE_MASK if category == "Lu": flags |= UPPER_MASK - if category[0] == "C": - flags |= NONPRINTABLE_MASK - if category[0] == "Z" and char != " ": - flags |= NONPRINTABLE_MASK + if char == " " or category[0] not in ("C", "Z"): + flags |= PRINTABLE_MASK if "XID_Start" in properties: flags |= XID_START_MASK if "XID_Continue" in properties: From python-3000-checkins at python.org Fri Jul 4 19:57:09 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Fri, 4 Jul 2008 19:57:09 +0200 (CEST) Subject: [Python-3000-checkins] r64709 - python/branches/py3k/Lib/test/test_format.py Message-ID: <20080704175709.BF6D01E4003@bag.python.org> Author: amaury.forgeotdarc Date: Fri Jul 4 19:57:09 2008 New Revision: 64709 Log: Correct a test after r64701. Modified: python/branches/py3k/Lib/test/test_format.py Modified: python/branches/py3k/Lib/test/test_format.py ============================================================================== --- python/branches/py3k/Lib/test/test_format.py (original) +++ python/branches/py3k/Lib/test/test_format.py Fri Jul 4 19:57:09 2008 @@ -216,8 +216,10 @@ testformat("%o", 0o42, "42") testformat("%o", -0o42, "-42") testformat("%o", float(0o42), "42") - testformat("%r", "\u0370", "'\u0370'") - testformat("%a", "\u0370", "'\\u0370'") + testformat("%r", "\u0370", "'\\u0370'") # non printable + testformat("%a", "\u0370", "'\\u0370'") # non printable + testformat("%r", "\u0374", "'\u0374'") # printable + testformat("%a", "\u0374", "'\\u0374'") # printable # Test exception for unknown format characters if verbose: print('Testing exceptions') From python-3000-checkins at python.org Fri Jul 4 21:55:29 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Fri, 4 Jul 2008 21:55:29 +0200 (CEST) Subject: [Python-3000-checkins] r64716 - python/branches/py3k/Objects/unicodeobject.c Message-ID: <20080704195529.DA3A81E4004@bag.python.org> Author: benjamin.peterson Date: Fri Jul 4 21:55:29 2008 New Revision: 64716 Log: touch up str docstrings #3284 Modified: python/branches/py3k/Objects/unicodeobject.c Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Fri Jul 4 21:55:29 2008 @@ -260,7 +260,7 @@ unicode->str[0] < 256U && unicode_latin1[unicode->str[0]] == unicode)) { PyErr_SetString(PyExc_SystemError, - "can't resize shared unicode objects"); + "can't resize shared str objects"); return -1; } @@ -377,14 +377,14 @@ Py_REFCNT(unicode) = 3; if (PyDict_DelItem(interned, (PyObject *)unicode) != 0) Py_FatalError( - "deletion of interned unicode string failed"); + "deletion of interned string failed"); break; case SSTATE_INTERNED_IMMORTAL: - Py_FatalError("Immortal interned unicode string died."); + Py_FatalError("Immortal interned string died."); default: - Py_FatalError("Inconsistent interned unicode string state."); + Py_FatalError("Inconsistent interned string state."); } if (PyUnicode_CheckExact(unicode) && @@ -1107,7 +1107,7 @@ if (PyUnicode_Check(obj)) { PyErr_SetString(PyExc_TypeError, - "decoding Unicode is not supported"); + "decoding str is not supported"); return NULL; } @@ -1125,7 +1125,7 @@ case of a TypeError. */ if (PyErr_ExceptionMatches(PyExc_TypeError)) PyErr_Format(PyExc_TypeError, - "coercing to Unicode: need string or buffer, " + "coercing to str: need string or buffer, " "%.80s found", Py_TYPE(obj)->tp_name); goto onError; @@ -1206,7 +1206,7 @@ goto onError; if (!PyUnicode_Check(unicode)) { PyErr_Format(PyExc_TypeError, - "decoder did not return a unicode object (type=%.400s)", + "decoder did not return a str object (type=%.400s)", Py_TYPE(unicode)->tp_name); Py_DECREF(unicode); goto onError; @@ -1263,7 +1263,7 @@ goto onError; if (!PyUnicode_Check(v)) { PyErr_Format(PyExc_TypeError, - "decoder did not return a unicode object (type=%.400s)", + "decoder did not return a str object (type=%.400s)", Py_TYPE(v)->tp_name); Py_DECREF(v); goto onError; @@ -1388,7 +1388,7 @@ goto onError; if (!PyUnicode_Check(v)) { PyErr_Format(PyExc_TypeError, - "encoder did not return an unicode object (type=%.400s)", + "encoder did not return an str object (type=%.400s)", Py_TYPE(v)->tp_name); Py_DECREF(v); goto onError; @@ -1525,7 +1525,7 @@ Py_ssize_t *endinpos, PyObject **exceptionObject, const char **inptr, PyObject **output, Py_ssize_t *outpos, Py_UNICODE **outptr) { - static char *argparse = "O!n;decoding error handler must return (unicode, int) tuple"; + static char *argparse = "O!n;decoding error handler must return (str, int) tuple"; PyObject *restuple = NULL; PyObject *repunicode = NULL; @@ -3601,7 +3601,7 @@ Py_ssize_t startpos, Py_ssize_t endpos, Py_ssize_t *newpos) { - static char *argparse = "O!n;encoding error handler must return (unicode, int) tuple"; + static char *argparse = "O!n;encoding error handler must return (str, int) tuple"; PyObject *restuple; PyObject *resunicode; @@ -4264,7 +4264,7 @@ else { /* wrong return value */ PyErr_SetString(PyExc_TypeError, - "character mapping must return integer, None or unicode"); + "character mapping must return integer, None or str"); Py_DECREF(x); goto onError; } @@ -4864,7 +4864,7 @@ Py_ssize_t startpos, Py_ssize_t endpos, Py_ssize_t *newpos) { - static char *argparse = "O!n;translating error handler must return (unicode, int) tuple"; + static char *argparse = "O!n;translating error handler must return (str, int) tuple"; Py_ssize_t i_newpos; PyObject *restuple; @@ -4954,7 +4954,7 @@ else { /* wrong return value */ PyErr_SetString(PyExc_TypeError, - "character mapping must return integer, None or unicode"); + "character mapping must return integer, None or str"); Py_DECREF(x); return -1; } @@ -6352,7 +6352,7 @@ PyDoc_STRVAR(center__doc__, "S.center(width[, fillchar]) -> str\n\ \n\ -Return S centered in a Unicode string of length width. Padding is\n\ +Return S centered in a string of length width. Padding is\n\ done using the specified fill character (default is a space)"); static PyObject * @@ -6551,12 +6551,12 @@ PyErr_Clear(); if (PyErr_WarnEx(PyExc_UnicodeWarning, (op == Py_EQ) ? - "Unicode equal comparison " - "failed to convert both arguments to Unicode - " + "equal comparison " + "failed to convert both arguments to str - " "interpreting them as being unequal" : "Unicode unequal comparison " - "failed to convert both arguments to Unicode - " + "failed to convert both arguments to str - " "interpreting them as being unequal", 1) < 0) return NULL; @@ -6662,7 +6662,7 @@ "S.count(sub[, start[, end]]) -> int\n\ \n\ Return the number of non-overlapping occurrences of substring sub in\n\ -Unicode string S[start:end]. Optional arguments start and end are\n\ +string S[start:end]. Optional arguments start and end are\n\ interpreted as in slice notation."); static PyObject * @@ -7411,7 +7411,7 @@ return _PyUnicode_XStrip(self, striptype, sep); else { PyErr_Format(PyExc_TypeError, - "%s arg must be None, unicode or str", + "%s arg must be None or str", STRIPNAME(striptype)); return NULL; } @@ -7426,8 +7426,7 @@ \n\ Return a copy of the string S with leading and trailing\n\ whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is a str, it will be converted to unicode before stripping"); +If chars is given and not None, remove characters in chars instead."); static PyObject * unicode_strip(PyUnicodeObject *self, PyObject *args) @@ -7443,8 +7442,7 @@ "S.lstrip([chars]) -> str\n\ \n\ Return a copy of the string S with leading whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is a str, it will be converted to unicode before stripping"); +If chars is given and not None, remove characters in chars instead."); static PyObject * unicode_lstrip(PyUnicodeObject *self, PyObject *args) @@ -7460,8 +7458,7 @@ "S.rstrip([chars]) -> str\n\ \n\ Return a copy of the string S with trailing whitespace removed.\n\ -If chars is given and not None, remove characters in chars instead.\n\ -If chars is a str, it will be converted to unicode before stripping"); +If chars is given and not None, remove characters in chars instead."); static PyObject * unicode_rstrip(PyUnicodeObject *self, PyObject *args) @@ -7810,7 +7807,7 @@ PyDoc_STRVAR(rjust__doc__, "S.rjust(width[, fillchar]) -> str\n\ \n\ -Return S right justified in a Unicode string of length width. Padding is\n\ +Return S right justified in a string of length width. Padding is\n\ done using the specified fill character (default is a space)."); static PyObject * @@ -8059,7 +8056,7 @@ Return a translation table usable for str.translate().\n\ If there is only one argument, it must be a dictionary mapping Unicode\n\ ordinals (integers) or characters to Unicode ordinals, strings or None.\n\ -Character keys will then be converted to ordinals.\n\ +Character keys will be then converted to ordinals.\n\ If there are two arguments, they must be strings of equal length, and\n\ in the resulting dictionary, each character in x will be mapped to the\n\ character at the same position in y. If there is a third argument, it\n\ @@ -8161,7 +8158,7 @@ \n\ Return a copy of the string S, where all characters have been mapped\n\ through the given translation table, which must be a mapping of\n\ -Unicode ordinals to Unicode ordinals, Unicode strings or None.\n\ +Unicode ordinals to Unicode ordinals, strings, or None.\n\ Unmapped characters are left untouched. Characters mapped to None\n\ are deleted."); From python-3000-checkins at python.org Fri Jul 4 23:26:43 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Fri, 4 Jul 2008 23:26:43 +0200 (CEST) Subject: [Python-3000-checkins] r64717 - in python/branches/py3k: Lib/test/test_unicode.py Misc/NEWS Objects/unicodeobject.c Python/modsupport.c Message-ID: <20080704212643.CC9CD1E4004@bag.python.org> Author: amaury.forgeotdarc Date: Fri Jul 4 23:26:43 2008 New Revision: 64717 Log: Issue #3280: like chr() already does, the "%c" format now accepts the full unicode range even on "narrow Unicode" builds; the result is a pair of UTF-16 surrogates. Modified: python/branches/py3k/Lib/test/test_unicode.py python/branches/py3k/Misc/NEWS python/branches/py3k/Objects/unicodeobject.c python/branches/py3k/Python/modsupport.c Modified: python/branches/py3k/Lib/test/test_unicode.py ============================================================================== --- python/branches/py3k/Lib/test/test_unicode.py (original) +++ python/branches/py3k/Lib/test/test_unicode.py Fri Jul 4 23:26:43 2008 @@ -717,7 +717,10 @@ self.assertEqual("%(x)s, %(\xfc)s" % {'x':"abc", '\xfc':"def"}, 'abc, def') self.assertEqual('%c' % 0x1234, '\u1234') - self.assertRaises(OverflowError, "%c".__mod__, (sys.maxunicode+1,)) + self.assertEqual('%c' % 0x21483, '\U00021483') + self.assertRaises(OverflowError, "%c".__mod__, (0x110000,)) + self.assertEqual('%c' % '\U00021483', '\U00021483') + self.assertRaises(TypeError, "%c".__mod__, "aa") # formatting jobs delegated from the string implementation: self.assertEqual('...%(foo)s...' % {'foo':"abc"}, '...abc...') Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 4 23:26:43 2008 @@ -12,6 +12,11 @@ Core and Builtins ----------------- +- Issue #3280: like chr(), the "%c" format now accepts unicode code points + beyond the Basic Multilingual Plane (above 0xffff) on all configurations. On + "narrow Unicode" builds, the result is a string of 2 code units, forming a + UTF-16 surrogate pair. + - Issue #3282: str.isprintable() should return False for undefined Unicode characters. Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Fri Jul 4 23:26:43 2008 @@ -8730,11 +8730,28 @@ size_t buflen, PyObject *v) { - /* presume that the buffer is at least 2 characters long */ + /* presume that the buffer is at least 3 characters long */ if (PyUnicode_Check(v)) { - if (PyUnicode_GET_SIZE(v) != 1) - goto onError; - buf[0] = PyUnicode_AS_UNICODE(v)[0]; + if (PyUnicode_GET_SIZE(v) == 1) { + buf[0] = PyUnicode_AS_UNICODE(v)[0]; + buf[1] = '\0'; + return 1; + } +#ifndef Py_UNICODE_WIDE + if (PyUnicode_GET_SIZE(v) == 2) { + /* Decode a valid surrogate pair */ + int c0 = PyUnicode_AS_UNICODE(v)[0]; + int c1 = PyUnicode_AS_UNICODE(v)[1]; + if (0xD800 <= c0 && c0 <= 0xDBFF && + 0xDC00 <= c1 && c1 <= 0xDFFF) { + buf[0] = c0; + buf[1] = c1; + buf[2] = '\0'; + return 2; + } + } +#endif + goto onError; } else { /* Integer input truncated to a character */ @@ -8742,25 +8759,25 @@ x = PyLong_AsLong(v); if (x == -1 && PyErr_Occurred()) goto onError; -#ifdef Py_UNICODE_WIDE + if (x < 0 || x > 0x10ffff) { PyErr_SetString(PyExc_OverflowError, - "%c arg not in range(0x110000) " - "(wide Python build)"); + "%c arg not in range(0x110000)"); return -1; } -#else - if (x < 0 || x > 0xffff) { - PyErr_SetString(PyExc_OverflowError, - "%c arg not in range(0x10000) " - "(narrow Python build)"); - return -1; + +#ifndef Py_UNICODE_WIDE + if (x > 0xffff) { + x -= 0x10000; + buf[0] = (Py_UNICODE)(0xD800 | (x >> 10)); + buf[1] = (Py_UNICODE)(0xDC00 | (x & 0x3FF)); + return 2; } #endif buf[0] = (Py_UNICODE) x; + buf[1] = '\0'; + return 1; } - buf[1] = '\0'; - return 1; onError: PyErr_SetString(PyExc_TypeError, Modified: python/branches/py3k/Python/modsupport.c ============================================================================== --- python/branches/py3k/Python/modsupport.c (original) +++ python/branches/py3k/Python/modsupport.c Fri Jul 4 23:26:43 2008 @@ -294,21 +294,12 @@ case 'C': { int i = va_arg(*p_va, int); - Py_UNICODE c; if (i < 0 || i > PyUnicode_GetMax()) { -#ifdef Py_UNICODE_WIDE PyErr_SetString(PyExc_OverflowError, - "%c arg not in range(0x110000) " - "(wide Python build)"); -#else - PyErr_SetString(PyExc_OverflowError, - "%c arg not in range(0x10000) " - "(narrow Python build)"); -#endif + "%c arg not in range(0x110000)"; return NULL; } - c = i; - return PyUnicode_FromUnicode(&c, 1); + return PyUnicode_FromOrdinal(i); } case 's': From python-3000-checkins at python.org Fri Jul 4 23:34:47 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Fri, 4 Jul 2008 23:34:47 +0200 (CEST) Subject: [Python-3000-checkins] r64718 - python/branches/py3k/Python/modsupport.c Message-ID: <20080704213447.6551D1E4003@bag.python.org> Author: amaury.forgeotdarc Date: Fri Jul 4 23:34:47 2008 New Revision: 64718 Log: Correct a typo during previous checkin. Modified: python/branches/py3k/Python/modsupport.c Modified: python/branches/py3k/Python/modsupport.c ============================================================================== --- python/branches/py3k/Python/modsupport.c (original) +++ python/branches/py3k/Python/modsupport.c Fri Jul 4 23:34:47 2008 @@ -296,7 +296,7 @@ int i = va_arg(*p_va, int); if (i < 0 || i > PyUnicode_GetMax()) { PyErr_SetString(PyExc_OverflowError, - "%c arg not in range(0x110000)"; + "%c arg not in range(0x110000)"); return NULL; } return PyUnicode_FromOrdinal(i); From python-3000-checkins at python.org Sat Jul 5 13:29:04 2008 From: python-3000-checkins at python.org (mark.dickinson) Date: Sat, 5 Jul 2008 13:29:04 +0200 (CEST) Subject: [Python-3000-checkins] r64728 - python/branches/py3k/Python/bltinmodule.c Message-ID: <20080705112904.5F2941E4003@bag.python.org> Author: mark.dickinson Date: Sat Jul 5 13:29:03 2008 New Revision: 64728 Log: Docstring typo Modified: python/branches/py3k/Python/bltinmodule.c Modified: python/branches/py3k/Python/bltinmodule.c ============================================================================== --- python/branches/py3k/Python/bltinmodule.c (original) +++ python/branches/py3k/Python/bltinmodule.c Sat Jul 5 13:29:03 2008 @@ -1726,7 +1726,7 @@ "round(number[, ndigits]) -> floating point number\n\ \n\ Round a number to a given precision in decimal digits (default 0 digits).\n\ -This returns an int when called with one argument, otherwise a the\n\ +This returns an int when called with one argument, otherwise the\n\ same type as the number. ndigits may be negative."); From python-3000-checkins at python.org Sat Jul 5 17:55:02 2008 From: python-3000-checkins at python.org (martin.v.loewis) Date: Sat, 5 Jul 2008 17:55:02 +0200 (CEST) Subject: [Python-3000-checkins] r64738 - in python/branches/py3k: Lib/lib2to3 Lib/lib2to3/fixes/fix_imports.py Lib/lib2to3/tests/test_fixers.py Lib/test/test_lib2to3.py Message-ID: <20080705155502.AFA121E4004@bag.python.org> Author: martin.v.loewis Date: Sat Jul 5 17:55:00 2008 New Revision: 64738 Log: Merged revisions 64736-64737 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ................ r64736 | martin.v.loewis | 2008-07-05 17:45:45 +0200 (Sa, 05 Jul 2008) | 20 lines Merged revisions 64285-64735 via svnmerge from svn+ssh://pythondev at svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r64493 | benjamin.peterson | 2008-06-24 04:14:14 +0200 (Di, 24 Jun 2008) | 1 line add a fix_import mapping for cPickle -> pickle ........ r64651 | brett.cannon | 2008-07-02 04:00:11 +0200 (Mi, 02 Jul 2008) | 3 lines Update fix_imports for urllib. Had to change the fixer itself to handle modules that are split across several renames in 3.0. ........ r64669 | brett.cannon | 2008-07-02 21:43:48 +0200 (Mi, 02 Jul 2008) | 4 lines Backing out last change until fix_imports is working again. Also re-enable the testing for fix_imports; if it is deemed that it takes too long to run then a random sample should be taken and used to test it. ........ ................ r64737 | martin.v.loewis | 2008-07-05 17:48:20 +0200 (Sa, 05 Jul 2008) | 2 lines Disable lib2to3 by default, unless run explicitly. ................ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/lib2to3/ (props changed) python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py python/branches/py3k/Lib/lib2to3/tests/test_fixers.py python/branches/py3k/Lib/test/test_lib2to3.py Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py Sat Jul 5 17:55:00 2008 @@ -19,6 +19,11 @@ # XXX: overhead to the fixer. MAPPING = {"StringIO": ("io", ["StringIO"]), "cStringIO": ("io", ["StringIO"]), + "cPickle": ("pickle", ['BadPickleGet', 'HIGHEST_PROTOCOL', + 'PickleError', 'Pickler', 'PicklingError', + 'UnpickleableError', 'Unpickler', 'UnpicklingError', + 'compatible_formats', 'dump', 'dumps', 'format_version', + 'load', 'loads']), "__builtin__" : ("builtins", builtin_names), 'copy_reg': ('copyreg', ['pickle', 'constructor', Modified: python/branches/py3k/Lib/lib2to3/tests/test_fixers.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/tests/test_fixers.py (original) +++ python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Sat Jul 5 17:55:00 2008 @@ -1405,10 +1405,7 @@ s = "foo(xreadlines)" self.unchanged(s) -# Disable test, as it takes a too long time to run, and also -# fails in 2.6. -#class Test_imports(FixerTestCase): -class Test_imports: +class Test_imports(FixerTestCase): fixer = "imports" from ..fixes.fix_imports import MAPPING as modules Modified: python/branches/py3k/Lib/test/test_lib2to3.py ============================================================================== --- python/branches/py3k/Lib/test/test_lib2to3.py (original) +++ python/branches/py3k/Lib/test/test_lib2to3.py Sat Jul 5 17:55:00 2008 @@ -2,7 +2,11 @@ # because of running from lib2to3.tests import test_fixers, test_pytree, test_util import unittest -from test.support import run_unittest +from test.support import run_unittest, requires + +# Don't run lib2to3 tests by default since they take too long +if __name__ != '__main__': + requires('lib2to3') def suite(): tests = unittest.TestSuite() From python-3000-checkins at python.org Sat Jul 5 22:59:18 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2008 22:59:18 +0200 (CEST) Subject: [Python-3000-checkins] r64747 - python/branches/py3k/Lib/rlcompleter.py Message-ID: <20080705205918.D82831E4004@bag.python.org> Author: benjamin.peterson Date: Sat Jul 5 22:59:18 2008 New Revision: 64747 Log: fix regression from merge error in rlcompletor Modified: python/branches/py3k/Lib/rlcompleter.py Modified: python/branches/py3k/Lib/rlcompleter.py ============================================================================== --- python/branches/py3k/Lib/rlcompleter.py (original) +++ python/branches/py3k/Lib/rlcompleter.py Sat Jul 5 22:59:18 2008 @@ -106,7 +106,7 @@ matches.append(word) for nspace in [builtins.__dict__, self.namespace]: for word, val in nspace.items(): - if word[:n] == text and word != "builtins": + if word[:n] == text and word != "__builtins__": matches.append(self._callable_postfix(val, word)) return matches From python-3000-checkins at python.org Sat Jul 5 23:20:33 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2008 23:20:33 +0200 (CEST) Subject: [Python-3000-checkins] r64748 - python/branches/py3k/Lib/rlcompleter.py Message-ID: <20080705212033.E60161E4004@bag.python.org> Author: benjamin.peterson Date: Sat Jul 5 23:20:33 2008 New Revision: 64748 Log: finish fixing the rlcompleter regression (thanks for noticing Antonine Pitrou) Modified: python/branches/py3k/Lib/rlcompleter.py Modified: python/branches/py3k/Lib/rlcompleter.py ============================================================================== --- python/branches/py3k/Lib/rlcompleter.py (original) +++ python/branches/py3k/Lib/rlcompleter.py Sat Jul 5 23:20:33 2008 @@ -87,7 +87,7 @@ return None def _callable_postfix(self, val, word): - if callable(val): + if hasattr(val, '__call__'): word = word + "(" return word From python-3000-checkins at python.org Sun Jul 6 00:51:21 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 6 Jul 2008 00:51:21 +0200 (CEST) Subject: [Python-3000-checkins] r64749 - in python/branches/py3k/Mac: IDLE/IDLE.app/Contents/MacOS/Python Makefile.in Message-ID: <20080705225121.5FB8D1E4004@bag.python.org> Author: benjamin.peterson Date: Sun Jul 6 00:51:21 2008 New Revision: 64749 Log: make the symlink to Python be created on install for IDLE.app Removed: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python Modified: python/branches/py3k/Mac/Makefile.in Deleted: python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python ============================================================================== --- python/branches/py3k/Mac/IDLE/IDLE.app/Contents/MacOS/Python Sun Jul 6 00:51:21 2008 +++ (empty file) @@ -1 +0,0 @@ -link /Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python \ No newline at end of file Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Sun Jul 6 00:51:21 2008 @@ -162,6 +162,7 @@ test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" cp -PR IDLE/IDLE.app "$(DESTDIR)$(PYTHONAPPSDIR)" + ln -sf $(INSTALLED_PYTHONAPP) "$(DESDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python" touch "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" $(INSTALLED_PYTHONAPP): install_Python From python-3000-checkins at python.org Sun Jul 6 01:38:30 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 6 Jul 2008 01:38:30 +0200 (CEST) Subject: [Python-3000-checkins] r64751 - python/branches/py3k/Objects/exceptions.c Message-ID: <20080705233830.8E4D41E4004@bag.python.org> Author: benjamin.peterson Date: Sun Jul 6 01:38:30 2008 New Revision: 64751 Log: #3295 actually define PyExc_BufferError Modified: python/branches/py3k/Objects/exceptions.c Modified: python/branches/py3k/Objects/exceptions.c ============================================================================== --- python/branches/py3k/Objects/exceptions.c (original) +++ python/branches/py3k/Objects/exceptions.c Sun Jul 6 01:38:30 2008 @@ -1847,6 +1847,7 @@ PRE_INIT(ReferenceError) PRE_INIT(BufferError) PRE_INIT(MemoryError) + PRE_INIT(BufferError) PRE_INIT(Warning) PRE_INIT(UserWarning) PRE_INIT(DeprecationWarning) @@ -1908,6 +1909,7 @@ POST_INIT(ReferenceError) POST_INIT(BufferError) POST_INIT(MemoryError) + POST_INIT(BufferError) POST_INIT(Warning) POST_INIT(UserWarning) POST_INIT(DeprecationWarning) From python-3000-checkins at python.org Sun Jul 6 01:39:56 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 6 Jul 2008 01:39:56 +0200 (CEST) Subject: [Python-3000-checkins] r64752 - python/branches/py3k/Doc/tutorial/datastructures.rst Message-ID: <20080705233956.A28FA1E4004@bag.python.org> Author: benjamin.peterson Date: Sun Jul 6 01:39:56 2008 New Revision: 64752 Log: fix no-op in tutorial Modified: python/branches/py3k/Doc/tutorial/datastructures.rst Modified: python/branches/py3k/Doc/tutorial/datastructures.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/datastructures.rst (original) +++ python/branches/py3k/Doc/tutorial/datastructures.rst Sun Jul 6 01:39:56 2008 @@ -252,7 +252,7 @@ for i in [0, 1, 2]: for row in mat: print(row[i], end="") - print + print() In real world, you should prefer builtin functions to complex flow statements. The :func:`zip` function would do a great job for this use case:: From python-3000-checkins at python.org Sun Jul 6 23:37:52 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Sun, 6 Jul 2008 23:37:52 +0200 (CEST) Subject: [Python-3000-checkins] r64763 - python/branches/py3k Message-ID: <20080706213752.61FDC1E4005@bag.python.org> Author: amaury.forgeotdarc Date: Sun Jul 6 23:37:52 2008 New Revision: 64763 Log: Blocked revisions 64762 via svnmerge ........ r64762 | amaury.forgeotdarc | 2008-07-06 23:34:39 +0200 (dim., 06 juil. 2008) | 8 lines Issue839496: SimpleHTTPServer should open all files in binary mode. Forward-port of 38255 (2005/01/15!) This was already fixed in 2.4, but never merged into trunk... py3k is already right, thanks to the bytes/str distinction! Should be backported to 2.5. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Mon Jul 7 06:15:09 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Mon, 7 Jul 2008 06:15:09 +0200 (CEST) Subject: [Python-3000-checkins] r64764 - in python/branches/py3k: Doc/library/asynchat.rst Doc/library/asyncore.rst Lib/asynchat.py Lib/asyncore.py Lib/smtpd.py Lib/test/test_asynchat.py Lib/test/test_asyncore.py Lib/test/test_smtplib.py Message-ID: <20080707041509.182871E4007@bag.python.org> Author: josiah.carlson Date: Mon Jul 7 06:15:08 2008 New Revision: 64764 Log: Committing Py3k version of changelist 64080 and 64257, along with updated tests for smtpd, which required updating with the new semantics. Modified: python/branches/py3k/Doc/library/asynchat.rst python/branches/py3k/Doc/library/asyncore.rst python/branches/py3k/Lib/asynchat.py python/branches/py3k/Lib/asyncore.py python/branches/py3k/Lib/smtpd.py python/branches/py3k/Lib/test/test_asynchat.py python/branches/py3k/Lib/test/test_asyncore.py python/branches/py3k/Lib/test/test_smtplib.py Modified: python/branches/py3k/Doc/library/asynchat.rst ============================================================================== --- python/branches/py3k/Doc/library/asynchat.rst (original) +++ python/branches/py3k/Doc/library/asynchat.rst Mon Jul 7 06:15:08 2008 @@ -81,6 +81,12 @@ :exc:`NotImplementedError` exception. +.. method:: async_chat._collect_incoming_data(data) + + Sample implementation of a data collection rutine to be used in conjunction + with :meth:`_get_data` in a user-specified :meth:`found_terminator`. + + .. method:: async_chat.discard_buffers() In emergencies this method will discard any data held in the input and/or @@ -95,6 +101,12 @@ should be available via an instance attribute. +.. method:: async_chat._get_data() + + Will return and clear the data received with the sample + :meth:`_collect_incoming_data` implementation. + + .. method:: async_chat.get_terminator() Returns the current terminator for the channel. Modified: python/branches/py3k/Doc/library/asyncore.rst ============================================================================== --- python/branches/py3k/Doc/library/asyncore.rst (original) +++ python/branches/py3k/Doc/library/asyncore.rst Mon Jul 7 06:15:08 2008 @@ -222,6 +222,21 @@ flushed). Sockets are automatically closed when they are garbage-collected. +.. class:: file_dispatcher() + + A file_dispatcher takes a file descriptor or file object along with an + optional map argument and wraps it for use with the :cfunc:`poll` or + :cfunc:`loop` functions. If provided a file object or anything with a + :cfunc:`fileno` method, that method will be called and passed to the + :class:`file_wrapper` constructor. Availability: UNIX. + +.. class:: file_wrapper() + + A file_wrapper takes an integer file descriptor and calls :func:`os.dup` to + duplicate the handle so that the original handle may be closed independently + of the file_wrapper. This class implements sufficient methods to emulate a + socket for use by the :class:`file_dispatcher` class. Availability: UNIX. + .. _asyncore-example: Modified: python/branches/py3k/Lib/asynchat.py ============================================================================== --- python/branches/py3k/Lib/asynchat.py (original) +++ python/branches/py3k/Lib/asynchat.py Mon Jul 7 06:15:08 2008 @@ -45,12 +45,23 @@ method) up to the terminator, and then control will be returned to you - by calling your self.found_terminator() method. """ - -import sys import socket import asyncore from collections import deque +def buffer(obj, start=None, stop=None): + # if memoryview objects gain slicing semantics, + # this function will change for the better + # memoryview used for the TypeError + memoryview(obj) + if start == None: + start = 0 + if stop == None: + stop = len(obj) + x = obj[start:stop] + ## print("buffer type is: %s"%(type(x),)) + return x + class async_chat (asyncore.dispatcher): """This is an abstract class. You must derive from this class, and add the two methods collect_incoming_data() and found_terminator()""" @@ -60,20 +71,47 @@ ac_in_buffer_size = 4096 ac_out_buffer_size = 4096 + # we don't want to enable the use of encoding by default, because that is a + # sign of an application bug that we don't want to pass silently + + use_encoding = 0 + encoding = 'latin1' + def __init__ (self, conn=None): + # for string terminator matching self.ac_in_buffer = b'' - self.ac_out_buffer = b'' - self.producer_fifo = fifo() + + # we use a list here rather than cStringIO for a few reasons... + # del lst[:] is faster than sio.truncate(0) + # lst = [] is faster than sio.truncate(0) + # cStringIO will be gaining unicode support in py3k, which + # will negatively affect the performance of bytes compared to + # a ''.join() equivalent + self.incoming = [] + + # we toss the use of the "simple producer" and replace it with + # a pure deque, which the original fifo was a wrapping of + self.producer_fifo = deque() asyncore.dispatcher.__init__ (self, conn) def collect_incoming_data(self, data): raise NotImplementedError("must be implemented in subclass") + def _collect_incoming_data(self, data): + self.incoming.append(data) + + def _get_data(self): + d = b''.join(self.incoming) + del self.incoming[:] + return d + def found_terminator(self): raise NotImplementedError("must be implemented in subclass") def set_terminator (self, term): "Set the input delimiter. Can be a fixed string of any length, an integer, or None" + if isinstance(term, str) and self.use_encoding: + term = bytes(term, self.encoding) self.terminator = term def get_terminator (self): @@ -92,14 +130,14 @@ self.handle_error() return - if isinstance(data, str): - data = data.encode('ascii') - self.ac_in_buffer = self.ac_in_buffer + bytes(data) + if isinstance(data, str) and self.use_encoding: + data = bytes(str, self.encoding) + self.ac_in_buffer = self.ac_in_buffer + data # Continue to search for self.terminator in self.ac_in_buffer, # while calling self.collect_incoming_data. The while loop # is necessary because we might read several data+terminator - # combos with a single recv(1024). + # combos with a single recv(4096). while self.ac_in_buffer: lb = len(self.ac_in_buffer) @@ -108,7 +146,7 @@ # no terminator, collect it all self.collect_incoming_data (self.ac_in_buffer) self.ac_in_buffer = b'' - elif isinstance(terminator, int) or isinstance(terminator, int): + elif isinstance(terminator, int): # numeric terminator n = terminator if lb < n: @@ -129,8 +167,6 @@ # 3) end of buffer does not match any prefix: # collect data terminator_len = len(terminator) - if isinstance(terminator, str): - terminator = terminator.encode('ascii') index = self.ac_in_buffer.find(terminator) if index != -1: # we found the terminator @@ -155,91 +191,87 @@ self.ac_in_buffer = b'' def handle_write (self): - self.initiate_send () + self.initiate_send() def handle_close (self): self.close() def push (self, data): - self.producer_fifo.push (simple_producer (data)) + sabs = self.ac_out_buffer_size + if len(data) > sabs: + for i in range(0, len(data), sabs): + self.producer_fifo.append(data[i:i+sabs]) + else: + self.producer_fifo.append(data) self.initiate_send() def push_with_producer (self, producer): - self.producer_fifo.push (producer) + self.producer_fifo.append(producer) self.initiate_send() def readable (self): "predicate for inclusion in the readable for select()" - return (len(self.ac_in_buffer) <= self.ac_in_buffer_size) + # cannot use the old predicate, it violates the claim of the + # set_terminator method. + + # return (len(self.ac_in_buffer) <= self.ac_in_buffer_size) + return 1 def writable (self): "predicate for inclusion in the writable for select()" - # return len(self.ac_out_buffer) or len(self.producer_fifo) or (not self.connected) - # this is about twice as fast, though not as clear. - return not ( - (self.ac_out_buffer == b'') and - self.producer_fifo.is_empty() and - self.connected - ) + return self.producer_fifo or (not self.connected) def close_when_done (self): "automatically close this channel once the outgoing queue is empty" - self.producer_fifo.push (None) + self.producer_fifo.append(None) - # refill the outgoing buffer by calling the more() method - # of the first producer in the queue - def refill_buffer (self): - while 1: - if len(self.producer_fifo): - p = self.producer_fifo.first() - # a 'None' in the producer fifo is a sentinel, - # telling us to close the channel. - if p is None: - if not self.ac_out_buffer: - self.producer_fifo.pop() - self.close() - return - elif isinstance(p, str) or isinstance(p, bytes): - if isinstance(p, str): - p = p.encode('ascii') - self.producer_fifo.pop() - self.ac_out_buffer = self.ac_out_buffer + p + def initiate_send(self): + while self.producer_fifo and self.connected: + first = self.producer_fifo[0] + # handle empty string/buffer or None entry + if not first: + del self.producer_fifo[0] + if first is None: + ## print("first is None") + self.handle_close() return - data = p.more() + ## print("first is not None") + + # handle classic producer behavior + obs = self.ac_out_buffer_size + try: + data = buffer(first, 0, obs) + except TypeError: + data = first.more() if data: - if isinstance(data, str): - data = data.encode('ascii') - self.ac_out_buffer = self.ac_out_buffer + bytes(data) - return + self.producer_fifo.appendleft(data) else: - self.producer_fifo.pop() - else: - return + del self.producer_fifo[0] + continue - def initiate_send (self): - obs = self.ac_out_buffer_size - # try to refill the buffer - if (len (self.ac_out_buffer) < obs): - self.refill_buffer() + if isinstance(data, str) and self.use_encoding: + data = bytes(data, self.encoding) - if self.ac_out_buffer and self.connected: - # try to send the buffer + # send the data try: - num_sent = self.send (self.ac_out_buffer[:obs]) - if num_sent: - self.ac_out_buffer = self.ac_out_buffer[num_sent:] - - except socket.error as why: + num_sent = self.send(data) + except socket.error: self.handle_error() return + if num_sent: + if num_sent < len(data) or obs < len(first): + self.producer_fifo[0] = first[num_sent:] + else: + del self.producer_fifo[0] + # we tried to send some actual data + return + def discard_buffers (self): # Emergencies only! self.ac_in_buffer = b'' - self.ac_out_buffer = b'' - while self.producer_fifo: - self.producer_fifo.pop() - + del self.incoming[:] + self.producer_fifo.clear() class simple_producer: Modified: python/branches/py3k/Lib/asyncore.py ============================================================================== --- python/branches/py3k/Lib/asyncore.py (original) +++ python/branches/py3k/Lib/asyncore.py Mon Jul 7 06:15:08 2008 @@ -50,23 +50,28 @@ import socket import sys import time - import os from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, \ - ENOTCONN, ESHUTDOWN, EINTR, EISCONN, errorcode + ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, errorcode try: socket_map except NameError: socket_map = {} +def _strerror(err): + res = os.strerror(err) + if res == 'Unknown error': + res = errorcode[err] + return res + class ExitNow(Exception): pass def read(obj): try: obj.handle_read_event() - except ExitNow: + except (ExitNow, KeyboardInterrupt, SystemExit): raise except: obj.handle_error() @@ -74,15 +79,15 @@ def write(obj): try: obj.handle_write_event() - except ExitNow: + except (ExitNow, KeyboardInterrupt, SystemExit): raise except: obj.handle_error() -def _exception (obj): +def _exception(obj): try: obj.handle_expt_event() - except ExitNow: + except (ExitNow, KeyboardInterrupt, SystemExit): raise except: obj.handle_error() @@ -95,7 +100,7 @@ obj.handle_write_event() if flags & (select.POLLERR | select.POLLHUP | select.POLLNVAL): obj.handle_expt_event() - except ExitNow: + except (ExitNow, KeyboardInterrupt, SystemExit): raise except: obj.handle_error() @@ -105,7 +110,7 @@ map = socket_map if map: r = []; w = []; e = [] - for fd, obj in map.items(): + for fd, obj in list(map.items()): is_r = obj.readable() is_w = obj.writable() if is_r: @@ -116,14 +121,15 @@ e.append(fd) if [] == r == w == e: time.sleep(timeout) - else: - try: - r, w, e = select.select(r, w, e, timeout) - except select.error as err: - if err.args[0] != EINTR: - raise - else: - return + return + + try: + r, w, e = select.select(r, w, e, timeout) + except select.error as err: + if err[0] != EINTR: + raise + else: + return for fd in r: obj = map.get(fd) @@ -152,7 +158,7 @@ timeout = int(timeout*1000) pollster = select.poll() if map: - for fd, obj in map.items(): + for fd, obj in list(map.items()): flags = 0 if obj.readable(): flags |= select.POLLIN | select.POLLPRI @@ -166,7 +172,7 @@ try: r = pollster.poll(timeout) except select.error as err: - if err.args[0] != EINTR: + if err[0] != EINTR: raise r = [] for fd, flags in r: @@ -209,18 +215,29 @@ else: self._map = map + self._fileno = None + if sock: + # Set to nonblocking just to make sure for cases where we + # get a socket from a blocking source. + sock.setblocking(0) self.set_socket(sock, map) - # I think it should inherit this anyway - self.socket.setblocking(0) self.connected = True - # XXX Does the constructor require that the socket passed - # be connected? + # The constructor no longer requires that the socket + # passed be connected. try: self.addr = sock.getpeername() - except socket.error: - # The addr isn't crucial - pass + except socket.error as err: + if err[0] == ENOTCONN: + # To handle the case where we got an unconnected + # socket. + self.connected = False + else: + # The socket is broken in some unknown way, alert + # the user and remove it from the map (to prevent + # polling of broken sockets). + self.del_channel(map) + raise else: self.socket = None @@ -254,10 +271,9 @@ def create_socket(self, family, type): self.family_and_type = family, type - self.socket = socket.socket(family, type) - self.socket.setblocking(0) - self._fileno = self.socket.fileno() - self.add_channel() + sock = socket.socket(family, type) + sock.setblocking(0) + self.set_socket(sock) def set_socket(self, sock, map=None): self.socket = sock @@ -295,7 +311,7 @@ def listen(self, num): self.accepting = True if os.name == 'nt' and num > 5: - num = 1 + num = 5 return self.socket.listen(num) def bind(self, addr): @@ -310,8 +326,7 @@ return if err in (0, EISCONN): self.addr = address - self.connected = True - self.handle_connect() + self.handle_connect_event() else: raise socket.error(err, errorcode[err]) @@ -321,7 +336,7 @@ conn, addr = self.socket.accept() return conn, addr except socket.error as why: - if why.args[0] == EWOULDBLOCK: + if why[0] == EWOULDBLOCK: pass else: raise @@ -331,11 +346,13 @@ result = self.socket.send(data) return result except socket.error as why: - if why.args[0] == EWOULDBLOCK: + if why[0] == EWOULDBLOCK: + return 0 + elif why[0] in (ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED): + self.handle_close() return 0 else: raise - return 0 def recv(self, buffer_size): try: @@ -349,15 +366,21 @@ return data except socket.error as why: # winsock sometimes throws ENOTCONN - if why.args[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN]: + if why[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED]: self.handle_close() return b'' else: raise def close(self): + self.connected = False + self.accepting = False self.del_channel() - self.socket.close() + try: + self.socket.close() + except socket.error as why: + if why[0] not in (ENOTCONN, EBADF): + raise # cheap inheritance, used to pass all other attribute # references to the underlying socket object. @@ -377,27 +400,53 @@ def handle_read_event(self): if self.accepting: - # for an accepting socket, getting a read implies - # that we are connected - if not self.connected: - self.connected = True + # accepting sockets are never connected, they "spawn" new + # sockets that are connected self.handle_accept() elif not self.connected: - self.handle_connect() - self.connected = True + self.handle_connect_event() self.handle_read() else: self.handle_read() + def handle_connect_event(self): + self.connected = True + self.handle_connect() + def handle_write_event(self): - # getting a write implies that we are connected + if self.accepting: + # Accepting sockets shouldn't get a write event. + # We will pretend it didn't happen. + return + if not self.connected: - self.handle_connect() - self.connected = True + #check for errors + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if err != 0: + raise socket.error(err, _strerror(err)) + + self.handle_connect_event() self.handle_write() def handle_expt_event(self): - self.handle_expt() + # if the handle_expt is the same default worthless method, + # we'll not even bother calling it, we'll instead generate + # a useful error + x = True + try: + y1 = self.handle_expt.__func__ + y2 = dispatcher.handle_expt + x = y1 is y2 + except AttributeError: + pass + + if x: + err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + msg = _strerror(err) + + raise socket.error(err, msg) + else: + self.handle_expt() def handle_error(self): nil, t, v, tbinfo = compact_traceback() @@ -461,7 +510,6 @@ return (not self.connected) or len(self.out_buffer) def send(self, data): - assert isinstance(data, bytes) if self.debug: self.log_info('sending %s' % repr(data)) self.out_buffer = self.out_buffer + data @@ -474,7 +522,8 @@ def compact_traceback(): t, v, tb = sys.exc_info() tbinfo = [] - assert tb # Must have a traceback + if not tb: # Must have a traceback + raise AssertionError("traceback does not exist") while tb: tbinfo.append(( tb.tb_frame.f_code.co_filename, @@ -490,11 +539,22 @@ info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo]) return (file, function, line), t, v, info -def close_all(map=None): +def close_all(map=None, ignore_all=False): if map is None: map = socket_map - for x in map.values(): - x.socket.close() + for x in list(map.values()): + try: + x.close() + except OSError as x: + if x[0] == EBADF: + pass + elif not ignore_all: + raise + except (ExitNow, KeyboardInterrupt, SystemExit): + raise + except: + if not ignore_all: + raise map.clear() # Asynchronous File I/O: @@ -514,11 +574,12 @@ import fcntl class file_wrapper: - # here we override just enough to make a file + # Here we override just enough to make a file # look like a socket for the purposes of asyncore. + # The passed fd is automatically os.dup()'d def __init__(self, fd): - self.fd = fd + self.fd = os.dup(fd) def recv(self, *args): return os.read(self.fd, *args) @@ -540,6 +601,10 @@ def __init__(self, fd, map=None): dispatcher.__init__(self, None, map) self.connected = True + try: + fd = fd.fileno() + except AttributeError: + pass self.set_file(fd) # set it to non-blocking mode flags = fcntl.fcntl(fd, fcntl.F_GETFL, 0) Modified: python/branches/py3k/Lib/smtpd.py ============================================================================== --- python/branches/py3k/Lib/smtpd.py (original) +++ python/branches/py3k/Lib/smtpd.py Mon Jul 7 06:15:08 2008 @@ -124,11 +124,11 @@ self.__peer = conn.getpeername() print('Peer:', repr(self.__peer), file=DEBUGSTREAM) self.push('220 %s %s' % (self.__fqdn, __version__)) - self.set_terminator('\r\n') + self.set_terminator(b'\r\n') # Overrides base class for convenience def push(self, msg): - asynchat.async_chat.push(self, msg + '\r\n') + asynchat.async_chat.push(self, bytes(msg + '\r\n', 'ascii')) # Implementation of base class abstract method def collect_incoming_data(self, data): @@ -177,7 +177,7 @@ self.__rcpttos = [] self.__mailfrom = None self.__state = self.COMMAND - self.set_terminator('\r\n') + self.set_terminator(b'\r\n') if not status: self.push('250 Ok') else: @@ -264,7 +264,7 @@ self.push('501 Syntax: DATA') return self.__state = self.DATA - self.set_terminator('\r\n.\r\n') + self.set_terminator(b'\r\n.\r\n') self.push('354 End data with .') Modified: python/branches/py3k/Lib/test/test_asynchat.py ============================================================================== --- python/branches/py3k/Lib/test/test_asynchat.py (original) +++ python/branches/py3k/Lib/test/test_asynchat.py Mon Jul 7 06:15:08 2008 @@ -105,8 +105,8 @@ time.sleep(0.01) # Give server time to start accepting. c = echo_client(term, s.port) c.push(b"hello ") - c.push(bytes("world%s" % term, "ascii")) - c.push(bytes("I'm not dead yet!%s" % term, "ascii")) + c.push(b"world" + term) + c.push(b"I'm not dead yet!" + term) c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) s.join() @@ -120,17 +120,17 @@ def test_line_terminator1(self): # test one-character terminator for l in (1,2,3): - self.line_terminator_check('\n', l) + self.line_terminator_check(b'\n', l) def test_line_terminator2(self): # test two-character terminator for l in (1,2,3): - self.line_terminator_check('\r\n', l) + self.line_terminator_check(b'\r\n', l) def test_line_terminator3(self): # test three-character terminator for l in (1,2,3): - self.line_terminator_check('qqq', l) + self.line_terminator_check(b'qqq', l) def numeric_terminator_check(self, termlen): # Try reading a fixed number of bytes @@ -190,7 +190,7 @@ # checks that empty lines are handled correctly s, event = start_echo_server() c = echo_client(b'\n', s.port) - c.push("hello world\n\nI'm not dead yet!\n") + c.push(b"hello world\n\nI'm not dead yet!\n") c.push(SERVER_QUIT) asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) s.join() @@ -201,7 +201,7 @@ def test_close_when_done(self): s, event = start_echo_server() c = echo_client(b'\n', s.port) - c.push("hello world\nI'm not dead yet!\n") + c.push(b"hello world\nI'm not dead yet!\n") c.push(SERVER_QUIT) c.close_when_done() asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) Modified: python/branches/py3k/Lib/test/test_asyncore.py ============================================================================== --- python/branches/py3k/Lib/test/test_asyncore.py (original) +++ python/branches/py3k/Lib/test/test_asyncore.py Mon Jul 7 06:15:08 2008 @@ -28,6 +28,9 @@ def __init__(self): self.socket = dummysocket() + def close(self): + self.socket.close() + class exitingdummy: def __init__(self): pass @@ -382,8 +385,8 @@ fd = os.open(TESTFN, os.O_RDONLY) w = asyncore.file_wrapper(fd) - self.assertEqual(w.fd, fd) - self.assertEqual(w.fileno(), fd) + self.assertNotEqual(w.fd, fd) + self.assertNotEqual(w.fileno(), fd) self.assertEqual(w.recv(13), b"It's not dead") self.assertEqual(w.read(6), b", it's") w.close() Modified: python/branches/py3k/Lib/test/test_smtplib.py ============================================================================== --- python/branches/py3k/Lib/test/test_smtplib.py (original) +++ python/branches/py3k/Lib/test/test_smtplib.py Mon Jul 7 06:15:08 2008 @@ -14,6 +14,14 @@ HOST = support.HOST +if sys.platform == 'darwin': + # select.poll returns a select.POLLHUP at the end of the tests + # on darwin, so just ignore it + def handle_expt(self): + pass + smtpd.SMTPChannel.handle_expt = handle_expt + + def server(evt, buf, serv): serv.listen(5) evt.set() From python-3000-checkins at python.org Mon Jul 7 06:23:14 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Mon, 7 Jul 2008 06:23:14 +0200 (CEST) Subject: [Python-3000-checkins] r64765 - in python/branches/py3k/Doc/library: asynchat.rst asyncore.rst Message-ID: <20080707042314.9F5241E4007@bag.python.org> Author: josiah.carlson Date: Mon Jul 7 06:23:14 2008 New Revision: 64765 Log: Fixed documentation to be correct for Py3k. Modified: python/branches/py3k/Doc/library/asynchat.rst python/branches/py3k/Doc/library/asyncore.rst Modified: python/branches/py3k/Doc/library/asynchat.rst ============================================================================== --- python/branches/py3k/Doc/library/asynchat.rst (original) +++ python/branches/py3k/Doc/library/asynchat.rst Mon Jul 7 06:23:14 2008 @@ -5,7 +5,7 @@ .. module:: asynchat :synopsis: Support for asynchronous command/response protocols. .. moduleauthor:: Sam Rushing -.. sectionauthor:: Steve Holden +.. sectionauthor:: Steve Holden This module builds on the :mod:`asyncore` infrastructure, simplifying @@ -283,8 +283,8 @@ self.addr = addr self.sessions = sessions self.ibuffer = [] - self.obuffer = "" - self.set_terminator("\r\n\r\n") + self.obuffer = b"" + self.set_terminator(b"\r\n\r\n") self.reading_headers = True self.handling = False self.cgi_data = None @@ -299,7 +299,7 @@ self.reading_headers = False self.parse_headers("".join(self.ibuffer)) self.ibuffer = [] - if self.op.upper() == "POST": + if self.op.upper() == b"POST": clen = self.headers.getheader("content-length") self.set_terminator(int(clen)) else: @@ -308,7 +308,7 @@ self.handle_request() elif not self.handling: self.set_terminator(None) # browsers sometimes over-send - self.cgi_data = parse(self.headers, "".join(self.ibuffer)) + self.cgi_data = parse(self.headers, b"".join(self.ibuffer)) self.handling = True self.ibuffer = [] self.handle_request() Modified: python/branches/py3k/Doc/library/asyncore.rst ============================================================================== --- python/branches/py3k/Doc/library/asyncore.rst (original) +++ python/branches/py3k/Doc/library/asyncore.rst Mon Jul 7 06:23:14 2008 @@ -254,7 +254,7 @@ asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect( (host, 80) ) - self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path + self.buffer = bytes('GET %s HTTP/1.0\r\n\r\n' % path, 'ascii') def handle_connect(self): pass From python-3000-checkins at python.org Mon Jul 7 06:24:25 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Mon, 7 Jul 2008 06:24:25 +0200 (CEST) Subject: [Python-3000-checkins] r64766 - python/branches/py3k/Doc/library/asynchat.rst Message-ID: <20080707042425.431941E4007@bag.python.org> Author: josiah.carlson Date: Mon Jul 7 06:24:24 2008 New Revision: 64766 Log: Removed extraneous whitespace. Modified: python/branches/py3k/Doc/library/asynchat.rst Modified: python/branches/py3k/Doc/library/asynchat.rst ============================================================================== --- python/branches/py3k/Doc/library/asynchat.rst (original) +++ python/branches/py3k/Doc/library/asynchat.rst Mon Jul 7 06:24:24 2008 @@ -5,7 +5,7 @@ .. module:: asynchat :synopsis: Support for asynchronous command/response protocols. .. moduleauthor:: Sam Rushing -.. sectionauthor:: Steve Holden +.. sectionauthor:: Steve Holden This module builds on the :mod:`asyncore` infrastructure, simplifying From python-3000-checkins at python.org Mon Jul 7 07:04:12 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Mon, 7 Jul 2008 07:04:12 +0200 (CEST) Subject: [Python-3000-checkins] r64770 - in python/branches/py3k/Lib: asynchat.py asyncore.py test/test_asyncore.py Message-ID: <20080707050412.D88651E4007@bag.python.org> Author: josiah.carlson Date: Mon Jul 7 07:04:12 2008 New Revision: 64770 Log: Fixed bugs 760475, 953599, and 1519. This is a translation of changelist 64768 to the py3k branch. Modified: python/branches/py3k/Lib/asynchat.py python/branches/py3k/Lib/asyncore.py python/branches/py3k/Lib/test/test_asyncore.py Modified: python/branches/py3k/Lib/asynchat.py ============================================================================== --- python/branches/py3k/Lib/asynchat.py (original) +++ python/branches/py3k/Lib/asynchat.py Mon Jul 7 07:04:12 2008 @@ -77,7 +77,7 @@ use_encoding = 0 encoding = 'latin1' - def __init__ (self, conn=None): + def __init__ (self, sock=None, map=None): # for string terminator matching self.ac_in_buffer = b'' @@ -92,7 +92,7 @@ # we toss the use of the "simple producer" and replace it with # a pure deque, which the original fifo was a wrapping of self.producer_fifo = deque() - asyncore.dispatcher.__init__ (self, conn) + asyncore.dispatcher.__init__ (self, sock, map) def collect_incoming_data(self, data): raise NotImplementedError("must be implemented in subclass") Modified: python/branches/py3k/Lib/asyncore.py ============================================================================== --- python/branches/py3k/Lib/asyncore.py (original) +++ python/branches/py3k/Lib/asyncore.py Mon Jul 7 07:04:12 2008 @@ -98,8 +98,10 @@ obj.handle_read_event() if flags & select.POLLOUT: obj.handle_write_event() - if flags & (select.POLLERR | select.POLLHUP | select.POLLNVAL): + if flags & (select.POLLERR | select.POLLNVAL): obj.handle_expt_event() + if flags & select.POLLHUP: + obj.handle_close_event() except (ExitNow, KeyboardInterrupt, SystemExit): raise except: @@ -466,7 +468,7 @@ ), 'error' ) - self.close() + self.handle_close() def handle_expt(self): self.log_info('unhandled exception', 'warning') Modified: python/branches/py3k/Lib/test/test_asyncore.py ============================================================================== --- python/branches/py3k/Lib/test/test_asyncore.py (original) +++ python/branches/py3k/Lib/test/test_asyncore.py Mon Jul 7 07:04:12 2008 @@ -39,6 +39,7 @@ raise asyncore.ExitNow() handle_write_event = handle_read_event + handle_close_event = handle_read_event handle_expt_event = handle_read_event class crashingdummy: @@ -49,6 +50,7 @@ raise Exception() handle_write_event = handle_read_event + handle_close_event = handle_read_event handle_expt_event = handle_read_event def handle_error(self): @@ -118,6 +120,7 @@ def __init__(self): self.read = False self.write = False + self.closed = False self.expt = False def handle_read_event(self): @@ -126,6 +129,9 @@ def handle_write_event(self): self.write = True + def handle_close_event(self): + self.closed = True + def handle_expt_event(self): self.expt = True @@ -168,9 +174,9 @@ for flag in (select.POLLERR, select.POLLHUP, select.POLLNVAL): tobj = testobj() - self.assertEqual(tobj.expt, False) + self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], False) asyncore.readwrite(tobj, flag) - self.assertEqual(tobj.expt, True) + self.assertEqual((tobj.expt, tobj.closed)[flag == select.POLLHUP], True) # check that ExitNow exceptions in the object handler method # bubbles all the way up through asyncore readwrite calls From python-3000-checkins at python.org Mon Jul 7 20:24:11 2008 From: python-3000-checkins at python.org (facundo.batista) Date: Mon, 7 Jul 2008 20:24:11 +0200 (CEST) Subject: [Python-3000-checkins] r64781 - in python/branches/py3k/Lib: test/test_urlparse.py urllib/parse.py Message-ID: <20080707182411.C5A5D1E4008@bag.python.org> Author: facundo.batista Date: Mon Jul 7 20:24:11 2008 New Revision: 64781 Log: Issue 3314. The sys module is used in an error case. Modified: python/branches/py3k/Lib/test/test_urlparse.py python/branches/py3k/Lib/urllib/parse.py Modified: python/branches/py3k/Lib/test/test_urlparse.py ============================================================================== --- python/branches/py3k/Lib/test/test_urlparse.py (original) +++ python/branches/py3k/Lib/test/test_urlparse.py Mon Jul 7 20:24:11 2008 @@ -310,6 +310,10 @@ self.assertEqual(urllib.parse.urlparse("http://example.com?blahblah=/foo"), ('http', 'example.com', '', '', 'blahblah=/foo', '')) + def test_usingsys(self): + # Issue 3314: sys module is used in the error + self.assertRaises(TypeError, urllib.parse.urlencode, "foo") + def test_main(): support.run_unittest(UrlParseTestCase) Modified: python/branches/py3k/Lib/urllib/parse.py ============================================================================== --- python/branches/py3k/Lib/urllib/parse.py (original) +++ python/branches/py3k/Lib/urllib/parse.py Mon Jul 7 20:24:11 2008 @@ -4,6 +4,8 @@ UC Irvine, June 1995. """ +import sys + __all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", "urlsplit", "urlunsplit"] @@ -599,7 +601,6 @@ """ def test(): - import sys base = '' if sys.argv[1:]: fn = sys.argv[1] From python-3000-checkins at python.org Tue Jul 8 16:12:42 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Tue, 8 Jul 2008 16:12:42 +0200 (CEST) Subject: [Python-3000-checkins] r64792 - python/branches/py3k Message-ID: <20080708141242.E30101E400C@bag.python.org> Author: nick.coghlan Date: Tue Jul 8 16:12:42 2008 New Revision: 64792 Log: Blocked revisions 64791 via svnmerge ........ r64791 | nick.coghlan | 2008-07-09 00:08:04 +1000 (Wed, 09 Jul 2008) | 1 line Issue 2517: Allow unicode messages in Exceptions again by correctly bypassing the instance dictionary when looking up __unicode__ on new-style classes ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 11 02:13:35 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 11 Jul 2008 02:13:35 +0200 (CEST) Subject: [Python-3000-checkins] r64860 - python/branches/py3k Message-ID: <20080711001335.22ABE1E4003@bag.python.org> Author: brett.cannon Date: Fri Jul 11 02:13:34 2008 New Revision: 64860 Log: Blocked revisions 64858-64859 via svnmerge ........ r64858 | brett.cannon | 2008-07-10 17:10:49 -0700 (Thu, 10 Jul 2008) | 2 lines Removal an invalid entry as the fixer for urllib is under active development. ........ r64859 | brett.cannon | 2008-07-10 17:12:52 -0700 (Thu, 10 Jul 2008) | 3 lines Document the fact that urllib2 spans multiple modules with new names in Python 3.0. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 11 02:17:07 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 11 Jul 2008 02:17:07 +0200 (CEST) Subject: [Python-3000-checkins] r64862 - python/branches/py3k Message-ID: <20080711001707.C407E1E4003@bag.python.org> Author: brett.cannon Date: Fri Jul 11 02:17:07 2008 New Revision: 64862 Log: Blocked revisions 64861 via svnmerge ........ r64861 | brett.cannon | 2008-07-10 17:16:30 -0700 (Thu, 10 Jul 2008) | 1 line Doc that urlparse is named urllib.parse in Python 3.0. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 11 02:50:47 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 11 Jul 2008 02:50:47 +0200 (CEST) Subject: [Python-3000-checkins] r64867 - python/branches/py3k Message-ID: <20080711005047.B046A1E401E@bag.python.org> Author: brett.cannon Date: Fri Jul 11 02:50:40 2008 New Revision: 64867 Log: Blocked revisions 64865-64866 via svnmerge ........ r64865 | brett.cannon | 2008-07-10 17:48:57 -0700 (Thu, 10 Jul 2008) | 1 line Doc that robotparse has been renamed urllib.robotparser in Python 3.0. ........ r64866 | brett.cannon | 2008-07-10 17:50:01 -0700 (Thu, 10 Jul 2008) | 1 line Fix a minor typo in the last entry made. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Sat Jul 12 00:18:27 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Sat, 12 Jul 2008 00:18:27 +0200 (CEST) Subject: [Python-3000-checkins] r64883 - python/branches/py3k/Lib/asyncore.py Message-ID: <20080711221827.DFE591E4004@bag.python.org> Author: josiah.carlson Date: Sat Jul 12 00:18:27 2008 New Revision: 64883 Log: Fix for AttributeError in test_asynchat. Modified: python/branches/py3k/Lib/asyncore.py Modified: python/branches/py3k/Lib/asyncore.py ============================================================================== --- python/branches/py3k/Lib/asyncore.py (original) +++ python/branches/py3k/Lib/asyncore.py Sat Jul 12 00:18:27 2008 @@ -101,7 +101,7 @@ if flags & (select.POLLERR | select.POLLNVAL): obj.handle_expt_event() if flags & select.POLLHUP: - obj.handle_close_event() + obj.handle_close() except (ExitNow, KeyboardInterrupt, SystemExit): raise except: From python-3000-checkins at python.org Sat Jul 12 01:26:37 2008 From: python-3000-checkins at python.org (josiah.carlson) Date: Sat, 12 Jul 2008 01:26:37 +0200 (CEST) Subject: [Python-3000-checkins] r64884 - python/branches/py3k/Lib/test/test_asyncore.py Message-ID: <20080711232637.ACC621E4016@bag.python.org> Author: josiah.carlson Date: Sat Jul 12 01:26:37 2008 New Revision: 64884 Log: Fixed test for asyncore. Modified: python/branches/py3k/Lib/test/test_asyncore.py Modified: python/branches/py3k/Lib/test/test_asyncore.py ============================================================================== --- python/branches/py3k/Lib/test/test_asyncore.py (original) +++ python/branches/py3k/Lib/test/test_asyncore.py Sat Jul 12 01:26:37 2008 @@ -39,7 +39,7 @@ raise asyncore.ExitNow() handle_write_event = handle_read_event - handle_close_event = handle_read_event + handle_close = handle_read_event handle_expt_event = handle_read_event class crashingdummy: @@ -50,7 +50,7 @@ raise Exception() handle_write_event = handle_read_event - handle_close_event = handle_read_event + handle_close = handle_read_event handle_expt_event = handle_read_event def handle_error(self): @@ -129,7 +129,7 @@ def handle_write_event(self): self.write = True - def handle_close_event(self): + def handle_close(self): self.closed = True def handle_expt_event(self): From python-3000-checkins at python.org Sat Jul 12 22:06:53 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 12 Jul 2008 22:06:53 +0200 (CEST) Subject: [Python-3000-checkins] r64896 - python/branches/py3k/Lib/plat-mac Message-ID: <20080712200653.C80F31E4006@bag.python.org> Author: benjamin.peterson Date: Sat Jul 12 22:06:53 2008 New Revision: 64896 Log: kill off plat-mac Removed: python/branches/py3k/Lib/plat-mac/ From python-3000-checkins at python.org Sat Jul 12 23:11:12 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 12 Jul 2008 23:11:12 +0200 (CEST) Subject: [Python-3000-checkins] r64899 - python/branches/py3k Message-ID: <20080712211112.7CCFC1E4007@bag.python.org> Author: benjamin.peterson Date: Sat Jul 12 23:11:03 2008 New Revision: 64899 Log: These revisions were merged manaually: Blocked revisions 64062,64068-64069,64080 via svnmerge ........ r64062 | josiah.carlson | 2008-06-10 00:00:08 -0500 (Tue, 10 Jun 2008) | 5 lines Applying updated patch from Issue 1736190, which addresses partial issues in: 909005 and 17361001, as well as completely as possible issues 539444, 760475, 777588, 889153, 953599, 1025525, 1063924, and 658749. This patch also includes doc and test updates as necessary. ........ r64068 | benjamin.peterson | 2008-06-10 08:37:13 -0500 (Tue, 10 Jun 2008) | 2 lines fix markup ........ r64069 | georg.brandl | 2008-06-10 08:53:24 -0500 (Tue, 10 Jun 2008) | 2 lines more markup fix. ........ r64080 | josiah.carlson | 2008-06-10 10:58:19 -0500 (Tue, 10 Jun 2008) | 3 lines Fixed test to reflect new filedispatcher semantics, as well as two NameErrors pointed out by Giampaolo. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Sun Jul 13 03:19:15 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Sun, 13 Jul 2008 03:19:15 +0200 (CEST) Subject: [Python-3000-checkins] r64904 - in python/branches/py3k: Lib/_dummy_thread.py Lib/test/test_dummy_thread.py Message-ID: <20080713011915.D25D01E4007@bag.python.org> Author: brett.cannon Date: Sun Jul 13 03:19:15 2008 New Revision: 64904 Log: Merged revisions 64903 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64903 | brett.cannon | 2008-07-12 18:15:07 -0700 (Sat, 12 Jul 2008) | 6 lines dummy_thread.acquire() would return None if no waitflag argument was given. It should have returned True. Fixes issue #3339. Thanks, Henk Punt for the report and Andrii v. Mishkovskiyi for attempting a patch. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/_dummy_thread.py python/branches/py3k/Lib/test/test_dummy_thread.py Modified: python/branches/py3k/Lib/_dummy_thread.py ============================================================================== --- python/branches/py3k/Lib/_dummy_thread.py (original) +++ python/branches/py3k/Lib/_dummy_thread.py Sun Jul 13 03:19:15 2008 @@ -104,18 +104,15 @@ aren't triggered and throw a little fit. """ - if waitflag is None: + if waitflag is None or waitflag: self.locked_status = True - return None - elif not waitflag: + return True + else: if not self.locked_status: self.locked_status = True return True else: return False - else: - self.locked_status = True - return True __enter__ = acquire Modified: python/branches/py3k/Lib/test/test_dummy_thread.py ============================================================================== --- python/branches/py3k/Lib/test/test_dummy_thread.py (original) +++ python/branches/py3k/Lib/test/test_dummy_thread.py Sun Jul 13 03:19:15 2008 @@ -60,6 +60,7 @@ #Make sure that an unconditional locking returns True. self.failUnless(self.lock.acquire(1) is True, "Unconditional locking did not return True.") + self.failUnless(self.lock.acquire() is True) def test_uncond_acquire_blocking(self): #Make sure that unconditional acquiring of a locked lock blocks. From python-3000-checkins at python.org Sun Jul 13 03:38:37 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Sun, 13 Jul 2008 03:38:37 +0200 (CEST) Subject: [Python-3000-checkins] r64906 - python/branches/py3k/Doc/library/undoc.rst Message-ID: <20080713013837.144B81E4002@bag.python.org> Author: brett.cannon Date: Sun Jul 13 03:38:36 2008 New Revision: 64906 Log: Clean up list of undocumented modules as most of them have been removed in Python 3.0. Modified: python/branches/py3k/Doc/library/undoc.rst Modified: python/branches/py3k/Doc/library/undoc.rst ============================================================================== --- python/branches/py3k/Doc/library/undoc.rst (original) +++ python/branches/py3k/Doc/library/undoc.rst Sun Jul 13 03:38:36 2008 @@ -30,47 +30,5 @@ Multimedia ========== -:mod:`linuxaudiodev` - --- Play audio data on the Linux audio device. Replaced in Python 2.3 by the - :mod:`ossaudiodev` module. - :mod:`sunaudio` --- Interpret Sun audio headers (may become obsolete or a tool/demo). - -.. _obsolete-modules: - -Obsolete -======== - -These modules are not normally available for import; additional work must be -done to make them available. - -These extension modules written in C are not built by default. Under Unix, these -must be enabled by uncommenting the appropriate lines in :file:`Modules/Setup` -in the build tree and either rebuilding Python if the modules are statically -linked, or building and installing the shared object if using dynamically-loaded -extensions. - -.. XXX new explanation of lib-old necessary - - Those which are written in Python will be installed into the directory - \file{lib-old/} installed as part of the standard library. To use - these, the directory must be added to \code{sys.path}, possibly using - \envvar{PYTHONPATH}. - -:mod:`timing` - --- Measure time intervals to high resolution (use :func:`time.clock` instead). - - -SGI-specific Extension modules -============================== - -The following are SGI specific, and may be out of touch with the current version -of reality. - -:mod:`cl` - --- Interface to the SGI compression library. - -:mod:`sv` - --- Interface to the "simple video" board on SGI Indigo (obsolete hardware). - From python-3000-checkins at python.org Sun Jul 13 14:25:08 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Sun, 13 Jul 2008 14:25:08 +0200 (CEST) Subject: [Python-3000-checkins] r64911 - in python/branches/py3k: Doc/library/test.rst Lib/test/support.py Lib/test/test_struct.py Lib/test/test_warnings.py Message-ID: <20080713122508.6FC4A1E4002@bag.python.org> Author: nick.coghlan Date: Sun Jul 13 14:25:08 2008 New Revision: 64911 Log: Make test.test_support.catch_warnings more robust as discussed on python-dev. Also add explicit tests for it to test_warnings. (forward port of r64910 from trunk) Modified: python/branches/py3k/Doc/library/test.rst python/branches/py3k/Lib/test/support.py python/branches/py3k/Lib/test/test_struct.py python/branches/py3k/Lib/test/test_warnings.py Modified: python/branches/py3k/Doc/library/test.rst ============================================================================== --- python/branches/py3k/Doc/library/test.rst (original) +++ python/branches/py3k/Doc/library/test.rst Sun Jul 13 14:25:08 2008 @@ -211,7 +211,7 @@ Subclass of :exc:`TestSkipped`. Raised when a resource (such as a network connection) is not available. Raised by the :func:`requires` function. -The :mod:`test.test_support` module defines the following constants: +The :mod:`test.support` module defines the following constants: .. data:: verbose @@ -278,20 +278,34 @@ This will run all tests defined in the named module. -.. function:: catch_warning(record=True) +.. function:: catch_warning(module=warnings, record=True) Return a context manager that guards the warnings filter from being - permanently changed and records the data of the last warning that has been - issued. The ``record`` argument specifies whether any raised warnings are - captured by the object returned by :func:`warnings.catch_warning` or allowed - to propagate as normal. + permanently changed and optionally alters the :func:`showwarning` + function to record the details of any warnings that are issued in the + managed context. Attributes of the most recent warning are saved + directly on the context manager, while details of previous warnings + can be retrieved from the ``warnings`` list. - The context manager is typically used like this:: + The context manager is used like this:: with catch_warning() as w: + warnings.simplefilter("always") warnings.warn("foo") assert str(w.message) == "foo" - + warnings.warn("bar") + assert str(w.message) == "bar" + assert str(w.warnings[0].message) == "foo" + assert str(w.warnings[1].message) == "bar" + + By default, the real :mod:`warnings` module is affected - the ability + to select a different module is provided for the benefit of the + :mod:`warnings` module's own unit tests. + The ``record`` argument specifies whether or not the :func:`showwarning` + function is replaced. Note that recording the warnings in this fashion + also prevents them from being written to sys.stderr. If set to ``False``, + the standard handling of warning messages is left in place (however, the + original handling is still restored at the end of the block). .. function:: captured_stdout() @@ -331,3 +345,5 @@ .. method:: EnvironmentVarGuard.unset(envvar) Temporarily unset the environment variable ``envvar``. + + Modified: python/branches/py3k/Lib/test/support.py ============================================================================== --- python/branches/py3k/Lib/test/support.py (original) +++ python/branches/py3k/Lib/test/support.py Sun Jul 13 14:25:08 2008 @@ -368,36 +368,49 @@ class WarningMessage(object): - "Holds the result of the latest showwarning() call" + "Holds the result of a single showwarning() call" + _WARNING_DETAILS = "message category filename lineno line".split() + def __init__(self, message, category, filename, lineno, line=None): + for attr in self._WARNING_DETAILS: + setattr(self, attr, locals()[attr]) + self._category_name = category.__name__ if category else None + + def __str__(self): + return ("{message : %r, category : %r, filename : %r, lineno : %s, " + "line : %r}" % (self.message, self._category_name, + self.filename, self.lineno, self.line)) + +class WarningRecorder(object): + "Records the result of any showwarning calls" def __init__(self): - self.message = None - self.category = None - self.filename = None - self.lineno = None - - def _showwarning(self, message, category, filename, lineno, file=None, - line=None): - self.message = message - self.category = category - self.filename = filename - self.lineno = lineno - self.line = line + self.warnings = [] + self._set_last(None) + + def _showwarning(self, message, category, filename, lineno, + file=None, line=None): + wm = WarningMessage(message, category, filename, lineno, line) + self.warnings.append(wm) + self._set_last(wm) + + def _set_last(self, last_warning): + if last_warning is None: + for attr in WarningMessage._WARNING_DETAILS: + setattr(self, attr, None) + else: + for attr in WarningMessage._WARNING_DETAILS: + setattr(self, attr, getattr(last_warning, attr)) def reset(self): - self._showwarning(*((None,)*6)) + self.warnings = [] + self._set_last(None) def __str__(self): - return ("{message : %r, category : %r, filename : %r, lineno : %s, " - "line : %r}" % (self.message, - self.category.__name__ if self.category else None, - self.filename, self.lineno, self.line)) - + return '[%s]' % (', '.join(map(str, self.warnings))) @contextlib.contextmanager def catch_warning(module=warnings, record=True): - """ - Guard the warnings filter from being permanently changed and record the - data of the last warning that has been issued. + """Guard the warnings filter from being permanently changed and + optionally record the details of any warnings that are issued. Use like this: @@ -405,13 +418,17 @@ warnings.warn("foo") assert str(w.message) == "foo" """ - original_filters = module.filters[:] + original_filters = module.filters original_showwarning = module.showwarning if record: - warning_obj = WarningMessage() - module.showwarning = warning_obj._showwarning + recorder = WarningRecorder() + module.showwarning = recorder._showwarning + else: + recorder = None try: - yield warning_obj if record else None + # Replace the filters with a copy of the original + module.filters = module.filters[:] + yield recorder finally: module.showwarning = original_showwarning module.filters = original_filters @@ -421,7 +438,7 @@ """Context manager to force import to return a new module reference. This is useful for testing module-level behaviours, such as - the emission of a DepreciationWarning on import. + the emission of a DeprecationWarning on import. Use like this: Modified: python/branches/py3k/Lib/test/test_struct.py ============================================================================== --- python/branches/py3k/Lib/test/test_struct.py (original) +++ python/branches/py3k/Lib/test/test_struct.py Sun Jul 13 14:25:08 2008 @@ -35,12 +35,9 @@ @wraps(func) def decorator(*args, **kw): with catch_warning(): - # Grrr, we need this function to warn every time. Without removing - # the warningregistry, running test_tarfile then test_struct would fail - # on 64-bit platforms. - globals = func.__globals__ - if '__warningregistry__' in globals: - del globals['__warningregistry__'] + # We need this function to warn every time, so stick an + # unqualifed 'always' at the head of the filter list + warnings.simplefilter("always") warnings.filterwarnings("error", category=DeprecationWarning) return func(*args, **kw) return decorator @@ -53,7 +50,7 @@ pass except DeprecationWarning: if not PY_STRUCT_OVERFLOW_MASKING: - raise TestFailed("%s%s expected to raise struct.error" % ( + raise TestFailed("%s%s expected to raise DeprecationWarning" % ( func.__name__, args)) else: raise TestFailed("%s%s did not raise error" % ( Modified: python/branches/py3k/Lib/test/test_warnings.py ============================================================================== --- python/branches/py3k/Lib/test/test_warnings.py (original) +++ python/branches/py3k/Lib/test/test_warnings.py Sun Jul 13 14:25:08 2008 @@ -487,6 +487,47 @@ class PyWarningsDisplayTests(BaseTest, WarningsDisplayTests): module = py_warnings +class WarningsSupportTests(object): + """Test the warning tools from test support module""" + + def test_catch_warning_restore(self): + wmod = self.module + orig_filters = wmod.filters + orig_showwarning = wmod.showwarning + with support.catch_warning(wmod): + wmod.filters = wmod.showwarning = object() + self.assert_(wmod.filters is orig_filters) + self.assert_(wmod.showwarning is orig_showwarning) + with support.catch_warning(wmod, record=False): + wmod.filters = wmod.showwarning = object() + self.assert_(wmod.filters is orig_filters) + self.assert_(wmod.showwarning is orig_showwarning) + + def test_catch_warning_recording(self): + wmod = self.module + with support.catch_warning(wmod) as w: + self.assertEqual(w.warnings, []) + wmod.simplefilter("always") + wmod.warn("foo") + self.assertEqual(str(w.message), "foo") + wmod.warn("bar") + self.assertEqual(str(w.message), "bar") + self.assertEqual(str(w.warnings[0].message), "foo") + self.assertEqual(str(w.warnings[1].message), "bar") + w.reset() + self.assertEqual(w.warnings, []) + orig_showwarning = wmod.showwarning + with support.catch_warning(wmod, record=False) as w: + self.assert_(w is None) + self.assert_(wmod.showwarning is orig_showwarning) + + +class CWarningsSupportTests(BaseTest, WarningsSupportTests): + module = c_warnings + +class PyWarningsSupportTests(BaseTest, WarningsSupportTests): + module = py_warnings + def test_main(): py_warnings.onceregistry.clear() @@ -498,6 +539,7 @@ CWCmdLineTests, PyWCmdLineTests, _WarningsTests, CWarningsDisplayTests, PyWarningsDisplayTests, + CWarningsSupportTests, PyWarningsSupportTests, ) From python-3000-checkins at python.org Sun Jul 13 14:29:09 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Sun, 13 Jul 2008 14:29:09 +0200 (CEST) Subject: [Python-3000-checkins] r64912 - python/branches/py3k Message-ID: <20080713122909.340151E4002@bag.python.org> Author: nick.coghlan Date: Sun Jul 13 14:29:08 2008 New Revision: 64912 Log: Blocked revisions 64910 via svnmerge ........ r64910 | nick.coghlan | 2008-07-13 22:23:47 +1000 (Sun, 13 Jul 2008) | 1 line Make test.test_support.catch_warnings more robust as discussed on python-dev. Also add explicit tests for itto test_warnings. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Sun Jul 13 14:38:21 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Sun, 13 Jul 2008 14:38:21 +0200 (CEST) Subject: [Python-3000-checkins] r64914 - python/branches/py3k Message-ID: <20080713123821.787D51E4010@bag.python.org> Author: nick.coghlan Date: Sun Jul 13 14:38:21 2008 New Revision: 64914 Log: Blocked revisions 64913 via svnmerge ........ r64913 | nick.coghlan | 2008-07-13 22:36:42 +1000 (Sun, 13 Jul 2008) | 1 line Correct a couple of errors in the updated catch_warning documentation (the Py3k version was fixed before being checked in) ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Sun Jul 13 19:44:16 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 13 Jul 2008 19:44:16 +0200 (CEST) Subject: [Python-3000-checkins] r64918 - in python/branches/py3k/Lib/test: test_long.py test_long_future.py Message-ID: <20080713174416.72DA51E4002@bag.python.org> Author: benjamin.peterson Date: Sun Jul 13 19:44:16 2008 New Revision: 64918 Log: move test_long_future into test_long Removed: python/branches/py3k/Lib/test/test_long_future.py Modified: python/branches/py3k/Lib/test/test_long.py Modified: python/branches/py3k/Lib/test/test_long.py ============================================================================== --- python/branches/py3k/Lib/test/test_long.py (original) +++ python/branches/py3k/Lib/test/test_long.py Sun Jul 13 19:44:16 2008 @@ -770,6 +770,41 @@ self.assertRaises(OverflowError, int, float('inf')) self.assertRaises(OverflowError, int, float('nan')) + def test_true_division(self): + huge = 1 << 40000 + mhuge = -huge + self.assertEqual(huge / huge, 1.0) + self.assertEqual(mhuge / mhuge, 1.0) + self.assertEqual(huge / mhuge, -1.0) + self.assertEqual(mhuge / huge, -1.0) + self.assertEqual(1 / huge, 0.0) + self.assertEqual(1 / huge, 0.0) + self.assertEqual(1 / mhuge, 0.0) + self.assertEqual(1 / mhuge, 0.0) + self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5) + self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5) + self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5) + self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5) + self.assertEqual(huge / (huge << 1), 0.5) + self.assertEqual((1000000 * huge) / huge, 1000000) + + namespace = {'huge': huge, 'mhuge': mhuge} + + for overflow in ["float(huge)", "float(mhuge)", + "huge / 1", "huge / 2", "huge / -1", "huge / -2", + "mhuge / 100", "mhuge / 200"]: + self.assertRaises(OverflowError, eval, overflow, namespace) + + for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge", + "100 / mhuge", "200 / mhuge"]: + result = eval(underflow, namespace) + self.assertEqual(result, 0.0, + "expected underflow to 0 from %r" % underflow) + + for zero in ["huge / 0", "mhuge / 0"]: + self.assertRaises(ZeroDivisionError, eval, zero, namespace) + + def test_main(): support.run_unittest(LongTest) Deleted: python/branches/py3k/Lib/test/test_long_future.py ============================================================================== --- python/branches/py3k/Lib/test/test_long_future.py Sun Jul 13 19:44:16 2008 +++ (empty file) @@ -1,55 +0,0 @@ -from __future__ import division -# When true division is the default, get rid of this and add it to -# test_long.py instead. In the meantime, it's too obscure to try to -# trick just part of test_long into using future division. - -import unittest -from test.support import run_unittest - -class TrueDivisionTests(unittest.TestCase): - def test(self): - huge = 1 << 40000 - mhuge = -huge - self.assertEqual(huge / huge, 1.0) - self.assertEqual(mhuge / mhuge, 1.0) - self.assertEqual(huge / mhuge, -1.0) - self.assertEqual(mhuge / huge, -1.0) - self.assertEqual(1 / huge, 0.0) - self.assertEqual(1 / huge, 0.0) - self.assertEqual(1 / mhuge, 0.0) - self.assertEqual(1 / mhuge, 0.0) - self.assertEqual((666 * huge + (huge >> 1)) / huge, 666.5) - self.assertEqual((666 * mhuge + (mhuge >> 1)) / mhuge, 666.5) - self.assertEqual((666 * huge + (huge >> 1)) / mhuge, -666.5) - self.assertEqual((666 * mhuge + (mhuge >> 1)) / huge, -666.5) - self.assertEqual(huge / (huge << 1), 0.5) - self.assertEqual((1000000 * huge) / huge, 1000000) - - namespace = {'huge': huge, 'mhuge': mhuge} - - for overflow in ["float(huge)", "float(mhuge)", - "huge / 1", "huge / 2", "huge / -1", "huge / -2", - "mhuge / 100", "mhuge / 200"]: - # XXX(cwinter) this test doesn't pass when converted to - # use assertRaises. - try: - eval(overflow, namespace) - self.fail("expected OverflowError from %r" % overflow) - except OverflowError: - pass - - for underflow in ["1 / huge", "2 / huge", "-1 / huge", "-2 / huge", - "100 / mhuge", "200 / mhuge"]: - result = eval(underflow, namespace) - self.assertEqual(result, 0.0, - "expected underflow to 0 from %r" % underflow) - - for zero in ["huge / 0", "mhuge / 0"]: - self.assertRaises(ZeroDivisionError, eval, zero, namespace) - - -def test_main(): - run_unittest(TrueDivisionTests) - -if __name__ == "__main__": - test_main() From python-3000-checkins at python.org Sun Jul 13 20:32:09 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 13 Jul 2008 20:32:09 +0200 (CEST) Subject: [Python-3000-checkins] r64921 - in python/branches/py3k: Lib/test/test_multiprocessing.py Message-ID: <20080713183209.6942E1E4002@bag.python.org> Author: benjamin.peterson Date: Sun Jul 13 20:32:09 2008 New Revision: 64921 Log: Merged revisions 64920 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64920 | benjamin.peterson | 2008-07-13 13:25:13 -0500 (Sun, 13 Jul 2008) | 1 line remove bytes alias ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_multiprocessing.py Modified: python/branches/py3k/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k/Lib/test/test_multiprocessing.py Sun Jul 13 20:32:09 2008 @@ -36,13 +36,6 @@ else: latin = str -try: - bytes -except NameError: - bytes = str - def bytearray(seq): - return array.array('c', seq) - # # Constants # From python-3000-checkins at python.org Sun Jul 13 20:41:02 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 13 Jul 2008 20:41:02 +0200 (CEST) Subject: [Python-3000-checkins] r64923 - python/branches/py3k Message-ID: <20080713184102.868C41E4002@bag.python.org> Author: benjamin.peterson Date: Sun Jul 13 20:41:02 2008 New Revision: 64923 Log: Blocked revisions 64922 via svnmerge ........ r64922 | benjamin.peterson | 2008-07-13 13:34:58 -0500 (Sun, 13 Jul 2008) | 1 line remove sys.version_info check for 3.0 ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Sun Jul 13 20:45:31 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 13 Jul 2008 20:45:31 +0200 (CEST) Subject: [Python-3000-checkins] r64924 - python/branches/py3k/Lib/test/test_multiprocessing.py Message-ID: <20080713184531.2B6AF1E4002@bag.python.org> Author: benjamin.peterson Date: Sun Jul 13 20:45:30 2008 New Revision: 64924 Log: remove 3.0 conditional Modified: python/branches/py3k/Lib/test/test_multiprocessing.py Modified: python/branches/py3k/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k/Lib/test/test_multiprocessing.py Sun Jul 13 20:45:30 2008 @@ -30,11 +30,8 @@ # # -if sys.version_info >= (3, 0): - def latin(s): - return s.encode('latin') -else: - latin = str +def latin(s): + return s.encode('latin') # # Constants From python-3000-checkins at python.org Sun Jul 13 20:48:30 2008 From: python-3000-checkins at python.org (alexandre.vassalotti) Date: Sun, 13 Jul 2008 20:48:30 +0200 (CEST) Subject: [Python-3000-checkins] r64925 - python/branches/py3k/Modules/_pickle.c Message-ID: <20080713184830.6EDC21E4002@bag.python.org> Author: alexandre.vassalotti Date: Sun Jul 13 20:48:30 2008 New Revision: 64925 Log: Fixed _pickle to use Py_EnterRecursiveCall(). Modified: python/branches/py3k/Modules/_pickle.c Modified: python/branches/py3k/Modules/_pickle.c ============================================================================== --- python/branches/py3k/Modules/_pickle.c (original) +++ python/branches/py3k/Modules/_pickle.c Sun Jul 13 20:48:30 2008 @@ -304,9 +304,6 @@ PyObject *arg; int proto; /* Pickle protocol number, >= 0 */ int bin; /* Boolean, true if proto > 0 */ - int nesting; /* Current nesting level, this is to guard - save() from going into infinite recursion - and segfaulting. */ int buf_size; /* Size of the current buffered pickle data */ char *write_buf; /* Write buffer, this is to avoid calling the write() method of the output stream too @@ -2075,12 +2072,8 @@ PyObject *memo_key = NULL; int status = 0; - /* XXX: Use Py_EnterRecursiveCall()? */ - if (++self->nesting > Py_GetRecursionLimit()) { - PyErr_SetString(PyExc_RuntimeError, - "maximum recursion depth exceeded"); - goto error; - } + if (Py_EnterRecursiveCall(" while pickling an object") < 0) + return -1; /* The extra pers_save argument is necessary to avoid calling save_pers() on its returned object. */ @@ -2273,7 +2266,7 @@ status = -1; } done: - self->nesting--; + Py_LeaveRecursiveCall(); Py_XDECREF(memo_key); Py_XDECREF(reduce_func); Py_XDECREF(reduce_value); @@ -2440,7 +2433,6 @@ self->proto = proto; self->bin = proto > 0; self->arg = NULL; - self->nesting = 0; self->fast = 0; self->fast_nesting = 0; self->fast_memo = NULL; From python-3000-checkins at python.org Sun Jul 13 23:57:48 2008 From: python-3000-checkins at python.org (alexandre.vassalotti) Date: Sun, 13 Jul 2008 23:57:48 +0200 (CEST) Subject: [Python-3000-checkins] r64931 - in python/branches/py3k/Modules/_sqlite: connection.c cursor.c Message-ID: <20080713215748.8E8001E4002@bag.python.org> Author: alexandre.vassalotti Date: Sun Jul 13 23:57:48 2008 New Revision: 64931 Log: Forward port r64930. Fix one more case in cursor.c. Modified: python/branches/py3k/Modules/_sqlite/connection.c python/branches/py3k/Modules/_sqlite/cursor.c Modified: python/branches/py3k/Modules/_sqlite/connection.c ============================================================================== --- python/branches/py3k/Modules/_sqlite/connection.c (original) +++ python/branches/py3k/Modules/_sqlite/connection.c Sun Jul 13 23:57:48 2008 @@ -944,19 +944,16 @@ _pysqlite_seterror(self->db, NULL); } - Py_DECREF(statement); - statement = 0; + Py_CLEAR(statement); } else { weakref = PyWeakref_NewRef((PyObject*)statement, NULL); if (!weakref) { - Py_DECREF(statement); - statement = 0; + Py_CLEAR(statement); goto error; } if (PyList_Append(self->statements, weakref) != 0) { - Py_DECREF(weakref); - statement = 0; + Py_CLEAR(weakref); goto error; } @@ -980,15 +977,13 @@ method = PyObject_GetAttrString(cursor, "execute"); if (!method) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); goto error; } result = PyObject_CallObject(method, args); if (!result) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); } error: @@ -1011,15 +1006,13 @@ method = PyObject_GetAttrString(cursor, "executemany"); if (!method) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); goto error; } result = PyObject_CallObject(method, args); if (!result) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); } error: @@ -1042,15 +1035,13 @@ method = PyObject_GetAttrString(cursor, "executescript"); if (!method) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); goto error; } result = PyObject_CallObject(method, args); if (!result) { - Py_DECREF(cursor); - cursor = 0; + Py_CLEAR(cursor); } error: Modified: python/branches/py3k/Modules/_sqlite/cursor.c ============================================================================== --- python/branches/py3k/Modules/_sqlite/cursor.c (original) +++ python/branches/py3k/Modules/_sqlite/cursor.c Sun Jul 13 23:57:48 2008 @@ -1,6 +1,6 @@ /* cursor.c - the cursor type * - * Copyright (C) 2004-2007 Gerhard H?ring + * Copyright (C) 2004-2007 Gerhard H??ring * * This file is part of pysqlite. * @@ -529,7 +529,7 @@ } rc = pysqlite_statement_create(self->statement, self->connection, operation); if (rc != SQLITE_OK) { - self->statement = 0; + Py_CLEAR(self->statement); goto error; } } @@ -602,7 +602,7 @@ } rc = pysqlite_statement_create(self->statement, self->connection, operation); if (rc != SQLITE_OK) { - self->statement = 0; + Py_CLEAR(self->statement); goto error; } } @@ -711,8 +711,7 @@ self->next_row = _pysqlite_fetch_one_row(self); } else if (rc == SQLITE_DONE && !multiple) { pysqlite_statement_reset(self->statement); - Py_DECREF(self->statement); - self->statement = 0; + Py_CLEAR(self->statement); } switch (statement_type) { @@ -1013,8 +1012,7 @@ if (self->statement) { (void)pysqlite_statement_reset(self->statement); - Py_DECREF(self->statement); - self->statement = 0; + Py_CLEAR(self->statement); } Py_INCREF(Py_None); From python-3000-checkins at python.org Mon Jul 14 00:19:10 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Mon, 14 Jul 2008 00:19:10 +0200 (CEST) Subject: [Python-3000-checkins] r64933 - python/branches/py3k Message-ID: <20080713221910.4789A1E400A@bag.python.org> Author: benjamin.peterson Date: Mon Jul 14 00:19:10 2008 New Revision: 64933 Log: Blocked revisions 64930 via svnmerge ........ r64930 | alexandre.vassalotti | 2008-07-13 16:47:59 -0500 (Sun, 13 Jul 2008) | 3 lines Issue #3153: sqlite leaks on error. Changed statements of the form Py_DECREF(obj), obj = 0 to Py_CLEAR(obj). ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Mon Jul 14 00:26:51 2008 From: python-3000-checkins at python.org (alexandre.vassalotti) Date: Mon, 14 Jul 2008 00:26:51 +0200 (CEST) Subject: [Python-3000-checkins] r64934 - python/branches/py3k/Doc/c-api/function.rst Message-ID: <20080713222651.3F76B1E4002@bag.python.org> Author: alexandre.vassalotti Date: Mon Jul 14 00:26:50 2008 New Revision: 64934 Log: Added documentation for PyFunction_GetAnnotations() and PyFunction_SetAnnotations(). Modified: python/branches/py3k/Doc/c-api/function.rst Modified: python/branches/py3k/Doc/c-api/function.rst ============================================================================== --- python/branches/py3k/Doc/c-api/function.rst (original) +++ python/branches/py3k/Doc/c-api/function.rst Mon Jul 14 00:26:50 2008 @@ -81,3 +81,15 @@ *Py_None* or a tuple of cell objects. Raises :exc:`SystemError` and returns ``-1`` on failure. + + +.. cfunction:: PyObject *PyFunction_GetAnnotations(PyObject *op) + + Return the annotations of the function object *op*. This can be a + mutable dictionary or *NULL*. + + +.. cfunction:: int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations) + + Set the annotations for the function object *op*. *annotations* + must be a dictionary or *Py_None*. From python-3000-checkins at python.org Mon Jul 14 00:28:42 2008 From: python-3000-checkins at python.org (alexandre.vassalotti) Date: Mon, 14 Jul 2008 00:28:42 +0200 (CEST) Subject: [Python-3000-checkins] r64935 - python/branches/py3k/Doc/c-api/function.rst Message-ID: <20080713222842.61EF01E4002@bag.python.org> Author: alexandre.vassalotti Date: Mon Jul 14 00:28:42 2008 New Revision: 64935 Log: Mention the behaviour of PyFunction_SetAnnotations() on error. Modified: python/branches/py3k/Doc/c-api/function.rst Modified: python/branches/py3k/Doc/c-api/function.rst ============================================================================== --- python/branches/py3k/Doc/c-api/function.rst (original) +++ python/branches/py3k/Doc/c-api/function.rst Mon Jul 14 00:28:42 2008 @@ -93,3 +93,5 @@ Set the annotations for the function object *op*. *annotations* must be a dictionary or *Py_None*. + + Raises :exc:`SystemError` and returns ``-1`` on failure. From alexandre at peadrop.com Mon Jul 14 00:31:59 2008 From: alexandre at peadrop.com (Alexandre Vassalotti) Date: Sun, 13 Jul 2008 18:31:59 -0400 Subject: [Python-3000-checkins] r64933 - python/branches/py3k In-Reply-To: <20080713221910.4789A1E400A@bag.python.org> References: <20080713221910.4789A1E400A@bag.python.org> Message-ID: I thought I had done that... and well it seems not. Thanks Benjamin! -- Alexandre On Sun, Jul 13, 2008 at 6:19 PM, benjamin.peterson wrote: > Author: benjamin.peterson > Date: Mon Jul 14 00:19:10 2008 > New Revision: 64933 > > Log: > Blocked revisions 64930 via svnmerge > > ........ > r64930 | alexandre.vassalotti | 2008-07-13 16:47:59 -0500 (Sun, 13 Jul 2008) | 3 lines > > Issue #3153: sqlite leaks on error. > Changed statements of the form Py_DECREF(obj), obj = 0 to Py_CLEAR(obj). > ........ > > > Modified: > python/branches/py3k/ (props changed) From python-3000-checkins at python.org Mon Jul 14 12:13:32 2008 From: python-3000-checkins at python.org (robert.schuppenies) Date: Mon, 14 Jul 2008 12:13:32 +0200 (CEST) Subject: [Python-3000-checkins] r64946 - in python/branches/py3k: Doc/library/sys.rst Lib/test/test_sys.py Modules/_testcapimodule.c Objects/bytearrayobject.c Objects/frameobject.c Objects/longobject.c Objects/setobject.c Objects/unicodeobject.c Python/sysmodule.c Message-ID: <20080714101332.575CA1E4002@bag.python.org> Author: robert.schuppenies Date: Mon Jul 14 12:13:31 2008 New Revision: 64946 Log: Merged revisions 64842,64853,64856,64945 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64842 | robert.schuppenies | 2008-07-10 15:43:26 +0200 (Thu, 10 Jul 2008) | 2 lines Fixed Issue3122 and extended sys.getsizeof tests for built-in types. ........ r64853 | robert.schuppenies | 2008-07-10 17:24:04 +0200 (Thu, 10 Jul 2008) | 3 lines Added additional __sizeof__ implementations and addressed comments made in Issue3122. ........ r64856 | robert.schuppenies | 2008-07-10 19:13:55 +0200 (Thu, 10 Jul 2008) | 3 lines Added garbage collector overhead and optional default return value to sys.getsizeof. ........ r64945 | robert.schuppenies | 2008-07-14 10:42:18 +0200 (Mon, 14 Jul 2008) | 2 lines Fixed test failure on Win64 machines. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/sys.rst python/branches/py3k/Lib/test/test_sys.py python/branches/py3k/Modules/_testcapimodule.c python/branches/py3k/Objects/bytearrayobject.c python/branches/py3k/Objects/frameobject.c python/branches/py3k/Objects/longobject.c python/branches/py3k/Objects/setobject.c python/branches/py3k/Objects/unicodeobject.c python/branches/py3k/Python/sysmodule.c Modified: python/branches/py3k/Doc/library/sys.rst ============================================================================== --- python/branches/py3k/Doc/library/sys.rst (original) +++ python/branches/py3k/Doc/library/sys.rst Mon Jul 14 12:13:31 2008 @@ -331,13 +331,20 @@ :func:`setrecursionlimit`. -.. function:: getsizeof(object) +.. function:: getsizeof(object[, default]) Return the size of an object in bytes. The object can be any type of object. All built-in objects will return correct results, but this - does not have to hold true for third-party extensions as it is implementation + does not have to hold true for third-party extensions as it is implementation specific. + The *default* argument allows to define a value which will be returned + if the object type does not provide means to retrieve the size and would + cause a `TypeError`. + + func:`getsizeof` calls the object's __sizeof__ method and adds an additional + garbage collector overhead if the object is managed by the garbage collector. + .. versionadded:: 2.6 Modified: python/branches/py3k/Lib/test/test_sys.py ============================================================================== --- python/branches/py3k/Lib/test/test_sys.py (original) +++ python/branches/py3k/Lib/test/test_sys.py Mon Jul 14 12:13:31 2008 @@ -373,6 +373,9 @@ class SizeofTest(unittest.TestCase): + TPFLAGS_HAVE_GC = 1<<14 + TPFLAGS_HEAPTYPE = 1<<9 + def setUp(self): self.c = len(struct.pack('c', ' ')) self.H = len(struct.pack('H', 0)) @@ -382,22 +385,27 @@ # due to missing size_t information from struct, it is assumed that # sizeof(Py_ssize_t) = sizeof(void*) self.header = 'PP' + self.vheader = self.header + 'P' if hasattr(sys, "gettotalrefcount"): self.header += '2P' + self.vheader += '2P' + import _testcapi + self.gc_headsize = _testcapi.SIZEOF_PYGC_HEAD self.file = open(test.support.TESTFN, 'wb') def tearDown(self): self.file.close() test.support.unlink(test.support.TESTFN) - def check_sizeof(self, o, size, size2=None): - """Check size of o. Possible are size and optionally size2).""" + def check_sizeof(self, o, size): result = sys.getsizeof(o) - msg = 'wrong size for %s: got %d, expected ' % (type(o), result) - if (size2 != None) and (result != size): - self.assertEqual(result, size2, msg + str(size2)) - else: - self.assertEqual(result, size, msg + str(size)) + # add GC header size + if ((type(o) == type) and (o.__flags__ & self.TPFLAGS_HEAPTYPE) or\ + ((type(o) != type) and (type(o).__flags__ & self.TPFLAGS_HAVE_GC))): + size += self.gc_headsize + msg = 'wrong size for %s: got %d, expected %d' \ + % (type(o), result, size) + self.assertEqual(result, size, msg) def calcsize(self, fmt): """Wrapper around struct.calcsize which enforces the alignment of the @@ -408,29 +416,116 @@ """ return struct.calcsize(fmt + '0P') - def test_standardtypes(self): + def test_gc_head_size(self): + # Check that the gc header size is added to objects tracked by the gc. + h = self.header + vh = self.vheader + size = self.calcsize + gc_header_size = self.gc_headsize + # bool objects are not gc tracked + self.assertEqual(sys.getsizeof(True), size(vh) + self.H) + # but lists are + self.assertEqual(sys.getsizeof([]), size(vh + 'PP') + gc_header_size) + + def test_default(self): h = self.header + vh = self.vheader size = self.calcsize + self.assertEqual(sys.getsizeof(True), size(vh) + self.H) + self.assertEqual(sys.getsizeof(True, -1), size(vh) + self.H) + + def test_objecttypes(self): + # check all types defined in Objects/ + h = self.header + vh = self.vheader + size = self.calcsize + check = self.check_sizeof + # bool + check(True, size(vh) + self.H) + # buffer + # XXX + # builtin_function_or_method + check(len, size(h + '3P')) + # bytearray + samples = [b'', b'u'*100000] + for sample in samples: + x = bytearray(sample) + check(x, size(vh + 'iPP') + x.__alloc__() * self.c) + # bytearray_iterator + check(iter(bytearray()), size(h + 'PP')) # cell def get_cell(): x = 42 def inner(): return x return inner - self.check_sizeof(get_cell().__closure__[0], size(h + 'P')) + check(get_cell().__closure__[0], size(h + 'P')) # code - self.check_sizeof(get_cell().__code__, size(h + '5i8Pi2P')) + check(get_cell().__code__, size(h + '5i8Pi2P')) # complex - self.check_sizeof(complex(0,1), size(h + '2d')) + check(complex(0,1), size(h + '2d')) + # method_descriptor (descriptor object) + check(str.lower, size(h + '2PP')) + # classmethod_descriptor (descriptor object) + # XXX + # member_descriptor (descriptor object) + import datetime + check(datetime.timedelta.days, size(h + '2PP')) + # getset_descriptor (descriptor object) + import collections + check(collections.defaultdict.default_factory, size(h + '2PP')) + # wrapper_descriptor (descriptor object) + check(int.__add__, size(h + '2P2P')) + # method-wrapper (descriptor object) + check({}.__iter__, size(h + '2P')) + # dict + check({}, size(h + '3P2P' + 8*'P2P')) + longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} + check(longdict, size(h + '3P2P' + 8*'P2P') + 16*size('P2P')) + # dictionary-keyiterator + check({}.keys(), size(h + 'P')) + # dictionary-valueiterator + check({}.values(), size(h + 'P')) + # dictionary-itemiterator + check({}.items(), size(h + 'P')) + # dictproxy + class C(object): pass + check(C.__dict__, size(h + 'P')) + # BaseException + check(BaseException(), size(h + '5P')) + # UnicodeEncodeError + check(UnicodeEncodeError("", "", 0, 0, ""), size(h + '5P 2P2PP')) + # UnicodeDecodeError + # XXX +# check(UnicodeDecodeError("", "", 0, 0, ""), size(h + '5P2PP')) + # UnicodeTranslateError + check(UnicodeTranslateError("", 0, 1, ""), size(h + '5P 2P2PP')) + # ellipses + check(Ellipsis, size(h + '')) + # EncodingMap + import codecs, encodings.iso8859_3 + x = codecs.charmap_build(encodings.iso8859_3.decoding_table) + check(x, size(h + '32B2iB')) # enumerate - self.check_sizeof(enumerate([]), size(h + 'l3P')) + check(enumerate([]), size(h + 'l3P')) # reverse - self.check_sizeof(reversed(''), size(h + 'PP')) + check(reversed(''), size(h + 'PP')) # float - self.check_sizeof(float(0), size(h + 'd')) + check(float(0), size(h + 'd')) + # sys.floatinfo + check(sys.float_info, size(vh) + self.P * len(sys.float_info)) + # frame + import inspect + CO_MAXBLOCKS = 20 + x = inspect.currentframe() + ncells = len(x.f_code.co_cellvars) + nfrees = len(x.f_code.co_freevars) + extras = x.f_code.co_stacksize + x.f_code.co_nlocals +\ + ncells + nfrees - 1 + check(x, size(vh + '12P3i' + CO_MAXBLOCKS*'3i' + 'P' + extras*'P')) # function def func(): pass - self.check_sizeof(func, size(h + '11P')) + check(func, size(h + '11P')) class c(): @staticmethod def foo(): @@ -439,40 +534,99 @@ def bar(cls): pass # staticmethod - self.check_sizeof(foo, size(h + 'P')) + check(foo, size(h + 'P')) # classmethod - self.check_sizeof(bar, size(h + 'P')) + check(bar, size(h + 'P')) # generator def get_gen(): yield 1 - self.check_sizeof(get_gen(), size(h + 'Pi2P')) - # builtin_function_or_method - self.check_sizeof(abs, size(h + '3P')) + check(get_gen(), size(h + 'Pi2P')) + # iterator + check(iter('abc'), size(h + 'lP')) + # callable-iterator + import re + check(re.finditer('',''), size(h + '2P')) + # list + samples = [[], [1,2,3], ['1', '2', '3']] + for sample in samples: + check(sample, size(vh + 'PP') + len(sample)*self.P) + # sortwrapper (list) + # XXX + # cmpwrapper (list) + # XXX + # listiterator (list) + check(iter([]), size(h + 'lP')) + # listreverseiterator (list) + check(reversed([]), size(h + 'lP')) + # long + check(0, size(vh)) + check(1, size(vh) + self.H) + check(-1, size(vh) + self.H) + check(32768, size(vh) + 2*self.H) + check(32768*32768-1, size(vh) + 2*self.H) + check(32768*32768, size(vh) + 3*self.H) + # memory + check(memoryview(b''), size(h + 'P P2P2i5P')) # module - self.check_sizeof(unittest, size(h + '3P')) + check(unittest, size(h + '3P')) + # None + check(None, size(h + '')) + # NotImplementedType + check(NotImplemented, size(h)) + # object + check(object(), size(h + '')) + # property (descriptor object) + class C(object): + def getx(self): return self.__x + def setx(self, value): self.__x = value + def delx(self): del self.__x + x = property(getx, setx, delx, "") + check(x, size(h + '4Pi')) + # PyCObject + # XXX + # rangeiterator + check(iter(range(1)), size(h + '4l')) + # reverse + check(reversed(''), size(h + 'PP')) # range - self.check_sizeof(range(1), size(h + '3P')) + check(range(1), size(h + '3P')) + check(range(66000), size(h + '3l')) + # set + # frozenset + PySet_MINSIZE = 8 + samples = [[], range(10), range(50)] + s = size(h + '3P2P' + PySet_MINSIZE*'lP' + 'lP') + for sample in samples: + minused = len(sample) + if minused == 0: tmp = 1 + # the computation of minused is actually a bit more complicated + # but this suffices for the sizeof test + minused = minused*2 + newsize = PySet_MINSIZE + while newsize <= minused: + newsize = newsize << 1 + if newsize <= 8: + check(set(sample), s) + check(frozenset(sample), s) + else: + check(set(sample), s + newsize*struct.calcsize('lP')) + check(frozenset(sample), s + newsize*struct.calcsize('lP')) + # setiterator + check(iter(set()), size(h + 'P3P')) # slice - self.check_sizeof(slice(0), size(h + '3P')) - - h += 'P' - # bool - self.check_sizeof(True, size(h + 'H')) - # new-style class - class class_newstyle(object): - def method(): - pass - # type (PyTypeObject + PyNumberMethods + PyMappingMethods + - # PySequenceMethods + PyBufferProcs) - self.check_sizeof(class_newstyle, size(h + 'P2P15Pl4PP9PP11PI') +\ - size('16Pi17P 3P 10P 2P 2P')) - - def test_specialtypes(self): - h = self.header - size = self.calcsize - # dict - self.check_sizeof({}, size(h + '3P2P') + 8*size('P2P')) - longdict = {1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} - self.check_sizeof(longdict, size(h + '3P2P') + (8+16)*size('P2P')) + check(slice(0), size(h + '3P')) + # super + check(super(int), size(h + '3P')) + # tuple + check((), size(vh)) + check((1,2,3), size(vh) + 3*self.P) + # type + # (PyTypeObject + PyNumberMethods + PyMappingMethods + + # PySequenceMethods + PyBufferProcs) + s = size(vh + 'P2P15Pl4PP9PP11PI') + size('16Pi17P 3P 10P 2P 2P') + check(int, s) + # class + class newstyleclass(object): pass + check(newstyleclass, s) # unicode usize = len('\0'.encode('unicode-internal')) samples = ['', '1'*100] @@ -480,31 +634,38 @@ # has been cached for s in samples: basicsize = size(h + 'PPliP') + usize * (len(s) + 1) - defenc = bytes(s, 'ascii') - self.check_sizeof(s, basicsize, - size2=basicsize + sys.getsizeof(defenc)) - # trigger caching encoded version as bytes object - try: - getattr(sys, s) - except AttributeError: - pass - finally: - self.check_sizeof(s, basicsize + sys.getsizeof(defenc)) + check(s, basicsize) + # weakref + import weakref + check(weakref.ref(int), size(h + '2Pl2P')) + # weakproxy + # XXX + # weakcallableproxy + check(weakref.proxy(int), size(h + '2Pl2P')) - h += 'P' - # list - self.check_sizeof([], size(h + 'PP')) - self.check_sizeof([1, 2, 3], size(h + 'PP') + 3*self.P) - # long - self.check_sizeof(0, size(h + 'H')) - self.check_sizeof(1, size(h + 'H')) - self.check_sizeof(-1, size(h + 'H')) - self.check_sizeof(32768, size(h + 'H') + self.H) - self.check_sizeof(32768*32768-1, size(h + 'H') + self.H) - self.check_sizeof(32768*32768, size(h + 'H') + 2*self.H) - # tuple - self.check_sizeof((), size(h)) - self.check_sizeof((1,2,3), size(h) + 3*self.P) + def test_pythontypes(self): + # check all types defined in Python/ + h = self.header + vh = self.vheader + size = self.calcsize + check = self.check_sizeof + # _ast.AST + import _ast + check(_ast.AST(), size(h + '')) + # imp.NullImporter + import imp + check(imp.NullImporter(self.file.name), size(h + '')) + try: + raise TypeError + except TypeError: + tb = sys.exc_info()[2] + # traceback + if tb != None: + check(tb, size(h + '2P2i')) + # symtable entry + # XXX + # sys.flags + check(sys.flags, size(vh) + self.P * len(sys.flags)) def test_main(): Modified: python/branches/py3k/Modules/_testcapimodule.c ============================================================================== --- python/branches/py3k/Modules/_testcapimodule.c (original) +++ python/branches/py3k/Modules/_testcapimodule.c Mon Jul 14 12:13:31 2008 @@ -1182,6 +1182,7 @@ PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN)); + PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head))); TestError = PyErr_NewException("_testcapi.error", NULL, NULL); Py_INCREF(TestError); Modified: python/branches/py3k/Objects/bytearrayobject.c ============================================================================== --- python/branches/py3k/Objects/bytearrayobject.c (original) +++ python/branches/py3k/Objects/bytearrayobject.c Mon Jul 14 12:13:31 2008 @@ -3033,6 +3033,19 @@ return Py_BuildValue("(O(Ns)N)", Py_TYPE(self), latin1, "latin-1", dict); } +PyDoc_STRVAR(sizeof_doc, +"B.__sizeof__() -> int\n\ + \n\ +Returns the size of B in memory, in bytes"); +static PyObject * +bytes_sizeof(PyByteArrayObject *self) +{ + Py_ssize_t res; + + res = sizeof(PyByteArrayObject) + self->ob_alloc * sizeof(char); + return PyLong_FromSsize_t(res); +} + static PySequenceMethods bytes_as_sequence = { (lenfunc)bytes_length, /* sq_length */ (binaryfunc)PyByteArray_Concat, /* sq_concat */ @@ -3061,6 +3074,7 @@ bytes_methods[] = { {"__alloc__", (PyCFunction)bytes_alloc, METH_NOARGS, alloc_doc}, {"__reduce__", (PyCFunction)bytes_reduce, METH_NOARGS, reduce_doc}, + {"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS, sizeof_doc}, {"append", (PyCFunction)bytes_append, METH_O, append__doc__}, {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, _Py_capitalize__doc__}, Modified: python/branches/py3k/Objects/frameobject.c ============================================================================== --- python/branches/py3k/Objects/frameobject.c (original) +++ python/branches/py3k/Objects/frameobject.c Mon Jul 14 12:13:31 2008 @@ -513,6 +513,29 @@ } } +static PyObject * +frame_sizeof(PyFrameObject *f) +{ + Py_ssize_t res, extras, ncells, nfrees; + + ncells = PyTuple_GET_SIZE(f->f_code->co_cellvars); + nfrees = PyTuple_GET_SIZE(f->f_code->co_freevars); + extras = f->f_code->co_stacksize + f->f_code->co_nlocals + + ncells + nfrees; + // subtract one as it is already included in PyFrameObject + res = sizeof(PyFrameObject) + (extras-1) * sizeof(PyObject *); + + return PyLong_FromSsize_t(res); +} + +PyDoc_STRVAR(sizeof__doc__, +"F.__sizeof__() -> size of F in memory, in bytes"); + +static PyMethodDef frame_methods[] = { + {"__sizeof__", (PyCFunction)frame_sizeof, METH_NOARGS, + sizeof__doc__}, + {NULL, NULL} /* sentinel */ +}; PyTypeObject PyFrame_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) @@ -542,7 +565,7 @@ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + frame_methods, /* tp_methods */ frame_memberlist, /* tp_members */ frame_getsetlist, /* tp_getset */ 0, /* tp_base */ Modified: python/branches/py3k/Objects/longobject.c ============================================================================== --- python/branches/py3k/Objects/longobject.c (original) +++ python/branches/py3k/Objects/longobject.c Mon Jul 14 12:13:31 2008 @@ -3638,9 +3638,7 @@ { Py_ssize_t res; - res = sizeof(PyLongObject) + abs(Py_SIZE(v)) * sizeof(digit); - if (Py_SIZE(v) != 0) - res -= sizeof(digit); + res = sizeof(PyVarObject) + abs(Py_SIZE(v))*sizeof(digit); return PyLong_FromSsize_t(res); } Modified: python/branches/py3k/Objects/setobject.c ============================================================================== --- python/branches/py3k/Objects/setobject.c (original) +++ python/branches/py3k/Objects/setobject.c Mon Jul 14 12:13:31 2008 @@ -1944,6 +1944,18 @@ PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); +static PyObject * +set_sizeof(PySetObject *so) +{ + Py_ssize_t res; + + res = sizeof(PySetObject); + if (so->table != so->smalltable) + res = res + (so->mask + 1) * sizeof(setentry); + return PyLong_FromSsize_t(res); +} + +PyDoc_STRVAR(sizeof_doc, "S.__sizeof__() -> size of S in memory, in bytes"); static int set_init(PySetObject *self, PyObject *args, PyObject *kwds) { @@ -2011,6 +2023,8 @@ reduce_doc}, {"remove", (PyCFunction)set_remove, METH_O, remove_doc}, + {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS, + sizeof_doc}, {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O, symmetric_difference_doc}, {"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update, METH_O, @@ -2127,6 +2141,8 @@ issuperset_doc}, {"__reduce__", (PyCFunction)set_reduce, METH_NOARGS, reduce_doc}, + {"__sizeof__", (PyCFunction)set_sizeof, METH_NOARGS, + sizeof_doc}, {"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O, symmetric_difference_doc}, {"union", (PyCFunction)set_union, METH_VARARGS, Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Mon Jul 14 12:13:31 2008 @@ -8350,20 +8350,8 @@ static PyObject * unicode__sizeof__(PyUnicodeObject *v) { - PyObject *res = NULL, *defsize = NULL; - - res = PyLong_FromSsize_t(sizeof(PyUnicodeObject) + - sizeof(Py_UNICODE) * (v->length + 1)); - if (v->defenc) { - defsize = PyObject_CallMethod(v->defenc, "__sizeof__", NULL); - if (defsize == NULL) { - Py_DECREF(res); - return NULL; - } - res = PyNumber_Add(res, defsize); - Py_DECREF(defsize); - } - return res; + return PyLong_FromSsize_t(sizeof(PyUnicodeObject) + + sizeof(Py_UNICODE) * (v->length + 1)); } PyDoc_STRVAR(sizeof__doc__, Modified: python/branches/py3k/Python/sysmodule.c ============================================================================== --- python/branches/py3k/Python/sysmodule.c (original) +++ python/branches/py3k/Python/sysmodule.c Mon Jul 14 12:13:31 2008 @@ -610,9 +610,16 @@ #endif /* USE_MALLOPT */ static PyObject * -sys_getsizeof(PyObject *self, PyObject *args) +sys_getsizeof(PyObject *self, PyObject *args, PyObject *kwds) { - static PyObject * str__sizeof__ = NULL; + PyObject *res = NULL; + static PyObject *str__sizeof__, *gc_head_size = NULL; + static char *kwlist[] = {"object", "default", 0}; + PyObject *o, *dflt = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", + kwlist, &o, &dflt)) + return NULL; /* Initialize static variable needed by _PyType_Lookup */ if (str__sizeof__ == NULL) { @@ -621,24 +628,47 @@ return NULL; } - /* Type objects */ - if (PyType_Check(args)){ - PyObject *method = _PyType_Lookup(Py_TYPE(args), - str__sizeof__); - if (method == NULL) { - PyErr_Format(PyExc_TypeError, - "Type %.100s doesn't define __sizeof__", - Py_TYPE(args)->tp_name); + /* Initialize static variable for GC head size */ + if (gc_head_size == NULL) { + gc_head_size = PyLong_FromSsize_t(sizeof(PyGC_Head)); + if (gc_head_size == NULL) return NULL; - } - return PyObject_CallFunctionObjArgs(method, args, NULL); - } + } + + /* Make sure the type is initialized. float gets initialized late */ + if (PyType_Ready(Py_TYPE(o)) < 0) + return NULL; + + PyObject *method = _PyType_Lookup(Py_TYPE(o), str__sizeof__); + if (method == NULL) + PyErr_Format(PyExc_TypeError, + "Type %.100s doesn't define __sizeof__", + Py_TYPE(o)->tp_name); else - return PyObject_CallMethod(args, "__sizeof__", NULL); + res = PyObject_CallFunctionObjArgs(method, o, NULL); + + /* Has a default value been given */ + if ((res == NULL) && (dflt != NULL) && + PyErr_ExceptionMatches(PyExc_TypeError)) + { + PyErr_Clear(); + Py_INCREF(dflt); + return dflt; + } + else if (res == NULL) + return res; + + /* add gc_head size */ + if (PyObject_IS_GC(o)) { + PyObject *tmp = res; + res = PyNumber_Add(tmp, gc_head_size); + Py_DECREF(tmp); + } + return res; } PyDoc_STRVAR(getsizeof_doc, -"getsizeof(object) -> int\n\ +"getsizeof(object, default) -> int\n\ \n\ Return the size of object in bytes."); @@ -845,7 +875,8 @@ {"getrefcount", (PyCFunction)sys_getrefcount, METH_O, getrefcount_doc}, {"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS, getrecursionlimit_doc}, - {"getsizeof", sys_getsizeof, METH_O, getsizeof_doc}, + {"getsizeof", (PyCFunction)sys_getsizeof, + METH_VARARGS | METH_KEYWORDS, getsizeof_doc}, {"_getframe", sys_getframe, METH_VARARGS, getframe_doc}, #ifdef MS_WINDOWS {"getwindowsversion", (PyCFunction)sys_getwindowsversion, METH_NOARGS, From python-3000-checkins at python.org Mon Jul 14 16:32:16 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Mon, 14 Jul 2008 16:32:16 +0200 (CEST) Subject: [Python-3000-checkins] r64947 - in python/branches/py3k: Doc/library/gettext.rst Lib/gettext.py Lib/test/test_gettext.py Misc/NEWS Message-ID: <20080714143216.30BCD1E4002@bag.python.org> Author: benjamin.peterson Date: Mon Jul 14 16:32:15 2008 New Revision: 64947 Log: #2512 implement the 3.0 gettext API All the u* gettext variants were renamed to their none u* variants, since there's no point in translating to byte strings. I also killed off the unicode parameters for install Modified: python/branches/py3k/Doc/library/gettext.rst python/branches/py3k/Lib/gettext.py python/branches/py3k/Lib/test/test_gettext.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Doc/library/gettext.rst ============================================================================== --- python/branches/py3k/Doc/library/gettext.rst (original) +++ python/branches/py3k/Doc/library/gettext.rst Mon Jul 14 16:32:15 2008 @@ -187,12 +187,11 @@ :class:`NullTranslations` instance if *fallback* is true. -.. function:: install(domain[, localedir[, unicode [, codeset[, names]]]]) +.. function:: install(domain[, localedir [, codeset[, names]]]]) This installs the function :func:`_` in Python's builtin namespace, based on *domain*, *localedir*, and *codeset* which are passed to the function - :func:`translation`. The *unicode* flag is passed to the resulting translation - object's :meth:`install` method. + :func:`translation`. For the *names* parameter, please see the description of the translation object's :meth:`install` method. @@ -227,107 +226,91 @@ ``None``. - .. method:: _parse(fp) - - No-op'd in the base class, this method takes file object *fp*, and reads - the data from the file, initializing its message catalog. If you have an - unsupported message catalog file format, you should override this method - to parse your format. - + .. method:: NullTranslations._parse(fp) - .. method:: add_fallback(fallback) + No-op'd in the base class, this method takes file object *fp*, and reads the + data from the file, initializing its message catalog. If you have an + unsupported message catalog file format, you should override this method to + parse your format. - Add *fallback* as the fallback object for the current translation - object. A translation object should consult the fallback if it cannot provide a - translation for a given message. + .. method:: NullTranslations.add_fallback(fallback) - .. method:: gettext(message) + Add *fallback* as the fallback object for the current translation object. A + translation object should consult the fallback if it cannot provide a + translation for a given message. - If a fallback has been set, forward :meth:`gettext` to the - fallback. Otherwise, return the translated message. Overridden in derived - classes. + .. method:: NullTranslations.gettext(message) - .. method:: lgettext(message) + If a fallback has been set, forward :meth:`gettext` to the fallback. Otherwise, + return the translated message. Overridden in derived classes. - If a fallback has been set, forward :meth:`lgettext` to the - fallback. Otherwise, return the translated message. Overridden in derived - classes. - .. method:: ugettext(message) + .. method:: NullTranslations.lgettext(message) - If a fallback has been set, forward :meth:`ugettext` to the - fallback. Otherwise, return the translated message as a string. Overridden - in derived classes. + If a fallback has been set, forward :meth:`lgettext` to the fallback. Otherwise, + return the translated message. Overridden in derived classes. - .. method:: ngettext(singular, plural, n) + .. method:: NullTranslations.ngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the - fallback. Otherwise, return the translated message. Overridden in derived - classes. + If a fallback has been set, forward :meth:`ngettext` to the fallback. Otherwise, + return the translated message. Overridden in derived classes. - .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the - fallback. Otherwise, return the translated message. Overridden in derived - classes. + .. method:: NullTranslations.lngettext(singular, plural, n) - .. method:: ungettext(singular, plural, n) + If a fallback has been set, forward :meth:`ngettext` to the fallback. Otherwise, + return the translated message. Overridden in derived classes. - If a fallback has been set, forward :meth:`ungettext` to the fallback. - Otherwise, return the translated message as a string. Overridden in - derived classes. - .. method:: info() + .. method:: NullTranslations.info() - Return the "protected" :attr:`_info` variable. + Return the "protected" :attr:`_info` variable. - .. method:: charset() + .. method:: NullTranslations.charset() - Return the "protected" :attr:`_charset` variable. + Return the "protected" :attr:`_charset` variable. - .. method:: output_charset() + .. method:: NullTranslations.output_charset() - Return the "protected" :attr:`_output_charset` variable, which defines the - encoding used to return translated messages. + Return the "protected" :attr:`_output_charset` variable, which defines the + encoding used to return translated messages. - .. method:: set_output_charset(charset) + .. method:: NullTranslations.set_output_charset(charset) - Change the "protected" :attr:`_output_charset` variable, which defines the - encoding used to return translated messages. + Change the "protected" :attr:`_output_charset` variable, which defines the + encoding used to return translated messages. - .. method:: install([unicode [, names]]) + .. method:: NullTranslations.install([names]) - If the *unicode* flag is false, this method installs :meth:`self.gettext` - into the built-in namespace, binding it to ``_``. If *unicode* is true, - it binds :meth:`self.ugettext` instead. By default, *unicode* is false. + this method installs :meth:`self.gettext` into the built-in namespace, + binding it to ``_``. - If the *names* parameter is given, it must be a sequence containing the - names of functions you want to install in the builtin namespace in - addition to :func:`_`. Supported names are ``'gettext'`` (bound to - :meth:`self.gettext` or :meth:`self.ugettext` according to the *unicode* - flag), ``'ngettext'`` (bound to :meth:`self.ngettext` or - :meth:`self.ungettext` according to the *unicode* flag), ``'lgettext'`` - and ``'lngettext'``. + If the *names* parameter is given, it must be a sequence containing + the names of functions you want to install in the builtin namespace + in addition to :func:`_`. Supported names are ``'gettext'`` (bound + to :meth:`self.gettext`), ``'ngettext'`` (bound to + :meth:`self.ngettext`), ``'lgettext'`` and ``'lngettext'``. - Note that this is only one way, albeit the most convenient way, to make - the :func:`_` function available to your application. Because it affects - the entire application globally, and specifically the built-in namespace, - localized modules should never install :func:`_`. Instead, they should use - this code to make :func:`_` available to their module:: + Note that this is only one way, albeit the most convenient way, to + make the :func:`_` function available to your application. Because + it affects the entire application globally, and specifically the + built-in namespace, localized modules should never install + :func:`_`. Instead, they should use this code to make :func:`_` + available to their module:: - import gettext - t = gettext.translation('mymodule', ...) - _ = t.gettext + import gettext + t = gettext.translation('mymodule', ...) + _ = t.gettext - This puts :func:`_` only in the module's global namespace and so only - affects calls within this module. + This puts :func:`_` only in the module's global namespace and so only + affects calls within this module. The :class:`GNUTranslations` class @@ -336,8 +319,7 @@ The :mod:`gettext` module provides one additional class derived from :class:`NullTranslations`: :class:`GNUTranslations`. This class overrides :meth:`_parse` to enable reading GNU :program:`gettext` format :file:`.mo` files -in both big-endian and little-endian format. It also coerces both message ids -and message strings to Unicode. +in both big-endian and little-endian format. :class:`GNUTranslations` parses optional meta-data out of the translation catalog. It is convention with GNU :program:`gettext` to include meta-data as @@ -347,12 +329,7 @@ initialize the "protected" :attr:`_charset` instance variable, defaulting to ``None`` if not found. If the charset encoding is specified, then all message ids and message strings read from the catalog are converted to Unicode using -this encoding. The :meth:`ugettext` method always returns a Unicode, while the -:meth:`gettext` returns an encoded bytestring. For the message id arguments -of both methods, either Unicode strings or bytestrings containing only -US-ASCII characters are acceptable. Note that the Unicode version of the -methods (i.e. :meth:`ugettext` and :meth:`ungettext`) are the recommended -interface to use for internationalized Python programs. +this encoding. The entire set of key/value pairs are placed into a dictionary and set as the "protected" :attr:`_info` instance variable. @@ -380,14 +357,6 @@ :meth:`set_output_charset`. -.. method:: GNUTranslations.ugettext(message) - - Look up the *message* id in the catalog and return the corresponding message - string, as a string. If there is no entry in the catalog for the - *message* id, and a fallback has been set, the look up is forwarded to the - fallback's :meth:`ugettext` method. Otherwise, the *message* id is returned. - - .. method:: GNUTranslations.ngettext(singular, plural, n) Do a plural-forms lookup of a message id. *singular* is used as the message id @@ -398,36 +367,24 @@ If the message id is not found in the catalog, and a fallback is specified, the request is forwarded to the fallback's :meth:`ngettext` method. Otherwise, when *n* is 1 *singular* is returned, and *plural* is returned in all other cases. - - -.. method:: GNUTranslations.lngettext(singular, plural, n) - - Equivalent to :meth:`gettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with - :meth:`set_output_charset`. - - -.. method:: GNUTranslations.ungettext(singular, plural, n) - - Do a plural-forms lookup of a message id. *singular* is used as the message id - for purposes of lookup in the catalog, while *n* is used to determine which - plural form to use. The returned message string is a string. - - If the message id is not found in the catalog, and a fallback is specified, the - request is forwarded to the fallback's :meth:`ungettext` method. Otherwise, - when *n* is 1 *singular* is returned, and *plural* is returned in all other - cases. - + Here is an example:: n = len(os.listdir('.')) cat = GNUTranslations(somefile) - message = cat.ungettext( + message = cat.ngettext( 'There is %(num)d file in this directory', 'There are %(num)d files in this directory', n) % {'num': n} +.. method:: GNUTranslations.lngettext(singular, plural, n) + + Equivalent to :meth:`gettext`, but the translation is returned in the preferred + system encoding, if no other encoding was explicitly set with + :meth:`set_output_charset`. + + Solaris message catalog support ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -538,13 +495,6 @@ t = gettext.translation('spam', '/usr/share/locale') _ = t.lgettext -If your translators were providing you with Unicode strings in their :file:`.po` -files, you'd instead do:: - - import gettext - t = gettext.translation('spam', '/usr/share/locale') - _ = t.ugettext - Localizing your application ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -560,11 +510,11 @@ import gettext gettext.install('myapplication') -If you need to set the locale directory or the *unicode* flag, you can pass -these into the :func:`install` function:: +If you need to set the locale directory, you can pass these into the +:func:`install` function:: import gettext - gettext.install('myapplication', '/usr/share/locale', unicode=1) + gettext.install('myapplication', '/usr/share/locale') Changing languages on the fly Modified: python/branches/py3k/Lib/gettext.py ============================================================================== --- python/branches/py3k/Lib/gettext.py (original) +++ python/branches/py3k/Lib/gettext.py Mon Jul 14 16:32:15 2008 @@ -210,19 +210,6 @@ else: return msgid2 - def ugettext(self, message): - if self._fallback: - return self._fallback.ugettext(message) - return str(message) - - def ungettext(self, msgid1, msgid2, n): - if self._fallback: - return self._fallback.ungettext(msgid1, msgid2, n) - if n == 1: - return str(msgid1) - else: - return str(msgid2) - def info(self): return self._info @@ -235,15 +222,14 @@ def set_output_charset(self, charset): self._output_charset = charset - def install(self, str=False, names=None): + def install(self, names=None): import builtins - builtins.__dict__['_'] = str and self.ugettext or self.gettext + builtins.__dict__['_'] = self.gettext if hasattr(names, "__contains__"): if "gettext" in names: builtins.__dict__['gettext'] = builtins.__dict__['_'] if "ngettext" in names: - builtins.__dict__['ngettext'] = (str and self.ungettext - or self.ngettext) + builtins.__dict__['ngettext'] = self.ngettext if "lgettext" in names: builtins.__dict__['lgettext'] = self.lgettext if "lngettext" in names: @@ -367,31 +353,27 @@ else: return msgid2 - def ugettext(self, message): + def gettext(self, message): missing = object() tmsg = self._catalog.get(message, missing) if tmsg is missing: if self._fallback: - return self._fallback.ugettext(message) + return self._fallback.gettext(message) return str(message) return tmsg - gettext = ugettext - - def ungettext(self, msgid1, msgid2, n): + def ngettext(self, msgid1, msgid2, n): try: tmsg = self._catalog[(msgid1, self.plural(n))] except KeyError: if self._fallback: - return self._fallback.ungettext(msgid1, msgid2, n) + return self._fallback.ngettext(msgid1, msgid2, n) if n == 1: tmsg = str(msgid1) else: tmsg = str(msgid2) return tmsg - ngettext = ungettext - # Locate a .mo file using the gettext strategy def find(domain, localedir=None, languages=None, all=0): @@ -465,9 +447,9 @@ return result -def install(domain, localedir=None, str=False, codeset=None, names=None): +def install(domain, localedir=None, codeset=None, names=None): t = translation(domain, localedir, fallback=True, codeset=codeset) - t.install(str, names) + t.install(names) Modified: python/branches/py3k/Lib/test/test_gettext.py ============================================================================== --- python/branches/py3k/Lib/test/test_gettext.py (original) +++ python/branches/py3k/Lib/test/test_gettext.py Mon Jul 14 16:32:15 2008 @@ -143,13 +143,13 @@ t.install() eq(_('nudge nudge'), 'wink wink') # Try unicode return type - t.install(str=True) + t.install() eq(_('mullusk'), 'bacon') # Test installation of other methods import builtins - t.install(str=True, names=["gettext", "lgettext"]) - eq(_, t.ugettext) - eq(builtins.gettext, t.ugettext) + t.install(names=["gettext", "lgettext"]) + eq(_, t.gettext) + eq(builtins.gettext, t.gettext) eq(lgettext, t.lgettext) del builtins.gettext del builtins.lgettext @@ -305,7 +305,7 @@ self.t = gettext.GNUTranslations(fp) finally: fp.close() - self._ = self.t.ugettext + self._ = self.t.gettext def test_unicode_msgid(self): unless = self.failUnless Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Mon Jul 14 16:32:15 2008 @@ -32,6 +32,9 @@ code of every single module of the standard library, including invalid files used in the test suite. +- All the u* variant functions and methods in gettext have been renamed to their + none u* siblings. + C API ----- From python-3000-checkins at python.org Mon Jul 14 19:49:44 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Mon, 14 Jul 2008 19:49:44 +0200 (CEST) Subject: [Python-3000-checkins] r64954 - python/branches/py3k Message-ID: <20080714174944.2272E1E4002@bag.python.org> Author: benjamin.peterson Date: Mon Jul 14 19:49:43 2008 New Revision: 64954 Log: Blocked revisions 64953 via svnmerge ........ r64953 | benjamin.peterson | 2008-07-14 12:42:17 -0500 (Mon, 14 Jul 2008) | 4 lines fix test_py3kwarns The fact that this was failing and went unnoticed so long seems like a good argument for being able to enable and disble py3kwarnings through Python. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Tue Jul 15 02:28:37 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 15 Jul 2008 02:28:37 +0200 (CEST) Subject: [Python-3000-checkins] r64956 - python/branches/py3k/Python/sysmodule.c Message-ID: <20080715002837.09F661E4002@bag.python.org> Author: benjamin.peterson Date: Tue Jul 15 02:28:36 2008 New Revision: 64956 Log: correct docstring Modified: python/branches/py3k/Python/sysmodule.c Modified: python/branches/py3k/Python/sysmodule.c ============================================================================== --- python/branches/py3k/Python/sysmodule.c (original) +++ python/branches/py3k/Python/sysmodule.c Tue Jul 15 02:28:36 2008 @@ -990,7 +990,7 @@ To customize printing in an interactive session or to install a custom\n\ top-level exception handler, assign other functions to replace these.\n\ \n\ -stdin -- standard input file object; used by raw_input() and input()\n\ +stdin -- standard input file object; used by input()\n\ stdout -- standard output file object; used by print()\n\ stderr -- standard error object; used for error messages\n\ By assigning other file objects (or objects that behave like files)\n\ From python-3000-checkins at python.org Tue Jul 15 12:11:44 2008 From: python-3000-checkins at python.org (eric.smith) Date: Tue, 15 Jul 2008 12:11:44 +0200 (CEST) Subject: [Python-3000-checkins] r64959 - python/branches/py3k Message-ID: <20080715101144.A02EC1E4002@bag.python.org> Author: eric.smith Date: Tue Jul 15 12:11:44 2008 New Revision: 64959 Log: Blocked revisions 64958 via svnmerge. Will merge by hand. ........ r64958 | eric.smith | 2008-07-15 06:10:07 -0400 (Tue, 15 Jul 2008) | 1 line Added '#' formatting to integers. This adds the 0b, 0o, or 0x prefix for bin, oct, hex. There's still one failing case, and I need to finish the docs. I hope to finish those today. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Tue Jul 15 15:02:42 2008 From: python-3000-checkins at python.org (eric.smith) Date: Tue, 15 Jul 2008 15:02:42 +0200 (CEST) Subject: [Python-3000-checkins] r64960 - in python/branches/py3k: Lib/test/test_types.py Lib/test/test_unicode.py Objects/stringlib/formatter.h Message-ID: <20080715130242.275CC1E400B@bag.python.org> Author: eric.smith Date: Tue Jul 15 15:02:41 2008 New Revision: 64960 Log: Forward port of r64958Added '#' formatting to integers. This adds the 0b, 0o, or 0x prefix for bin, oct, hex. There's still one failing case, and I need to finish the docs. I hope to finish those today. Modified: python/branches/py3k/Lib/test/test_types.py python/branches/py3k/Lib/test/test_unicode.py python/branches/py3k/Objects/stringlib/formatter.h Modified: python/branches/py3k/Lib/test/test_types.py ============================================================================== --- python/branches/py3k/Lib/test/test_types.py (original) +++ python/branches/py3k/Lib/test/test_types.py Tue Jul 15 15:02:41 2008 @@ -293,6 +293,40 @@ test(1234, "+b", "+10011010010") test(-1234, "+b", "-10011010010") + # alternate (#) formatting + test(0, "#b", '0b0') + test(0, "-#b", '0b0') + test(1, "-#b", '0b1') + test(-1, "-#b", '-0b1') + test(-1, "-#5b", ' -0b1') + test(1, "+#5b", ' +0b1') + test(100, "+#b", '+0b1100100') +# test(100, "#012b", '0b001100100') + + test(0, "#o", '0o0') + test(0, "-#o", '0o0') + test(1, "-#o", '0o1') + test(-1, "-#o", '-0o1') + test(-1, "-#5o", ' -0o1') + test(1, "+#5o", ' +0o1') + test(100, "+#o", '+0o144') + + test(0, "#x", '0x0') + test(0, "-#x", '0x0') + test(1, "-#x", '0x1') + test(-1, "-#x", '-0x1') + test(-1, "-#5x", ' -0x1') + test(1, "+#5x", ' +0x1') + test(100, "+#x", '+0x64') + + test(0, "#X", '0X0') + test(0, "-#X", '0X0') + test(1, "-#X", '0X1') + test(-1, "-#X", '-0X1') + test(-1, "-#5X", ' -0X1') + test(1, "+#5X", ' +0X1') + test(100, "+#X", '+0X64') + # make sure these are errors # precision disallowed @@ -509,6 +543,10 @@ self.assertRaises(ValueError, format, 1e-100, format_spec) self.assertRaises(ValueError, format, -1e-100, format_spec) + # Alternate formatting is not supported + self.assertRaises(ValueError, format, 0.0, '#') + self.assertRaises(ValueError, format, 0.0, '#20f') + def test_main(): run_unittest(TypesTests) Modified: python/branches/py3k/Lib/test/test_unicode.py ============================================================================== --- python/branches/py3k/Lib/test/test_unicode.py (original) +++ python/branches/py3k/Lib/test/test_unicode.py Tue Jul 15 15:02:41 2008 @@ -700,6 +700,10 @@ self.assertRaises(ValueError, format, "", "-") self.assertRaises(ValueError, "{0:=s}".format, '') + # Alternate formatting is not supported + self.assertRaises(ValueError, format, '', '#') + self.assertRaises(ValueError, format, '', '#20') + def test_formatting(self): string_tests.MixinStrUnicodeUserStringTest.test_formatting(self) # Testing Unicode formatting strings... Modified: python/branches/py3k/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k/Objects/stringlib/formatter.h (original) +++ python/branches/py3k/Objects/stringlib/formatter.h Tue Jul 15 15:02:41 2008 @@ -89,6 +89,7 @@ typedef struct { STRINGLIB_CHAR fill_char; STRINGLIB_CHAR align; + int alternate; STRINGLIB_CHAR sign; Py_ssize_t width; Py_ssize_t precision; @@ -117,6 +118,7 @@ format->fill_char = '\0'; format->align = '\0'; + format->alternate = 0; format->sign = '\0'; format->width = -1; format->precision = -1; @@ -154,6 +156,13 @@ ++ptr; } + /* If the next character is #, we're in alternate mode. This only + applies to integers. */ + if (end-ptr >= 1 && ptr[0] == '#') { + format->alternate = 1; + ++ptr; + } + /* XXX add error checking */ specified_width = get_integer(&ptr, end, &format->width); @@ -221,7 +230,8 @@ and more efficient enough to justify a little obfuscation? */ static void calc_number_widths(NumberFieldWidths *r, STRINGLIB_CHAR actual_sign, - Py_ssize_t n_digits, const InternalFormatSpec *format) + Py_ssize_t n_prefix, Py_ssize_t n_digits, + const InternalFormatSpec *format) { r->n_lpadding = 0; r->n_spadding = 0; @@ -232,13 +242,15 @@ r->n_rsign = 0; /* the output will look like: - | | - | | - | | + | | + | | + | | lsign and rsign are computed from format->sign and the actual sign of the number + prefix is given (it's for the '0x' prefix) + digits is already known the total width is either given, or computed from the @@ -363,6 +375,14 @@ goto done; } + /* alternate is not allowed on strings */ + if (format->alternate) { + PyErr_SetString(PyExc_ValueError, + "Alternate form (#) not allowed in string format " + "specifier"); + goto done; + } + /* '=' alignment not allowed on strings */ if (format->align == '=') { PyErr_SetString(PyExc_ValueError, @@ -505,31 +525,33 @@ } else { int base; - int leading_chars_to_skip; /* Number of characters added by - PyNumber_ToBase that we want to - skip over. */ + int leading_chars_to_skip = 0; /* Number of characters added by + PyNumber_ToBase that we want to + skip over. */ /* Compute the base and how many characters will be added by PyNumber_ToBase */ switch (format->type) { case 'b': base = 2; - leading_chars_to_skip = 2; /* 0b */ + if (!format->alternate) + leading_chars_to_skip = 2; /* 0b */ break; case 'o': base = 8; - leading_chars_to_skip = 2; /* 0o */ + if (!format->alternate) + leading_chars_to_skip = 2; /* 0o */ break; case 'x': case 'X': base = 16; - leading_chars_to_skip = 2; /* 0x */ + if (!format->alternate) + leading_chars_to_skip = 2; /* 0x */ break; default: /* shouldn't be needed, but stops a compiler warning */ case 'd': case 'n': base = 10; - leading_chars_to_skip = 0; break; } @@ -564,7 +586,7 @@ 0, &n_grouping_chars, 0); /* Calculate the widths of the various leading and trailing parts */ - calc_number_widths(&spec, sign, n_digits + n_grouping_chars, format); + calc_number_widths(&spec, sign, 0, n_digits + n_grouping_chars, format); /* Allocate a new string to hold the result */ result = STRINGLIB_NEW(NULL, spec.n_total); @@ -670,6 +692,14 @@ Py_UNICODE unicodebuf[FLOAT_FORMATBUFLEN]; #endif + /* alternate is not allowed on floats. */ + if (format->alternate) { + PyErr_SetString(PyExc_ValueError, + "Alternate form (#) not allowed in float format " + "specifier"); + goto done; + } + /* first, do the conversion as 8-bit chars, using the platform's snprintf. then, if needed, convert to unicode. */ @@ -730,7 +760,7 @@ --n_digits; } - calc_number_widths(&spec, sign, n_digits, format); + calc_number_widths(&spec, sign, 0, n_digits, format); /* allocate a string with enough space */ result = STRINGLIB_NEW(NULL, spec.n_total); From python-3000-checkins at python.org Tue Jul 15 16:31:20 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Tue, 15 Jul 2008 16:31:20 +0200 (CEST) Subject: [Python-3000-checkins] r64963 - python/branches/py3k Message-ID: <20080715143120.6685B1E4007@bag.python.org> Author: nick.coghlan Date: Tue Jul 15 16:31:20 2008 New Revision: 64963 Log: Blocked revisions 64962 via svnmerge ........ r64962 | nick.coghlan | 2008-07-16 00:27:37 +1000 (Wed, 16 Jul 2008) | 1 line Issue 2235: __hash__ is once again inherited by default, but inheritance can be blocked explicitly so that collections.Hashable remains meaningful ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Tue Jul 15 17:32:09 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 15 Jul 2008 17:32:09 +0200 (CEST) Subject: [Python-3000-checkins] r64965 - in python/branches/py3k: Include/traceback.h Lib/test/test_raise.py Lib/test/test_traceback.py Lib/traceback.py Misc/NEWS Modules/_testcapimodule.c Python/_warnings.c Python/errors.c Python/pythonrun.c Python/traceback.c Message-ID: <20080715153209.A55DD1E4002@bag.python.org> Author: benjamin.peterson Date: Tue Jul 15 17:32:09 2008 New Revision: 64965 Log: implement chained exception tracebacks patch from Antoine Pitrou #3112 Modified: python/branches/py3k/Include/traceback.h python/branches/py3k/Lib/test/test_raise.py python/branches/py3k/Lib/test/test_traceback.py python/branches/py3k/Lib/traceback.py python/branches/py3k/Misc/NEWS python/branches/py3k/Modules/_testcapimodule.c python/branches/py3k/Python/_warnings.c python/branches/py3k/Python/errors.c python/branches/py3k/Python/pythonrun.c python/branches/py3k/Python/traceback.c Modified: python/branches/py3k/Include/traceback.h ============================================================================== --- python/branches/py3k/Include/traceback.h (original) +++ python/branches/py3k/Include/traceback.h Tue Jul 15 17:32:09 2008 @@ -19,7 +19,7 @@ PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); -PyAPI_FUNC(int) Py_DisplaySourceLine(PyObject *, const char *, int); +PyAPI_FUNC(int) Py_DisplaySourceLine(PyObject *, const char *, int, int); /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; Modified: python/branches/py3k/Lib/test/test_raise.py ============================================================================== --- python/branches/py3k/Lib/test/test_raise.py (original) +++ python/branches/py3k/Lib/test/test_raise.py Tue Jul 15 17:32:09 2008 @@ -278,6 +278,30 @@ else: self.fail("No exception raised") + def test_cycle_broken(self): + # Self-cycles (when re-raising a caught exception) are broken + try: + try: + 1/0 + except ZeroDivisionError as e: + raise e + except ZeroDivisionError as e: + self.failUnless(e.__context__ is None, e.__context__) + + def test_reraise_cycle_broken(self): + # Non-trivial context cycles (through re-raising a previous exception) + # are broken too. + try: + try: + xyzzy + except NameError as a: + try: + 1/0 + except ZeroDivisionError: + raise a + except NameError as e: + self.failUnless(e.__context__.__context__ is None) + class TestRemovedFunctionality(unittest.TestCase): def test_tuples(self): Modified: python/branches/py3k/Lib/test/test_traceback.py ============================================================================== --- python/branches/py3k/Lib/test/test_traceback.py (original) +++ python/branches/py3k/Lib/test/test_traceback.py Tue Jul 15 17:32:09 2008 @@ -1,10 +1,11 @@ """Test cases for traceback module""" -from _testcapi import traceback_print +from _testcapi import traceback_print, exception_print from io import StringIO import sys import unittest -from test.support import run_unittest, is_jython, Error +import re +from test.support import run_unittest, is_jython, Error, captured_output import traceback @@ -19,7 +20,7 @@ raise Error("unable to create test traceback string") -class TracebackCases(unittest.TestCase): +class SyntaxTracebackCases(unittest.TestCase): # For now, a very minimal set of tests. I want to be sure that # formatting of SyntaxErrors works based on changes for 2.1. @@ -99,12 +100,135 @@ banner, location, source_line = tb_lines self.assert_(banner.startswith('Traceback')) self.assert_(location.startswith(' File')) - self.assert_(source_line.startswith('raise')) + self.assert_(source_line.startswith(' raise')) -def test_main(): - run_unittest(TracebackCases, TracebackFormatTests) +cause_message = ( + "\nThe above exception was the direct cause " + "of the following exception:\n\n") + +context_message = ( + "\nDuring handling of the above exception, " + "another exception occurred:\n\n") + +boundaries = re.compile( + '(%s|%s)' % (re.escape(cause_message), re.escape(context_message))) +class BaseExceptionReportingTests: + + def get_exception(self, exception_or_callable): + if isinstance(exception_or_callable, Exception): + return exception_or_callable + try: + exception_or_callable() + except Exception as e: + return e + + def zero_div(self): + 1/0 # In zero_div + + def check_zero_div(self, msg): + lines = msg.splitlines() + self.assert_(lines[-3].startswith(' File')) + self.assert_('1/0 # In zero_div' in lines[-2], lines[-2]) + self.assert_(lines[-1].startswith('ZeroDivisionError'), lines[-1]) + + def test_simple(self): + try: + 1/0 # Marker + except ZeroDivisionError as _: + e = _ + lines = self.get_report(e).splitlines() + self.assertEquals(len(lines), 4) + self.assert_(lines[0].startswith('Traceback')) + self.assert_(lines[1].startswith(' File')) + self.assert_('1/0 # Marker' in lines[2]) + self.assert_(lines[3].startswith('ZeroDivisionError')) + + def test_cause(self): + def inner_raise(): + try: + self.zero_div() + except ZeroDivisionError as e: + raise KeyError from e + def outer_raise(): + inner_raise() # Marker + blocks = boundaries.split(self.get_report(outer_raise)) + self.assertEquals(len(blocks), 3) + self.assertEquals(blocks[1], cause_message) + self.check_zero_div(blocks[0]) + self.assert_('inner_raise() # Marker' in blocks[2]) + + def test_context(self): + def inner_raise(): + try: + self.zero_div() + except ZeroDivisionError: + raise KeyError + def outer_raise(): + inner_raise() # Marker + blocks = boundaries.split(self.get_report(outer_raise)) + self.assertEquals(len(blocks), 3) + self.assertEquals(blocks[1], context_message) + self.check_zero_div(blocks[0]) + self.assert_('inner_raise() # Marker' in blocks[2]) + + def test_cause_recursive(self): + def inner_raise(): + try: + try: + self.zero_div() + except ZeroDivisionError as e: + z = e + raise KeyError from e + except KeyError as e: + raise z from e + def outer_raise(): + inner_raise() # Marker + blocks = boundaries.split(self.get_report(outer_raise)) + self.assertEquals(len(blocks), 3) + self.assertEquals(blocks[1], cause_message) + # The first block is the KeyError raised from the ZeroDivisionError + self.assert_('raise KeyError from e' in blocks[0]) + self.assert_('1/0' not in blocks[0]) + # The second block (apart from the boundary) is the ZeroDivisionError + # re-raised from the KeyError + self.assert_('inner_raise() # Marker' in blocks[2]) + self.check_zero_div(blocks[2]) + + + +class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): + # + # This checks reporting through the 'traceback' module, with both + # format_exception() and print_exception(). + # + + def get_report(self, e): + e = self.get_exception(e) + s = ''.join( + traceback.format_exception(type(e), e, e.__traceback__)) + with captured_output("stderr") as sio: + traceback.print_exception(type(e), e, e.__traceback__) + self.assertEquals(sio.getvalue(), s) + return s + + +class CExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): + # + # This checks built-in reporting by the interpreter. + # + + def get_report(self, e): + e = self.get_exception(e) + with captured_output("stderr") as s: + exception_print(e) + return s.getvalue() + + +def test_main(): + run_unittest(__name__) + if __name__ == "__main__": test_main() Modified: python/branches/py3k/Lib/traceback.py ============================================================================== --- python/branches/py3k/Lib/traceback.py (original) +++ python/branches/py3k/Lib/traceback.py Tue Jul 15 17:32:09 2008 @@ -3,6 +3,7 @@ import linecache import sys import types +import itertools __all__ = ['extract_stack', 'extract_tb', 'format_exception', 'format_exception_only', 'format_list', 'format_stack', @@ -107,7 +108,32 @@ return list -def print_exception(etype, value, tb, limit=None, file=None): +_cause_message = ( + "\nThe above exception was the direct cause " + "of the following exception:\n") + +_context_message = ( + "\nDuring handling of the above exception, " + "another exception occurred:\n") + +def _iter_chain(exc, custom_tb=None, seen=None): + if seen is None: + seen = set() + seen.add(exc) + its = [] + cause = exc.__cause__ + context = exc.__context__ + if cause is not None and cause not in seen: + its.append(_iter_chain(cause, None, seen)) + its.append([(_cause_message, None)]) + if context is not None and context is not cause and context not in seen: + its.append(_iter_chain(context, None, seen)) + its.append([(_context_message, None)]) + its.append([(exc, custom_tb or exc.__traceback__)]) + return itertools.chain(*its) + + +def print_exception(etype, value, tb, limit=None, file=None, chain=True): """Print exception up to 'limit' stack trace entries from 'tb' to 'file'. This differs from print_tb() in the following ways: (1) if @@ -120,15 +146,23 @@ """ if file is None: file = sys.stderr - if tb: - _print(file, 'Traceback (most recent call last):') - print_tb(tb, limit, file) - lines = format_exception_only(etype, value) - for line in lines[:-1]: - _print(file, line, ' ') - _print(file, lines[-1], '') + if chain: + values = _iter_chain(value, tb) + else: + values = [(value, tb)] + for value, tb in values: + if isinstance(value, str): + _print(file, value) + continue + if tb: + _print(file, 'Traceback (most recent call last):') + print_tb(tb, limit, file) + lines = format_exception_only(type(value), value) + for line in lines[:-1]: + _print(file, line, ' ') + _print(file, lines[-1], '') -def format_exception(etype, value, tb, limit = None): +def format_exception(etype, value, tb, limit=None, chain=True): """Format a stack trace and the exception information. The arguments have the same meaning as the corresponding arguments @@ -137,12 +171,19 @@ these lines are concatenated and printed, exactly the same text is printed as does print_exception(). """ - if tb: - list = ['Traceback (most recent call last):\n'] - list = list + format_tb(tb, limit) + list = [] + if chain: + values = _iter_chain(value, tb) else: - list = [] - list = list + format_exception_only(etype, value) + values = [(value, tb)] + for value, tb in values: + if isinstance(value, str): + list.append(value + '\n') + continue + if tb: + list.append('Traceback (most recent call last):\n') + list.extend(format_tb(tb, limit)) + list.extend(format_exception_only(type(value), value)) return list def format_exception_only(etype, value): @@ -208,33 +249,34 @@ return '' % type(value).__name__ -def print_exc(limit=None, file=None): +def print_exc(limit=None, file=None, chain=True): """Shorthand for 'print_exception(*sys.exc_info(), limit, file)'.""" if file is None: file = sys.stderr try: etype, value, tb = sys.exc_info() - print_exception(etype, value, tb, limit, file) + print_exception(etype, value, tb, limit, file, chain) finally: etype = value = tb = None -def format_exc(limit=None): +def format_exc(limit=None, chain=True): """Like print_exc() but return a string.""" try: etype, value, tb = sys.exc_info() - return ''.join(format_exception(etype, value, tb, limit)) + return ''.join( + format_exception(etype, value, tb, limit, chain)) finally: etype = value = tb = None -def print_last(limit=None, file=None): +def print_last(limit=None, file=None, chain=True): """This is a shorthand for 'print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)'.""" if file is None: file = sys.stderr print_exception(sys.last_type, sys.last_value, sys.last_traceback, - limit, file) + limit, file, chain) def print_stack(f=None, limit=None, file=None): Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Tue Jul 15 17:32:09 2008 @@ -22,6 +22,8 @@ - Issue #3236: Return small longs from PyLong_FromString. +- Exception tracebacks now support exception chaining. + Library ------- @@ -35,6 +37,8 @@ - All the u* variant functions and methods in gettext have been renamed to their none u* siblings. +- The traceback module has been expanded to handle chained exceptions. + C API ----- Modified: python/branches/py3k/Modules/_testcapimodule.c ============================================================================== --- python/branches/py3k/Modules/_testcapimodule.c (original) +++ python/branches/py3k/Modules/_testcapimodule.c Tue Jul 15 17:32:09 2008 @@ -951,6 +951,26 @@ Py_RETURN_NONE; } +/* To test the format of exceptions as printed out. */ +static PyObject * +exception_print(PyObject *self, PyObject *args) +{ + PyObject *value; + PyObject *tb; + + if (!PyArg_ParseTuple(args, "O:exception_print", + &value)) + return NULL; + + tb = PyException_GetTraceback(value); + PyErr_Display((PyObject *) Py_TYPE(value), value, tb); + Py_XDECREF(tb); + + Py_RETURN_NONE; +} + + + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"test_config", (PyCFunction)test_config, METH_NOARGS}, @@ -995,6 +1015,7 @@ {"profile_int", profile_int, METH_NOARGS}, #endif {"traceback_print", traceback_print, METH_VARARGS}, + {"exception_print", exception_print, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; Modified: python/branches/py3k/Python/_warnings.c ============================================================================== --- python/branches/py3k/Python/_warnings.c (original) +++ python/branches/py3k/Python/_warnings.c Tue Jul 15 17:32:09 2008 @@ -256,7 +256,6 @@ Py_XDECREF(name); /* Print " source_line\n" */ - PyFile_WriteString(" ", f_stderr); if (sourceline) { char *source_line_str = PyUnicode_AsString(sourceline); while (*source_line_str == ' ' || *source_line_str == '\t' || @@ -267,7 +266,7 @@ PyFile_WriteString("\n", f_stderr); } else - Py_DisplaySourceLine(f_stderr, PyUnicode_AsString(filename), lineno); + Py_DisplaySourceLine(f_stderr, PyUnicode_AsString(filename), lineno, 2); PyErr_Clear(); } Modified: python/branches/py3k/Python/errors.c ============================================================================== --- python/branches/py3k/Python/errors.c (original) +++ python/branches/py3k/Python/errors.c Tue Jul 15 17:32:09 2008 @@ -84,8 +84,23 @@ return; value = fixed_value; } - Py_INCREF(tstate->exc_value); - PyException_SetContext(value, tstate->exc_value); + /* Avoid reference cycles through the context chain. + This is O(chain length) but context chains are + usually very short. Sensitive readers may try + to inline the call to PyException_GetContext. */ + if (tstate->exc_value != value) { + PyObject *o = tstate->exc_value, *context; + while ((context = PyException_GetContext(o))) { + Py_DECREF(context); + if (context == value) { + PyException_SetContext(o, NULL); + break; + } + o = context; + } + Py_INCREF(tstate->exc_value); + PyException_SetContext(value, tstate->exc_value); + } } if (value != NULL && PyExceptionInstance_Check(value)) tb = PyException_GetTraceback(value); @@ -160,6 +175,9 @@ /* Used in many places to normalize a raised exception, including in eval_code2(), do_raise(), and PyErr_Print() + + XXX: should PyErr_NormalizeException() also call + PyException_SetTraceback() with the resulting value and tb? */ void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) Modified: python/branches/py3k/Python/pythonrun.c ============================================================================== --- python/branches/py3k/Python/pythonrun.c (original) +++ python/branches/py3k/Python/pythonrun.c Tue Jul 15 17:32:09 2008 @@ -1242,18 +1242,19 @@ if (exception == NULL) return; PyErr_NormalizeException(&exception, &v, &tb); + tb = tb ? tb : Py_None; + PyException_SetTraceback(v, tb); if (exception == NULL) return; /* Now we know v != NULL too */ if (set_sys_last_vars) { PySys_SetObject("last_type", exception); PySys_SetObject("last_value", v); - PySys_SetObject("last_traceback", tb ? tb : Py_None); + PySys_SetObject("last_traceback", tb); } hook = PySys_GetObject("excepthook"); if (hook) { - PyObject *args = PyTuple_Pack(3, - exception, v, tb ? tb : Py_None); + PyObject *args = PyTuple_Pack(3, exception, v, tb); PyObject *result = PyEval_CallObject(hook, args); if (result == NULL) { PyObject *exception2, *v2, *tb2; @@ -1293,106 +1294,100 @@ Py_XDECREF(tb); } -void -PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) +static void +print_exception(PyObject *f, PyObject *value) { int err = 0; - PyObject *f = PySys_GetObject("stderr"); + PyObject *type, *tb; + Py_INCREF(value); - if (f == Py_None) { - /* pass */ + fflush(stdout); + type = (PyObject *) Py_TYPE(value); + tb = PyException_GetTraceback(value); + if (tb && tb != Py_None) + err = PyTraceBack_Print(tb, f); + if (err == 0 && + PyObject_HasAttrString(value, "print_file_and_line")) + { + PyObject *message; + const char *filename, *text; + int lineno, offset; + if (!parse_syntax_error(value, &message, &filename, + &lineno, &offset, &text)) + PyErr_Clear(); + else { + char buf[10]; + PyFile_WriteString(" File \"", f); + if (filename == NULL) + PyFile_WriteString("", f); + else + PyFile_WriteString(filename, f); + PyFile_WriteString("\", line ", f); + PyOS_snprintf(buf, sizeof(buf), "%d", lineno); + PyFile_WriteString(buf, f); + PyFile_WriteString("\n", f); + if (text != NULL) + print_error_text(f, offset, text); + Py_DECREF(value); + value = message; + /* Can't be bothered to check all those + PyFile_WriteString() calls */ + if (PyErr_Occurred()) + err = -1; + } } - else if (f == NULL) { - _PyObject_Dump(value); - fprintf(stderr, "lost sys.stderr\n"); + if (err) { + /* Don't do anything else */ } else { - fflush(stdout); - if (tb && tb != Py_None) - err = PyTraceBack_Print(tb, f); - if (err == 0 && - PyObject_HasAttrString(value, "print_file_and_line")) - { - PyObject *message; - const char *filename, *text; - int lineno, offset; - if (!parse_syntax_error(value, &message, &filename, - &lineno, &offset, &text)) - PyErr_Clear(); - else { - char buf[10]; - PyFile_WriteString(" File \"", f); - if (filename == NULL) - PyFile_WriteString("", f); - else - PyFile_WriteString(filename, f); - PyFile_WriteString("\", line ", f); - PyOS_snprintf(buf, sizeof(buf), "%d", lineno); - PyFile_WriteString(buf, f); - PyFile_WriteString("\n", f); - if (text != NULL) - print_error_text(f, offset, text); - Py_DECREF(value); - value = message; - /* Can't be bothered to check all those - PyFile_WriteString() calls */ - if (PyErr_Occurred()) - err = -1; - } + assert(PyExceptionClass_Check(type)); + PyObject* moduleName; + char* className = PyExceptionClass_Name(type); + if (className != NULL) { + char *dot = strrchr(className, '.'); + if (dot != NULL) + className = dot+1; } - if (err) { - /* Don't do anything else */ - } - else if (PyExceptionClass_Check(exception)) { - PyObject* moduleName; - char* className = PyExceptionClass_Name(exception); - if (className != NULL) { - char *dot = strrchr(className, '.'); - if (dot != NULL) - className = dot+1; - } - moduleName = PyObject_GetAttrString(exception, "__module__"); - if (moduleName == NULL || !PyUnicode_Check(moduleName)) + moduleName = PyObject_GetAttrString(type, "__module__"); + if (moduleName == NULL || !PyUnicode_Check(moduleName)) + { + Py_DECREF(moduleName); + err = PyFile_WriteString("", f); + } + else { + char* modstr = PyUnicode_AsString(moduleName); + if (modstr && strcmp(modstr, "builtins")) { - Py_DECREF(moduleName); - err = PyFile_WriteString("", f); - } - else { - char* modstr = PyUnicode_AsString(moduleName); - if (modstr && strcmp(modstr, "builtins")) - { - err = PyFile_WriteString(modstr, f); - err += PyFile_WriteString(".", f); - } - Py_DECREF(moduleName); - } - if (err == 0) { - if (className == NULL) - err = PyFile_WriteString("", f); - else - err = PyFile_WriteString(className, f); + err = PyFile_WriteString(modstr, f); + err += PyFile_WriteString(".", f); } + Py_DECREF(moduleName); } - else - err = PyFile_WriteObject(exception, f, Py_PRINT_RAW); - if (err == 0 && (value != Py_None)) { - PyObject *s = PyObject_Str(value); - /* only print colon if the str() of the - object is not the empty string - */ - if (s == NULL) - err = -1; - else if (!PyUnicode_Check(s) || - PyUnicode_GetSize(s) != 0) - err = PyFile_WriteString(": ", f); - if (err == 0) - err = PyFile_WriteObject(s, f, Py_PRINT_RAW); - Py_XDECREF(s); + if (err == 0) { + if (className == NULL) + err = PyFile_WriteString("", f); + else + err = PyFile_WriteString(className, f); } - /* try to write a newline in any case */ - err += PyFile_WriteString("\n", f); } + if (err == 0 && (value != Py_None)) { + PyObject *s = PyObject_Str(value); + /* only print colon if the str() of the + object is not the empty string + */ + if (s == NULL) + err = -1; + else if (!PyUnicode_Check(s) || + PyUnicode_GetSize(s) != 0) + err = PyFile_WriteString(": ", f); + if (err == 0) + err = PyFile_WriteObject(s, f, Py_PRINT_RAW); + Py_XDECREF(s); + } + /* try to write a newline in any case */ + err += PyFile_WriteString("\n", f); + Py_XDECREF(tb); Py_DECREF(value); /* If an error happened here, don't show it. XXX This is wrong, but too many callers rely on this behavior. */ @@ -1400,6 +1395,82 @@ PyErr_Clear(); } +static const char *cause_message = + "\nThe above exception was the direct cause " + "of the following exception:\n\n"; + +static const char *context_message = + "\nDuring handling of the above exception, " + "another exception occurred:\n\n"; + +static void +print_exception_recursive(PyObject *f, PyObject *value, PyObject *seen) +{ + int err = 0, res; + PyObject *cause, *context; + + if (seen != NULL) { + /* Exception chaining */ + if (PySet_Add(seen, value) == -1) + PyErr_Clear(); + else if (PyExceptionInstance_Check(value)) { + cause = PyException_GetCause(value); + context = PyException_GetContext(value); + if (cause) { + res = PySet_Contains(seen, cause); + if (res == -1) + PyErr_Clear(); + if (res == 0) { + print_exception_recursive( + f, cause, seen); + err |= PyFile_WriteString( + cause_message, f); + } + } + if (context) { + res = PySet_Contains(seen, context); + if (res == -1) + PyErr_Clear(); + if (res == 0) { + print_exception_recursive( + f, context, seen); + err |= PyFile_WriteString( + context_message, f); + } + } + Py_XDECREF(context); + Py_XDECREF(cause); + } + } + print_exception(f, value); + if (err != 0) + PyErr_Clear(); +} + +void +PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) +{ + PyObject *seen; + PyObject *f = PySys_GetObject("stderr"); + if (f == Py_None) { + /* pass */ + } + else if (f == NULL) { + _PyObject_Dump(value); + fprintf(stderr, "lost sys.stderr\n"); + } + else { + /* We choose to ignore seen being possibly NULL, and report + at least the main exception (it could be a MemoryError). + */ + seen = PySet_New(NULL); + if (seen == NULL) + PyErr_Clear(); + print_exception_recursive(f, value, seen); + Py_XDECREF(seen); + } +} + PyObject * PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags) Modified: python/branches/py3k/Python/traceback.c ============================================================================== --- python/branches/py3k/Python/traceback.c (original) +++ python/branches/py3k/Python/traceback.c Tue Jul 15 17:32:09 2008 @@ -129,7 +129,7 @@ } int -Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno) +Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno, int indent) { int err = 0; FILE *xfp = NULL; @@ -139,8 +139,6 @@ if (filename == NULL) return -1; - /* This is needed by Emacs' compile command */ -#define FMT " File \"%.500s\", line %d, in %.500s\n" xfp = fopen(filename, "r" PY_STDIOTEXTMODE); if (xfp == NULL) { /* Search tail of filename in sys.path before giving up */ @@ -203,12 +201,27 @@ } while (*pLastChar != '\0' && *pLastChar != '\n'); } if (i == lineno) { + char buf[11]; char *p = linebuf; while (*p == ' ' || *p == '\t' || *p == '\014') p++; - err = PyFile_WriteString(p, f); - if (err == 0 && strchr(p, '\n') == NULL) - err = PyFile_WriteString("\n", f); + + /* Write some spaces before the line */ + strcpy(buf, " "); + assert (strlen(buf) == 10); + while (indent > 0) { + if(indent < 10) + buf[indent] = '\0'; + err = PyFile_WriteString(buf, f); + if (err != 0) + break; + indent -= 10; + } + + if (err == 0) + err = PyFile_WriteString(p, f); + if (err == 0 && strchr(p, '\n') == NULL) + err = PyFile_WriteString("\n", f); } fclose(xfp); return err; @@ -228,7 +241,7 @@ err = PyFile_WriteString(linebuf, f); if (err != 0) return err; - return Py_DisplaySourceLine(f, filename, lineno); + return Py_DisplaySourceLine(f, filename, lineno, 4); } static int From python-3000-checkins at python.org Tue Jul 15 17:46:39 2008 From: python-3000-checkins at python.org (nick.coghlan) Date: Tue, 15 Jul 2008 17:46:39 +0200 (CEST) Subject: [Python-3000-checkins] r64967 - in python/branches/py3k: Include/object.h Lib/decimal.py Lib/test/seq_tests.py Lib/test/test_descr.py Lib/test/test_hash.py Lib/test/test_richcmp.py Modules/_collectionsmodule.c Objects/dictobject.c Objects/listobject.c Objects/object.c Objects/setobject.c Objects/typeobject.c Message-ID: <20080715154639.08E8F1E403A@bag.python.org> Author: nick.coghlan Date: Tue Jul 15 17:46:38 2008 New Revision: 64967 Log: Manual forward port of 64962 - use PyObject_HashNotImplemented as a tp_hash level indicator that the default hash implementation has not been inherited Modified: python/branches/py3k/Include/object.h python/branches/py3k/Lib/decimal.py python/branches/py3k/Lib/test/seq_tests.py python/branches/py3k/Lib/test/test_descr.py python/branches/py3k/Lib/test/test_hash.py python/branches/py3k/Lib/test/test_richcmp.py python/branches/py3k/Modules/_collectionsmodule.c python/branches/py3k/Objects/dictobject.c python/branches/py3k/Objects/listobject.c python/branches/py3k/Objects/object.c python/branches/py3k/Objects/setobject.c python/branches/py3k/Objects/typeobject.c Modified: python/branches/py3k/Include/object.h ============================================================================== --- python/branches/py3k/Include/object.h (original) +++ python/branches/py3k/Include/object.h Tue Jul 15 17:46:38 2008 @@ -438,6 +438,7 @@ PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(long) PyObject_Hash(PyObject *); +PyAPI_FUNC(long) PyObject_HashNotImplemented(PyObject *); PyAPI_FUNC(int) PyObject_IsTrue(PyObject *); PyAPI_FUNC(int) PyObject_Not(PyObject *); PyAPI_FUNC(int) PyCallable_Check(PyObject *); Modified: python/branches/py3k/Lib/decimal.py ============================================================================== --- python/branches/py3k/Lib/decimal.py (original) +++ python/branches/py3k/Lib/decimal.py Tue Jul 15 17:46:38 2008 @@ -3783,10 +3783,8 @@ for flag in flags: self._ignored_flags.remove(flag) - def __hash__(self): - """A Context cannot be hashed.""" - # We inherit object.__hash__, so we must deny this explicitly - raise TypeError("Cannot hash a Context.") + # We inherit object.__hash__, so we must deny this explicitly + __hash__ = None def Etiny(self): """Returns Etiny (= Emin - prec + 1)""" Modified: python/branches/py3k/Lib/test/seq_tests.py ============================================================================== --- python/branches/py3k/Lib/test/seq_tests.py (original) +++ python/branches/py3k/Lib/test/seq_tests.py Tue Jul 15 17:46:38 2008 @@ -212,8 +212,7 @@ # So instances of AllEq must be found in all non-empty sequences. def __eq__(self, other): return True - def __hash__(self): - raise NotImplemented + __hash__ = None # Can't meet hash invariant requirements self.assert_(AllEq() not in self.type2test([])) self.assert_(AllEq() in self.type2test([1])) Modified: python/branches/py3k/Lib/test/test_descr.py ============================================================================== --- python/branches/py3k/Lib/test/test_descr.py (original) +++ python/branches/py3k/Lib/test/test_descr.py Tue Jul 15 17:46:38 2008 @@ -3070,12 +3070,20 @@ self.assertEqual(hash(d), 144) D.__hash__ = lambda self: 100 self.assertEqual(hash(d), 100) + D.__hash__ = None + self.assertRaises(TypeError, hash, d) del D.__hash__ self.assertEqual(hash(d), 144) + B.__hash__ = None + self.assertRaises(TypeError, hash, d) del B.__hash__ self.assertEqual(hash(d), 314) + C.__hash__ = None + self.assertRaises(TypeError, hash, d) del C.__hash__ self.assertEqual(hash(d), 42) + A.__hash__ = None + self.assertRaises(TypeError, hash, d) del A.__hash__ self.assertEqual(hash(d), orig_hash) d.foo = 42 Modified: python/branches/py3k/Lib/test/test_hash.py ============================================================================== --- python/branches/py3k/Lib/test/test_hash.py (original) +++ python/branches/py3k/Lib/test/test_hash.py Tue Jul 15 17:46:38 2008 @@ -1,9 +1,11 @@ # test the invariant that # iff a==b then hash(a)==hash(b) # +# Also test that hash implementations are inherited as expected import unittest from test import support +from collections import Hashable class HashEqualityTestCase(unittest.TestCase): @@ -37,8 +39,74 @@ self.same_hash(float(0.5), complex(0.5, 0.0)) +_default_hash = object.__hash__ +class DefaultHash(object): pass + +_FIXED_HASH_VALUE = 42 +class FixedHash(object): + def __hash__(self): + return _FIXED_HASH_VALUE + +class OnlyEquality(object): + def __eq__(self, other): + return self is other + +class OnlyInequality(object): + def __ne__(self, other): + return self is not other + +class OnlyCmp(object): + def __cmp__(self, other): + return cmp(id(self), id(other)) + +class InheritedHashWithEquality(FixedHash, OnlyEquality): pass +class InheritedHashWithInequality(FixedHash, OnlyInequality): pass +class InheritedHashWithCmp(FixedHash, OnlyCmp): pass + +class NoHash(object): + __hash__ = None + +class HashInheritanceTestCase(unittest.TestCase): + default_expected = [object(), + DefaultHash(), + OnlyInequality(), + ] + fixed_expected = [FixedHash(), + InheritedHashWithEquality(), + InheritedHashWithInequality(), + InheritedHashWithCmp(), + ] + error_expected = [NoHash(), + OnlyEquality(), + OnlyCmp(), + ] + + def test_default_hash(self): + for obj in self.default_expected: + self.assertEqual(hash(obj), _default_hash(obj)) + + def test_fixed_hash(self): + for obj in self.fixed_expected: + self.assertEqual(hash(obj), _FIXED_HASH_VALUE) + + def test_error_hash(self): + for obj in self.error_expected: + self.assertRaises(TypeError, hash, obj) + + def test_hashable(self): + objects = (self.default_expected + + self.fixed_expected) + for obj in objects: + self.assert_(isinstance(obj, Hashable), repr(obj)) + + def test_not_hashable(self): + for obj in self.error_expected: + self.assertFalse(isinstance(obj, Hashable), repr(obj)) + + def test_main(): - support.run_unittest(HashEqualityTestCase) + support.run_unittest(HashEqualityTestCase, + HashInheritanceTestCase) if __name__ == "__main__": Modified: python/branches/py3k/Lib/test/test_richcmp.py ============================================================================== --- python/branches/py3k/Lib/test/test_richcmp.py (original) +++ python/branches/py3k/Lib/test/test_richcmp.py Tue Jul 15 17:46:38 2008 @@ -48,8 +48,7 @@ def __setitem__(self, i, v): self.data[i] = v - def __hash__(self): - raise TypeError("Vectors cannot be hashed") + __hash__ = None # Vectors cannot be hashed def __bool__(self): raise TypeError("Vectors cannot be used in Boolean contexts") @@ -85,35 +84,6 @@ raise ValueError("Cannot compare vectors of different length") return other - -class SimpleOrder(object): - """ - A simple class that defines order but not full comparison. - """ - - def __init__(self, value): - self.value = value - - def __lt__(self, other): - if not isinstance(other, SimpleOrder): - return True - return self.value < other.value - - def __gt__(self, other): - if not isinstance(other, SimpleOrder): - return False - return self.value > other.value - - -class DumbEqualityWithoutHash(object): - """ - A class that define __eq__, but no __hash__: it shouldn't be hashable. - """ - - def __eq__(self, other): - return False - - opmap = { "lt": (lambda a,b: a< b, operator.lt, operator.__lt__), "le": (lambda a,b: a<=b, operator.le, operator.__le__), @@ -360,38 +330,8 @@ self.assertIs(op(x, y), True) -class HashableTest(unittest.TestCase): - """ - Test hashability of classes with rich operators defined. - """ - - def test_simpleOrderHashable(self): - """ - A class that only defines __gt__ and/or __lt__ should be hashable. - """ - a = SimpleOrder(1) - b = SimpleOrder(2) - self.assert_(a < b) - self.assert_(b > a) - self.assert_(a.__hash__ is not None) - - def test_notHashableException(self): - """ - If a class is not hashable, it should raise a TypeError with an - understandable message. - """ - a = DumbEqualityWithoutHash() - try: - hash(a) - except TypeError as e: - self.assertEquals(str(e), - "unhashable type: 'DumbEqualityWithoutHash'") - else: - raise support.TestFailed("Should not be here") - - def test_main(): - support.run_unittest(VectorTest, NumberTest, MiscTest, DictTest, ListTest, HashableTest) + support.run_unittest(VectorTest, NumberTest, MiscTest, DictTest, ListTest) if __name__ == "__main__": test_main() Modified: python/branches/py3k/Modules/_collectionsmodule.c ============================================================================== --- python/branches/py3k/Modules/_collectionsmodule.c (original) +++ python/branches/py3k/Modules/_collectionsmodule.c Tue Jul 15 17:46:38 2008 @@ -608,13 +608,6 @@ return 0; } -static long -deque_nohash(PyObject *self) -{ - PyErr_SetString(PyExc_TypeError, "deque objects are unhashable"); - return -1; -} - static PyObject * deque_copy(PyObject *deque) { @@ -858,7 +851,7 @@ 0, /* tp_as_number */ &deque_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ - deque_nohash, /* tp_hash */ + (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ Modified: python/branches/py3k/Objects/dictobject.c ============================================================================== --- python/branches/py3k/Objects/dictobject.c (original) +++ python/branches/py3k/Objects/dictobject.c Tue Jul 15 17:46:38 2008 @@ -2031,7 +2031,7 @@ 0, /* tp_as_number */ &dict_as_sequence, /* tp_as_sequence */ &dict_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ + (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ Modified: python/branches/py3k/Objects/listobject.c ============================================================================== --- python/branches/py3k/Objects/listobject.c (original) +++ python/branches/py3k/Objects/listobject.c Tue Jul 15 17:46:38 2008 @@ -2568,7 +2568,7 @@ 0, /* tp_as_number */ &list_as_sequence, /* tp_as_sequence */ &list_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ + (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ Modified: python/branches/py3k/Objects/object.c ============================================================================== --- python/branches/py3k/Objects/object.c (original) +++ python/branches/py3k/Objects/object.c Tue Jul 15 17:46:38 2008 @@ -781,17 +781,22 @@ #endif } +long +PyObject_HashNotImplemented(PyObject *v) +{ + PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'", + Py_TYPE(v)->tp_name); + return -1; +} long PyObject_Hash(PyObject *v) { - PyTypeObject *tp = v->ob_type; + PyTypeObject *tp = Py_TYPE(v); if (tp->tp_hash != NULL) return (*tp->tp_hash)(v); /* Otherwise, the object can't be hashed */ - PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'", - v->ob_type->tp_name); - return -1; + return PyObject_HashNotImplemented(v); } PyObject * Modified: python/branches/py3k/Objects/setobject.c ============================================================================== --- python/branches/py3k/Objects/setobject.c (original) +++ python/branches/py3k/Objects/setobject.c Tue Jul 15 17:46:38 2008 @@ -2092,7 +2092,7 @@ &set_as_number, /* tp_as_number */ &set_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ - 0, /* tp_hash */ + (hashfunc)PyObject_HashNotImplemented, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ Modified: python/branches/py3k/Objects/typeobject.c ============================================================================== --- python/branches/py3k/Objects/typeobject.c (original) +++ python/branches/py3k/Objects/typeobject.c Tue Jul 15 17:46:38 2008 @@ -3810,13 +3810,15 @@ /* Hack for tp_hash and __hash__. If after all that, tp_hash is still NULL, and __hash__ is not in - tp_dict, set tp_dict['__hash__'] equal to None. + tp_dict, set tp_hash to PyObject_HashNotImplemented and + tp_dict['__hash__'] equal to None. This signals that __hash__ is not inherited. */ if (type->tp_hash == NULL) { if (PyDict_GetItemString(type->tp_dict, "__hash__") == NULL) { if (PyDict_SetItemString(type->tp_dict, "__hash__", Py_None) < 0) goto error; + type->tp_hash = PyObject_HashNotImplemented; } } @@ -4943,9 +4945,7 @@ } if (func == NULL) { - PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'", - Py_TYPE(self)->tp_name); - return -1; + return PyObject_HashNotImplemented(self); } res = PyEval_CallObject(func, NULL); @@ -5676,6 +5676,13 @@ sanity checks. I'll buy the first person to point out a bug in this reasoning a beer. */ } + else if (descr == Py_None && + strcmp(p->name, "__hash__") == 0) { + /* We specifically allow __hash__ to be set to None + to prevent inheritance of the default + implementation from object.__hash__ */ + specific = PyObject_HashNotImplemented; + } else { use_generic = 1; generic = p->function; @@ -5889,12 +5896,21 @@ continue; if (PyDict_GetItem(dict, p->name_strobj)) continue; - descr = PyDescr_NewWrapper(type, p, *ptr); - if (descr == NULL) - return -1; - if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) - return -1; - Py_DECREF(descr); + if (*ptr == PyObject_HashNotImplemented) { + /* Classes may prevent the inheritance of the tp_hash + slot by storing PyObject_HashNotImplemented in it. Make it + visible as a None value for the __hash__ attribute. */ + if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0) + return -1; + } + else { + descr = PyDescr_NewWrapper(type, p, *ptr); + if (descr == NULL) + return -1; + if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) + return -1; + Py_DECREF(descr); + } } if (type->tp_new != NULL) { if (add_tp_new_wrapper(type) < 0) From python-3000-checkins at python.org Tue Jul 15 19:14:09 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Tue, 15 Jul 2008 19:14:09 +0200 (CEST) Subject: [Python-3000-checkins] r64969 - python/branches/py3k/Lib/test/test_set.py Message-ID: <20080715171409.A93111E4002@bag.python.org> Author: thomas.heller Date: Tue Jul 15 19:14:09 2008 New Revision: 64969 Log: Fix a potential NameError. Modified: python/branches/py3k/Lib/test/test_set.py Modified: python/branches/py3k/Lib/test/test_set.py ============================================================================== --- python/branches/py3k/Lib/test/test_set.py (original) +++ python/branches/py3k/Lib/test/test_set.py Tue Jul 15 19:14:09 2008 @@ -297,8 +297,8 @@ w = ReprWrapper() s = self.thetype([w]) w.value = s + fo = open(support.TESTFN, "w") try: - fo = open(support.TESTFN, "w") fo.write(str(s)) fo.close() fo = open(support.TESTFN, "r") From python-3000-checkins at python.org Tue Jul 15 19:14:52 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Tue, 15 Jul 2008 19:14:52 +0200 (CEST) Subject: [Python-3000-checkins] r64970 - in python/branches/py3k/Python: pythonrun.c sysmodule.c Message-ID: <20080715171452.0C9FD1E4002@bag.python.org> Author: thomas.heller Date: Tue Jul 15 19:14:51 2008 New Revision: 64970 Log: Make these files to compile again under Windows. Modified: python/branches/py3k/Python/pythonrun.c python/branches/py3k/Python/sysmodule.c Modified: python/branches/py3k/Python/pythonrun.c ============================================================================== --- python/branches/py3k/Python/pythonrun.c (original) +++ python/branches/py3k/Python/pythonrun.c Tue Jul 15 19:14:51 2008 @@ -1340,9 +1340,10 @@ /* Don't do anything else */ } else { - assert(PyExceptionClass_Check(type)); PyObject* moduleName; - char* className = PyExceptionClass_Name(type); + char* className; + assert(PyExceptionClass_Check(type)); + className = PyExceptionClass_Name(type); if (className != NULL) { char *dot = strrchr(className, '.'); if (dot != NULL) Modified: python/branches/py3k/Python/sysmodule.c ============================================================================== --- python/branches/py3k/Python/sysmodule.c (original) +++ python/branches/py3k/Python/sysmodule.c Tue Jul 15 19:14:51 2008 @@ -616,6 +616,7 @@ static PyObject *str__sizeof__, *gc_head_size = NULL; static char *kwlist[] = {"object", "default", 0}; PyObject *o, *dflt = NULL; + PyObject *method; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:getsizeof", kwlist, &o, &dflt)) @@ -639,7 +640,7 @@ if (PyType_Ready(Py_TYPE(o)) < 0) return NULL; - PyObject *method = _PyType_Lookup(Py_TYPE(o), str__sizeof__); + method = _PyType_Lookup(Py_TYPE(o), str__sizeof__); if (method == NULL) PyErr_Format(PyExc_TypeError, "Type %.100s doesn't define __sizeof__", From python-3000-checkins at python.org Tue Jul 15 19:25:08 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Tue, 15 Jul 2008 19:25:08 +0200 (CEST) Subject: [Python-3000-checkins] r64972 - in python/branches/py3k: Lib/ctypes/test/test_pep3118.py Misc/NEWS Modules/_ctypes/_ctypes.c Message-ID: <20080715172508.5D4261E400C@bag.python.org> Author: thomas.heller Date: Tue Jul 15 19:25:07 2008 New Revision: 64972 Log: Merged revisions 64968,64971 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64968 | thomas.heller | 2008-07-15 19:03:08 +0200 (Di, 15 Jul 2008) | 4 lines Issue #3258: Fix an assertion error (in debug build) and a crash (in release build) when the format string of a pointer to an incomplete structure is created. ........ r64971 | thomas.heller | 2008-07-15 19:19:50 +0200 (Di, 15 Jul 2008) | 2 lines NEWS entry for #issue 3258. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/ctypes/test/test_pep3118.py python/branches/py3k/Misc/NEWS python/branches/py3k/Modules/_ctypes/_ctypes.c Modified: python/branches/py3k/Lib/ctypes/test/test_pep3118.py ============================================================================== --- python/branches/py3k/Lib/ctypes/test/test_pep3118.py (original) +++ python/branches/py3k/Lib/ctypes/test/test_pep3118.py Tue Jul 15 19:25:07 2008 @@ -12,6 +12,8 @@ def normalize(format): # Remove current endian specifier and white space from a format # string + if format is None: + return "" format = format.replace(OTHER_ENDIAN, THIS_ENDIAN) return re.sub(r"\s", "", format) @@ -84,6 +86,14 @@ class aUnion(Union): _fields_ = [("a", c_int)] +class Incomplete(Structure): + pass + +class Complete(Structure): + pass +PComplete = POINTER(Complete) +Complete._fields_ = [("a", c_int)] + ################################################################ # # This table contains format strings as they look on little endian @@ -141,6 +151,16 @@ # the pep does't support unions (aUnion, "B", None, aUnion), + ## pointer to incomplete structure + (Incomplete, "B", None, Incomplete), + (POINTER(Incomplete), "&B", None, POINTER(Incomplete)), + + # 'Complete' is a structure that starts incomplete, but is completed after the + # pointer type to it has been created. + (Complete, "T{tp_dict); result->tp_dict = (PyObject *)dict; + dict->format = alloc_format_string(NULL, "B"); + if (dict->format == NULL) { + Py_DECREF(result); + return NULL; + } dict->paramfunc = StructUnionType_paramfunc; @@ -871,7 +876,13 @@ if (proto) { StgDictObject *itemdict = PyType_stgdict(proto); assert(itemdict); - stgdict->format = alloc_format_string("&", itemdict->format); + /* If itemdict->format is NULL, then this is a pointer to an + incomplete type. We create a generic format string + 'pointer to bytes' in this case. XXX Better would be to + fix the format string later... + */ + stgdict->format = alloc_format_string("&", + itemdict->format ? itemdict->format : "B"); if (stgdict->format == NULL) { Py_DECREF((PyObject *)stgdict); return NULL; From python-3000-checkins at python.org Tue Jul 15 21:24:01 2008 From: python-3000-checkins at python.org (neil.schemenauer) Date: Tue, 15 Jul 2008 21:24:01 +0200 (CEST) Subject: [Python-3000-checkins] r64975 - python/branches/py3k/Modules/gcmodule.c Message-ID: <20080715192401.D91501E4002@bag.python.org> Author: neil.schemenauer Date: Tue Jul 15 21:24:01 2008 New Revision: 64975 Log: Fix some broken URLs to GC design discussions. Modified: python/branches/py3k/Modules/gcmodule.c Modified: python/branches/py3k/Modules/gcmodule.c ============================================================================== --- python/branches/py3k/Modules/gcmodule.c (original) +++ python/branches/py3k/Modules/gcmodule.c Tue Jul 15 21:24:01 2008 @@ -9,9 +9,14 @@ Eric Tiedemann, and various others. http://www.arctrix.com/nas/python/gc/ - http://www.python.org/pipermail/python-dev/2000-March/003869.html - http://www.python.org/pipermail/python-dev/2000-March/004010.html - http://www.python.org/pipermail/python-dev/2000-March/004022.html + + The following mailing list threads provide a historical perspective on + the design of this module. Note that a fair amount of refinement has + occurred since those discussions. + + http://mail.python.org/pipermail/python-dev/2000-March/002385.html + http://mail.python.org/pipermail/python-dev/2000-March/002434.html + http://mail.python.org/pipermail/python-dev/2000-March/002497.html For a highlevel view of the collection process, read the collect function. From python-3000-checkins at python.org Tue Jul 15 21:46:52 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Tue, 15 Jul 2008 21:46:52 +0200 (CEST) Subject: [Python-3000-checkins] r64978 - in python/branches/py3k: Misc/ACKS Misc/NEWS Modules/_ctypes/callproc.c Message-ID: <20080715194653.005EA1E4009@bag.python.org> Author: thomas.heller Date: Tue Jul 15 21:46:52 2008 New Revision: 64978 Log: Merged revisions 64976-64977 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64976 | thomas.heller | 2008-07-15 21:39:38 +0200 (Tue, 15 Jul 2008) | 3 lines Issue #3313: Contrary to the man page, a failed dlopen() call does not always set a dlerror() message. ........ r64977 | thomas.heller | 2008-07-15 21:44:25 +0200 (Tue, 15 Jul 2008) | 2 lines Add Victor Stinner, he provided the patch for issue #3313. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Misc/ACKS python/branches/py3k/Misc/NEWS python/branches/py3k/Modules/_ctypes/callproc.c Modified: python/branches/py3k/Misc/ACKS ============================================================================== --- python/branches/py3k/Misc/ACKS (original) +++ python/branches/py3k/Misc/ACKS Tue Jul 15 21:46:52 2008 @@ -771,3 +771,4 @@ Amaury Forgeot d'Arc Peter ?strand Tarek Ziad? +Victor Stinner Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Tue Jul 15 21:46:52 2008 @@ -27,6 +27,9 @@ Library ------- +- Issue #3313: Fixed a crash when a failed dlopen() call does not set + a valid dlerror() message. + - Issue #3258: Fixed a crash when a ctypes POINTER type to an incomplete structure was created. Modified: python/branches/py3k/Modules/_ctypes/callproc.c ============================================================================== --- python/branches/py3k/Modules/_ctypes/callproc.c (original) +++ python/branches/py3k/Modules/_ctypes/callproc.c Tue Jul 15 21:46:52 2008 @@ -1383,8 +1383,11 @@ mode |= RTLD_NOW; handle = ctypes_dlopen(name, mode); if (!handle) { + char *errmsg = ctypes_dlerror(); + if (!errmsg) + errmsg = "dlopen() error"; PyErr_SetString(PyExc_OSError, - ctypes_dlerror()); + errmsg); return NULL; } return PyLong_FromVoidPtr(handle); From python-3000-checkins at python.org Tue Jul 15 22:23:34 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Tue, 15 Jul 2008 22:23:34 +0200 (CEST) Subject: [Python-3000-checkins] r64980 - in python/branches/py3k: Lib/ctypes/test/test_pep3118.py Message-ID: <20080715202334.43BC91E400C@bag.python.org> Author: thomas.heller Date: Tue Jul 15 22:23:33 2008 New Revision: 64980 Log: Merged revisions 64979 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64979 | thomas.heller | 2008-07-15 22:18:46 +0200 (Tue, 15 Jul 2008) | 1 line Fix test on 64-bit platforms. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/ctypes/test/test_pep3118.py Modified: python/branches/py3k/Lib/ctypes/test/test_pep3118.py ============================================================================== --- python/branches/py3k/Lib/ctypes/test/test_pep3118.py (original) +++ python/branches/py3k/Lib/ctypes/test/test_pep3118.py Tue Jul 15 22:23:33 2008 @@ -92,7 +92,7 @@ class Complete(Structure): pass PComplete = POINTER(Complete) -Complete._fields_ = [("a", c_int)] +Complete._fields_ = [("a", c_long)] ################################################################ # From python-3000-checkins at python.org Wed Jul 16 02:15:36 2008 From: python-3000-checkins at python.org (eric.smith) Date: Wed, 16 Jul 2008 02:15:36 +0200 (CEST) Subject: [Python-3000-checkins] r64985 - in python/branches/py3k: Doc/library/string.rst Lib/test/test_types.py Misc/NEWS Objects/stringlib/formatter.h Message-ID: <20080716001536.410681E4014@bag.python.org> Author: eric.smith Date: Wed Jul 16 02:15:35 2008 New Revision: 64985 Log: Merged revisions 64984 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64984 | eric.smith | 2008-07-15 20:11:49 -0400 (Tue, 15 Jul 2008) | 1 line Complete issue 3038: add alternate (#) formatting to bin, oct, hex in str.format(). ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/string.rst python/branches/py3k/Lib/test/test_types.py python/branches/py3k/Misc/NEWS python/branches/py3k/Objects/stringlib/formatter.h Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Wed Jul 16 02:15:35 2008 @@ -294,7 +294,7 @@ The general form of a *standard format specifier* is: .. productionlist:: sf - format_spec: [[`fill`]`align`][`sign`][0][`width`][.`precision`][`type`] + format_spec: [[`fill`]`align`][`sign`][#][0][`width`][.`precision`][`type`] fill: align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " @@ -348,6 +348,10 @@ | | positive numbers, and a minus sign on negative numbers. | +---------+----------------------------------------------------------+ +The ``'#'`` option is only valid for integers, and only for binary, +octal, or decimal output. If present, it specifies that the output +will be prefixed by ``'0b'``, ``'0o'``, or ``'0x'``, respectively. + *width* is a decimal integer defining the minimum field width. If not specified, then the field width will be determined by the content. @@ -368,7 +372,7 @@ +---------+----------------------------------------------------------+ | Type | Meaning | +=========+==========================================================+ - | ``'b'`` | Binary. Outputs the number in base 2. | + | ``'b'`` | Binary format. Outputs the number in base 2. | +---------+----------------------------------------------------------+ | ``'c'`` | Character. Converts the integer to the corresponding | | | unicode character before printing. | Modified: python/branches/py3k/Lib/test/test_types.py ============================================================================== --- python/branches/py3k/Lib/test/test_types.py (original) +++ python/branches/py3k/Lib/test/test_types.py Wed Jul 16 02:15:35 2008 @@ -301,7 +301,8 @@ test(-1, "-#5b", ' -0b1') test(1, "+#5b", ' +0b1') test(100, "+#b", '+0b1100100') -# test(100, "#012b", '0b001100100') + test(100, "#012b", '0b0001100100') + test(-100, "#012b", '-0b001100100') test(0, "#o", '0o0') test(0, "-#o", '0o0') @@ -310,6 +311,8 @@ test(-1, "-#5o", ' -0o1') test(1, "+#5o", ' +0o1') test(100, "+#o", '+0o144') + test(100, "#012o", '0o0000000144') + test(-100, "#012o", '-0o000000144') test(0, "#x", '0x0') test(0, "-#x", '0x0') @@ -318,6 +321,10 @@ test(-1, "-#5x", ' -0x1') test(1, "+#5x", ' +0x1') test(100, "+#x", '+0x64') + test(100, "#012x", '0x0000000064') + test(-100, "#012x", '-0x000000064') + test(123456, "#012x", '0x000001e240') + test(-123456, "#012x", '-0x00001e240') test(0, "#X", '0X0') test(0, "-#X", '0X0') @@ -326,6 +333,10 @@ test(-1, "-#5X", ' -0X1') test(1, "+#5X", ' +0X1') test(100, "+#X", '+0X64') + test(100, "#012X", '0X0000000064') + test(-100, "#012X", '-0X000000064') + test(123456, "#012X", '0X000001E240') + test(-123456, "#012X", '-0X00001E240') # make sure these are errors Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Wed Jul 16 02:15:35 2008 @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Issue #3083: Add alternate (#) formatting for bin, oct, hex output + for str.format(). This adds the prefix 0b, 0o, or 0x, respectively. + - Issue #3280: like chr(), the "%c" format now accepts unicode code points beyond the Basic Multilingual Plane (above 0xffff) on all configurations. On "narrow Unicode" builds, the result is a string of 2 code units, forming a Modified: python/branches/py3k/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k/Objects/stringlib/formatter.h (original) +++ python/branches/py3k/Objects/stringlib/formatter.h Wed Jul 16 02:15:35 2008 @@ -147,6 +147,13 @@ #endif } + /* If the next character is #, we're in alternate mode. This only + applies to integers. */ + if (end-ptr >= 1 && ptr[0] == '#') { + format->alternate = 1; + ++ptr; + } + /* The special case for 0-padding (backwards compat) */ if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') { format->fill_char = '0'; @@ -156,13 +163,6 @@ ++ptr; } - /* If the next character is #, we're in alternate mode. This only - applies to integers. */ - if (end-ptr >= 1 && ptr[0] == '#') { - format->alternate = 1; - ++ptr; - } - /* XXX add error checking */ specified_width = get_integer(&ptr, end, &format->width); @@ -211,9 +211,10 @@ /************************************************************************/ /* describes the layout for an integer, see the comment in - _calc_integer_widths() for details */ + calc_number_widths() for details */ typedef struct { Py_ssize_t n_lpadding; + Py_ssize_t n_prefix; Py_ssize_t n_spadding; Py_ssize_t n_rpadding; char lsign; @@ -234,6 +235,7 @@ const InternalFormatSpec *format) { r->n_lpadding = 0; + r->n_prefix = 0; r->n_spadding = 0; r->n_rpadding = 0; r->lsign = '\0'; @@ -288,13 +290,16 @@ } } + r->n_prefix = n_prefix; + /* now the number of padding characters */ if (format->width == -1) { /* no padding at all, nothing to do */ } else { /* see if any padding is needed */ - if (r->n_lsign + n_digits + r->n_rsign >= format->width) { + if (r->n_lsign + n_digits + r->n_rsign + + r->n_prefix >= format->width) { /* no padding needed, we're already bigger than the requested width */ } @@ -302,7 +307,8 @@ /* determine which of left, space, or right padding is needed */ Py_ssize_t padding = format->width - - (r->n_lsign + n_digits + r->n_rsign); + (r->n_lsign + r->n_prefix + + n_digits + r->n_rsign); if (format->align == '<') r->n_rpadding = padding; else if (format->align == '>') @@ -317,18 +323,19 @@ r->n_lpadding = padding; } } - r->n_total = r->n_lpadding + r->n_lsign + r->n_spadding + - n_digits + r->n_rsign + r->n_rpadding; + r->n_total = r->n_lpadding + r->n_lsign + r->n_prefix + + r->n_spadding + n_digits + r->n_rsign + r->n_rpadding; } /* fill in the non-digit parts of a numbers's string representation, - as determined in _calc_integer_widths(). returns the pointer to + as determined in calc_number_widths(). returns the pointer to where the digits go. */ static STRINGLIB_CHAR * fill_non_digits(STRINGLIB_CHAR *p_buf, const NumberFieldWidths *spec, - Py_ssize_t n_digits, STRINGLIB_CHAR fill_char) + STRINGLIB_CHAR *prefix, Py_ssize_t n_digits, + STRINGLIB_CHAR fill_char) { - STRINGLIB_CHAR* p_digits; + STRINGLIB_CHAR *p_digits; if (spec->n_lpadding) { STRINGLIB_FILL(p_buf, fill_char, spec->n_lpadding); @@ -337,6 +344,12 @@ if (spec->n_lsign == 1) { *p_buf++ = spec->lsign; } + if (spec->n_prefix) { + memmove(p_buf, + prefix, + spec->n_prefix * sizeof(STRINGLIB_CHAR)); + p_buf += spec->n_prefix; + } if (spec->n_spadding) { STRINGLIB_FILL(p_buf, fill_char, spec->n_spadding); p_buf += spec->n_spadding; @@ -477,6 +490,8 @@ Py_ssize_t n_grouping_chars = 0; /* Count of additional chars to allocate, used for 'n' formatting. */ + Py_ssize_t n_prefix = 0; /* Count of prefix chars, (e.g., '0x') */ + STRINGLIB_CHAR *prefix = NULL; NumberFieldWidths spec; long x; @@ -534,19 +549,16 @@ switch (format->type) { case 'b': base = 2; - if (!format->alternate) - leading_chars_to_skip = 2; /* 0b */ + leading_chars_to_skip = 2; /* 0b */ break; case 'o': base = 8; - if (!format->alternate) - leading_chars_to_skip = 2; /* 0o */ + leading_chars_to_skip = 2; /* 0o */ break; case 'x': case 'X': base = 16; - if (!format->alternate) - leading_chars_to_skip = 2; /* 0x */ + leading_chars_to_skip = 2; /* 0x */ break; default: /* shouldn't be needed, but stops a compiler warning */ case 'd': @@ -555,6 +567,11 @@ break; } + /* The number of prefix chars is the same as the leading + chars to skip */ + if (format->alternate) + n_prefix = leading_chars_to_skip; + /* Do the hard part, converting to a string in a given base */ tmp = tostring(value, base); if (tmp == NULL) @@ -563,6 +580,8 @@ pnumeric_chars = STRINGLIB_STR(tmp); n_digits = STRINGLIB_LEN(tmp); + prefix = pnumeric_chars; + /* Remember not to modify what pnumeric_chars points to. it might be interned. Only modify it after we copy it into a newly allocated output buffer. */ @@ -571,6 +590,7 @@ and skip it */ sign = pnumeric_chars[0]; if (sign == '-') { + ++prefix; ++leading_chars_to_skip; } @@ -586,7 +606,8 @@ 0, &n_grouping_chars, 0); /* Calculate the widths of the various leading and trailing parts */ - calc_number_widths(&spec, sign, 0, n_digits + n_grouping_chars, format); + calc_number_widths(&spec, sign, n_prefix, n_digits + n_grouping_chars, + format); /* Allocate a new string to hold the result */ result = STRINGLIB_NEW(NULL, spec.n_total); @@ -594,35 +615,52 @@ goto done; p = STRINGLIB_STR(result); + /* XXX There is too much magic here regarding the internals of + spec and the location of the prefix and digits. It would be + better if calc_number_widths returned a number of logical + offsets into the buffer, and those were used. Maybe in a + future code cleanup. */ + /* Fill in the digit parts */ - n_leading_chars = spec.n_lpadding + spec.n_lsign + spec.n_spadding; + n_leading_chars = spec.n_lpadding + spec.n_lsign + + spec.n_prefix + spec.n_spadding; memmove(p + n_leading_chars, pnumeric_chars, n_digits * sizeof(STRINGLIB_CHAR)); - /* If type is 'X', convert to uppercase */ + /* If type is 'X', convert the filled in digits to uppercase */ if (format->type == 'X') { Py_ssize_t t; for (t = 0; t < n_digits; ++t) p[t + n_leading_chars] = STRINGLIB_TOUPPER(p[t + n_leading_chars]); } - /* Insert the grouping, if any, after the uppercasing of 'X', so we can - ensure that grouping chars won't be affected. */ + /* Insert the grouping, if any, after the uppercasing of the digits, so + we can ensure that grouping chars won't be affected. */ if (n_grouping_chars) { /* We know this can't fail, since we've already reserved enough space. */ STRINGLIB_CHAR *pstart = p + n_leading_chars; int r = STRINGLIB_GROUPING(pstart, n_digits, n_digits, - spec.n_total+n_grouping_chars-n_leading_chars, - NULL, 0); + spec.n_total+n_grouping_chars-n_leading_chars, + NULL, 0); assert(r); } /* Fill in the non-digit parts (padding, sign, etc.) */ - fill_non_digits(p, &spec, n_digits + n_grouping_chars, + fill_non_digits(p, &spec, prefix, n_digits + n_grouping_chars, format->fill_char == '\0' ? ' ' : format->fill_char); + /* If type is 'X', uppercase the prefix. This has to be done after the + prefix is filled in by fill_non_digits */ + if (format->type == 'X') { + Py_ssize_t t; + for (t = 0; t < n_prefix; ++t) + p[t + spec.n_lpadding + spec.n_lsign] = + STRINGLIB_TOUPPER(p[t + spec.n_lpadding + spec.n_lsign]); + } + + done: Py_XDECREF(tmp); return result; @@ -768,7 +806,7 @@ goto done; /* Fill in the non-digit parts (padding, sign, etc.) */ - fill_non_digits(STRINGLIB_STR(result), &spec, n_digits, + fill_non_digits(STRINGLIB_STR(result), &spec, NULL, n_digits, format->fill_char == '\0' ? ' ' : format->fill_char); /* fill in the digit parts */ From python-3000-checkins at python.org Wed Jul 16 02:46:28 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 02:46:28 +0200 (CEST) Subject: [Python-3000-checkins] r64987 - python/branches/py3k Message-ID: <20080716004628.B98601E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 02:45:58 2008 New Revision: 64987 Log: Blocked revisions 64986 via svnmerge ........ r64986 | benjamin.peterson | 2008-07-15 19:44:02 -0500 (Tue, 15 Jul 2008) | 1 line disable lib2to3 in the trunk. It's broken just for 2.6 ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 04:02:25 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:02:25 +0200 (CEST) Subject: [Python-3000-checkins] r64989 - in python/branches/py3k: Lib/distutils/command/wininst-6.0.exe Lib/distutils/command/wininst-7.1.exe Lib/distutils/command/wininst-9.0-amd64.exe Lib/distutils/command/wininst-9.0.exe PC/bdist_wininst/install.c Message-ID: <20080716020225.78BE01E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:02:25 2008 New Revision: 64989 Log: Merged revisions 63828 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r63828 | mark.hammond | 2008-05-31 07:11:07 +0200 (Sat, 31 May 2008) | 2 lines Fix bdist_wininst --user-access-control for win2k ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/distutils/command/wininst-6.0.exe python/branches/py3k/Lib/distutils/command/wininst-7.1.exe python/branches/py3k/Lib/distutils/command/wininst-9.0-amd64.exe python/branches/py3k/Lib/distutils/command/wininst-9.0.exe python/branches/py3k/PC/bdist_wininst/install.c Modified: python/branches/py3k/Lib/distutils/command/wininst-6.0.exe ============================================================================== Binary files. No diff available. Modified: python/branches/py3k/Lib/distutils/command/wininst-7.1.exe ============================================================================== Binary files. No diff available. Modified: python/branches/py3k/Lib/distutils/command/wininst-9.0-amd64.exe ============================================================================== Binary files. No diff available. Modified: python/branches/py3k/Lib/distutils/command/wininst-9.0.exe ============================================================================== Binary files. No diff available. Modified: python/branches/py3k/PC/bdist_wininst/install.c ============================================================================== --- python/branches/py3k/PC/bdist_wininst/install.c (original) +++ python/branches/py3k/PC/bdist_wininst/install.c Wed Jul 16 04:02:25 2008 @@ -2115,11 +2115,6 @@ { HKEY hk; char key_name[80]; - OSVERSIONINFO winverinfo; - winverinfo.dwOSVersionInfoSize = sizeof(winverinfo); - // If less than XP, then we can't do it (and its not necessary). - if (!GetVersionEx(&winverinfo) || winverinfo.dwMajorVersion < 5) - return FALSE; // no Python version info == we can't know yet. if (target_version[0] == '\0') return FALSE; @@ -2135,6 +2130,23 @@ return TRUE; } +// Returns TRUE if the platform supports UAC. +BOOL PlatformSupportsUAC() +{ + // Note that win2k does seem to support ShellExecute with 'runas', + // but does *not* support IsUserAnAdmin - so we just pretend things + // only work on XP and later. + BOOL bIsWindowsXPorLater; + OSVERSIONINFO winverinfo; + winverinfo.dwOSVersionInfoSize = sizeof(winverinfo); + if (!GetVersionEx(&winverinfo)) + return FALSE; // something bad has gone wrong + bIsWindowsXPorLater = + ( (winverinfo.dwMajorVersion > 5) || + ( (winverinfo.dwMajorVersion == 5) && (winverinfo.dwMinorVersion >= 1) )); + return bIsWindowsXPorLater; +} + // Spawn ourself as an elevated application. On failure, a message is // displayed to the user - but this app will always terminate, even // on error. @@ -2190,7 +2202,7 @@ // See if we need to do the Vista UAC magic. if (strcmp(user_access_control, "force")==0) { - if (!MyIsUserAnAdmin()) { + if (PlatformSupportsUAC() && !MyIsUserAnAdmin()) { SpawnUAC(); return 0; } @@ -2198,7 +2210,7 @@ } else if (strcmp(user_access_control, "auto")==0) { // Check if it looks like we need UAC control, based // on how Python itself was installed. - if (!MyIsUserAnAdmin() && NeedAutoUAC()) { + if (PlatformSupportsUAC() && !MyIsUserAnAdmin() && NeedAutoUAC()) { SpawnUAC(); return 0; } From python-3000-checkins at python.org Wed Jul 16 04:17:57 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:17:57 +0200 (CEST) Subject: [Python-3000-checkins] r64990 - in python/branches/py3k: Include/Python.h Include/pymacconfig.h Lib/distutils/sysconfig.py Lib/distutils/unixccompiler.py Lib/distutils/util.py Lib/test/test_macos.py Mac/IDLE/idlemain.py Mac/Makefile.in Makefile.pre.in Modules/_ctypes/cfield.c Modules/_ctypes/libffi_osx/x86/x86-darwin.S configure.in pyconfig.h.in setup.py Message-ID: <20080716021757.2E51F1E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:17:56 2008 New Revision: 64990 Log: Merged revisions 63955 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r63955 | ronald.oussoren | 2008-06-05 14:58:24 +0200 (Thu, 05 Jun 2008) | 20 lines MacOS X: Enable 4-way universal builds This patch adds a new configure argument on OSX: --with-universal-archs=[32-bit|64-bit|all] When used with the --enable-universalsdk option this controls which CPU architectures are includes in the framework. The default is 32-bit, meaning i386 and ppc. The most useful alternative is 'all', which includes all 4 CPU architectures supported by MacOS X (i386, ppc, x86_64 and ppc64). This includes limited support for the Carbon bindings in 64-bit mode as well, limited because (a) I haven't done extensive testing and (b) a large portion of the Carbon API's aren't available in 64-bit mode anyway. I've also duplicated a feature of Apple's build of python: setting the environment variable 'ARCHFLAGS' controls the '-arch' flags used for building extensions using distutils. ........ Added: python/branches/py3k/Include/pymacconfig.h - copied unchanged from r63955, /python/trunk/Include/pymacconfig.h python/branches/py3k/Lib/test/test_macos.py - copied unchanged from r63955, /python/trunk/Lib/test/test_macos.py Modified: python/branches/py3k/ (props changed) python/branches/py3k/Include/Python.h python/branches/py3k/Lib/distutils/sysconfig.py python/branches/py3k/Lib/distutils/unixccompiler.py python/branches/py3k/Lib/distutils/util.py python/branches/py3k/Mac/IDLE/idlemain.py python/branches/py3k/Mac/Makefile.in python/branches/py3k/Makefile.pre.in python/branches/py3k/Modules/_ctypes/cfield.c python/branches/py3k/Modules/_ctypes/libffi_osx/x86/x86-darwin.S python/branches/py3k/configure.in python/branches/py3k/pyconfig.h.in python/branches/py3k/setup.py Modified: python/branches/py3k/Include/Python.h ============================================================================== --- python/branches/py3k/Include/Python.h (original) +++ python/branches/py3k/Include/Python.h Wed Jul 16 04:17:56 2008 @@ -6,6 +6,7 @@ #include "patchlevel.h" #include "pyconfig.h" +#include "pymacconfig.h" #include Modified: python/branches/py3k/Lib/distutils/sysconfig.py ============================================================================== --- python/branches/py3k/Lib/distutils/sysconfig.py (original) +++ python/branches/py3k/Lib/distutils/sysconfig.py Wed Jul 16 04:17:56 2008 @@ -516,6 +516,26 @@ flags = re.sub('-isysroot [^ \t]*', ' ', flags) _config_vars[key] = flags + else: + + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _config_vars[key] + flags = re.sub('-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _config_vars[key] = flags + if args: vals = [] for name in args: Modified: python/branches/py3k/Lib/distutils/unixccompiler.py ============================================================================== --- python/branches/py3k/Lib/distutils/unixccompiler.py (original) +++ python/branches/py3k/Lib/distutils/unixccompiler.py Wed Jul 16 04:17:56 2008 @@ -63,7 +63,7 @@ stripArch = '-arch' in cc_args stripSysroot = '-isysroot' in cc_args - if stripArch: + if stripArch or 'ARCHFLAGS' in os.environ: while True: try: index = compiler_so.index('-arch') @@ -72,6 +72,12 @@ except ValueError: break + if 'ARCHFLAGS' in os.environ and not stripArch: + # User specified different -arch flags in the environ, + # see also distutils.sysconfig + compiler_so = compiler_so + ' ' + os.environ['ARCHFLAGS'] + + if stripSysroot: try: index = compiler_so.index('-isysroot') Modified: python/branches/py3k/Lib/distutils/util.py ============================================================================== --- python/branches/py3k/Lib/distutils/util.py (original) +++ python/branches/py3k/Lib/distutils/util.py Wed Jul 16 04:17:56 2008 @@ -124,12 +124,19 @@ osname = "macosx" - if (release + '.') < '10.4.' and \ - get_config_vars().get('UNIVERSALSDK', '').strip(): + if (release + '.') >= '10.4.' and \ + '-arch' in get_config_vars().get('CFLAGS', '').strip(): # The universal build will build fat binaries, but not on # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + machine = 'fat' + if '-arch x86_64' in get_config_vars().get('CFLAGS'): + machine = 'universal' + elif machine in ('PowerPC', 'Power_Macintosh'): # Pick a sane name for the PPC architecture. machine = 'ppc' Modified: python/branches/py3k/Mac/IDLE/idlemain.py ============================================================================== --- python/branches/py3k/Mac/IDLE/idlemain.py (original) +++ python/branches/py3k/Mac/IDLE/idlemain.py Wed Jul 16 04:17:56 2008 @@ -13,7 +13,10 @@ # Make sure sys.executable points to the python interpreter inside the # framework, instead of at the helper executable inside the application # bundle (the latter works, but doesn't allow access to the window server) -sys.executable = os.path.join(sys.prefix, 'bin', 'python') +if sys.executable.endswith('-32'): + sys.executable = os.path.join(sys.prefix, 'bin', 'python-32') +else: + sys.executable = os.path.join(sys.prefix, 'bin', 'python') # Look for the -psn argument that the launcher adds and remove it, it will # only confuse the IDLE startup code. Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Wed Jul 16 04:17:56 2008 @@ -48,12 +48,42 @@ installapps: install_PythonLauncher install_IDLE checkapplepython install_pythonw \ install_versionedtools +installapps4way: install_Python4way install_BuildApplet install_PythonLauncher install_IDLE install_pythonw4way install_versionedtools + + install_pythonw: pythonw $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)" $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/python$(VERSION)" ln -sf python$(VERSION) "$(DESTDIR)$(prefix)/bin/python" ln -sf pythonw$(VERSION) "$(DESTDIR)$(prefix)/bin/pythonw" + +# Install 3 variants of python/pythonw: +# - 32-bit (i386 and ppc) +# - 64-bit (x86_64 and ppc64) +# - all (all four architectures) +# - Make 'python' and 'pythonw' aliases for the 32-bit variant +install_pythonw4way: pythonw-32 pythonw-64 pythonw + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw-64 "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)-64" + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw-64 "$(DESTDIR)$(prefix)/bin/python$(VERSION)-64" + ln -sf python$(VERSION)-64 "$(DESTDIR)$(prefix)/bin/python-64" + ln -sf pythonw$(VERSION)-64 "$(DESTDIR)$(prefix)/bin/pythonw-64" + + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw-32 "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)-32" + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw-32 "$(DESTDIR)$(prefix)/bin/python$(VERSION)-32" + ln -sf python$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/python-32" + ln -sf pythonw$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/pythonw-32" + + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)-all" + $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/python$(VERSION)-all" + ln -sf python$(VERSION)-all "$(DESTDIR)$(prefix)/bin/python-all" + ln -sf pythonw$(VERSION)-all "$(DESTDIR)$(prefix)/bin/pythonw-all" + + ln -sf pythonw$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)" + ln -sf python$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/python$(VERSION)" + ln -sf pythonw$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/pythonw" + ln -sf python$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/python" + # # Install unix tools in /usr/local/bin. These are just aliases for the # actual installation inside the framework. @@ -64,11 +94,16 @@ fi for fn in python pythonw idle pydoc python-config smtpd.py \ python$(VERSION) pythonw$(VERSION) idle$(VERSION) \ - pydoc$(VERSION) python-config$(VERSION) smtpd$(VERSION).py ;\ + pydoc$(VERSION) python$(VERSION)-config smtpd$(VERSION).py ;\ do \ ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\ done + +# TODO: install symlinks for -32, -64 and -all as well +installunixtools4way: installunixtools + + # # Like installunixtools, but only install links to the versioned binaries. # @@ -77,18 +112,20 @@ $(INSTALL) -d -m $(DIRMODE) "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" ;\ fi for fn in python$(VERSION) pythonw$(VERSION) idle$(VERSION) \ - pydoc$(VERSION) python-config$(VERSION) smtpd$(VERSION).py ;\ + pydoc$(VERSION) python$(VERSION)-config) smtpd$(VERSION).py ;\ do \ ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\ done +# TODO: -32, -64 and -all variants +altinstallunixtools4way: altinstallunixtools # By default most tools are installed without a version in their basename, to # make it easier to install (and use) several python versions side-by-side move # the tools to a version-specific name and add the non-versioned name as an # alias. install_versionedtools: - for fn in idle pydoc python-config ;\ + for fn in idle pydoc ;\ do \ if [ -h "$(DESTDIR)$(prefix)/bin/$${fn}" ]; then \ continue ;\ @@ -96,6 +133,10 @@ mv "$(DESTDIR)$(prefix)/bin/$${fn}" "$(DESTDIR)$(prefix)/bin/$${fn}$(VERSION)" ;\ ln -sf "$${fn}$(VERSION)" "$(DESTDIR)$(prefix)/bin/$${fn}" ;\ done + if [ ! -h "$(DESTDIR)$(prefix)/bin/python-config" ]; then \ + mv "$(DESTDIR)$(prefix)/bin/python-config" "$(DESTDIR)$(prefix)/bin/python$(VERSION)-config" ;\ + ln -sf "python$(VERSION)-config" "$(DESTDIR)$(prefix)/bin/python-config" ; \ + fi if [ ! -h "$(DESTDIR)$(prefix)/bin/smtpd.py" ]; then \ mv "$(DESTDIR)$(prefix)/bin/smtpd.py" "$(DESTDIR)$(prefix)/bin/smtpd$(VERSION).py" ;\ ln -sf "smtpd$(VERSION).py" "$(DESTDIR)$(prefix)/bin/smtpd.py" ;\ @@ -106,6 +147,13 @@ $(CC) $(LDFLAGS) -o $@ $(srcdir)/Tools/pythonw.c \ -DPYTHONWEXECUTABLE='"$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)"' +pythonw-32: $(srcdir)/Tools/pythonw.c Makefile + $(CC) $(LDFLAGS) -o $@ -arch i386 -arch ppc $(srcdir)/Tools/pythonw.c \ + -DPYTHONWEXECUTABLE='"$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)-32"' + +pythonw-64: $(srcdir)/Tools/pythonw.c Makefile + $(CC) $(LDFLAGS) -o $@ -arch x86_64 -arch ppc64 $(srcdir)/Tools/pythonw.c \ + -DPYTHONWEXECUTABLE='"$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)-64"' install_PythonLauncher: cd PythonLauncher && make install DESTDIR=$(DESTDIR) @@ -158,6 +206,12 @@ done $(INSTALL_PROGRAM) $(STRIPFLAG) $(BUILDPYTHON) "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)" +install_Python4way: install_Python + lipo -extract i386 -extract ppc7400 -output "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)-32" "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)" + lipo -extract x86_64 -extract ppc64 -output "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)-64" "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)" + + + install_IDLE: test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" Modified: python/branches/py3k/Makefile.pre.in ============================================================================== --- python/branches/py3k/Makefile.pre.in (original) +++ python/branches/py3k/Makefile.pre.in Wed Jul 16 04:17:56 2008 @@ -428,7 +428,7 @@ $(RESSRCDIR)/Info.plist $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION) if test "${UNIVERSALSDK}"; then \ - $(CC) -o $(LDLIBRARY) -arch i386 -arch ppc -dynamiclib \ + $(CC) -o $(LDLIBRARY) @UNIVERSAL_ARCH_FLAGS@ -dynamiclib \ -isysroot "${UNIVERSALSDK}" \ -all_load $(LIBRARY) -Wl,-single_module \ -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \ @@ -1031,13 +1031,22 @@ frameworkinstallapps: cd Mac && $(MAKE) installapps DESTDIR="$(DESTDIR)" +frameworkinstallapps4way: + cd Mac && $(MAKE) installapps4way DESTDIR="$(DESTDIR)" + # This install the unix python and pythonw tools in /usr/local/bin frameworkinstallunixtools: cd Mac && $(MAKE) installunixtools DESTDIR="$(DESTDIR)" +frameworkinstallunixtools4way: + cd Mac && $(MAKE) installunixtools4way DESTDIR="$(DESTDIR)" + frameworkaltinstallunixtools: cd Mac && $(MAKE) altinstallunixtools DESTDIR="$(DESTDIR)" +frameworkaltinstallunixtools4way: + cd Mac && $(MAKE) altinstallunixtools4way DESTDIR="$(DESTDIR)" + # This installs the Demos and Tools into the applications directory. # It is not part of a normal frameworkinstall frameworkinstallextras: @@ -1182,7 +1191,7 @@ # Perform some verification checks on any modified files. check: - ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py + $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/scripts/patchcheck.py # Dependencies Modified: python/branches/py3k/Modules/_ctypes/cfield.c ============================================================================== --- python/branches/py3k/Modules/_ctypes/cfield.c (original) +++ python/branches/py3k/Modules/_ctypes/cfield.c Wed Jul 16 04:17:56 2008 @@ -1778,6 +1778,7 @@ #ifdef ffi_type_longdouble #undef ffi_type_longdouble #endif + /* This is already defined on OSX */ ffi_type ffi_type_longdouble = { sizeof(long double), LONGDOUBLE_ALIGN, FFI_TYPE_LONGDOUBLE }; Modified: python/branches/py3k/Modules/_ctypes/libffi_osx/x86/x86-darwin.S ============================================================================== --- python/branches/py3k/Modules/_ctypes/libffi_osx/x86/x86-darwin.S (original) +++ python/branches/py3k/Modules/_ctypes/libffi_osx/x86/x86-darwin.S Wed Jul 16 04:17:56 2008 @@ -179,7 +179,6 @@ movl %ebp,%esp popl %ebp ret -.LFE1: .ffi_call_SYSV_end: #if 0 .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV @@ -220,7 +219,7 @@ #else .long .LFB1 /* FDE initial location */ #endif - .long .LFE1-.LFB1 /* FDE address range */ + .long .ffi_call_SYSV_end-.LFB1 /* FDE address range */ #ifdef __PIC__ .byte 0x0 /* .uleb128 0x0; Augmentation size */ #endif Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Wed Jul 16 04:17:56 2008 @@ -57,6 +57,12 @@ # u_int on Irix 5.3. Defining _BSD_TYPES brings it back. AC_DEFINE(_BSD_TYPES, 1, [Define on Irix to enable u_int]) +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. +AC_DEFINE(_DARWIN_C_SOURCE, 1, [Define on Darwin to activate all library features]) + + define_xopen_source=yes # Arguments passed to configure. @@ -86,6 +92,20 @@ ]) AC_SUBST(UNIVERSALSDK) +UNIVERSAL_ARCHS="32-bit" +AC_MSG_CHECKING(for --with-universal-archs) +AC_ARG_WITH(universal-archs, + AC_HELP_STRING(--with-universal-archs=ARCH, select architectures for universal build ("32-bit", "64-bit" or "all")), +[ + AC_MSG_RESULT($withval) + UNIVERSAL_ARCHS="$withval" +], +[ + AC_MSG_RESULT(32-bit) +]) + + + AC_ARG_WITH(framework-name, AC_HELP_STRING(--with-framework-name=FRAMEWORK, specify an alternate name of the framework built with --enable-framework), @@ -127,9 +147,14 @@ PYTHONFRAMEWORKPREFIX=$enableval PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR FRAMEWORKINSTALLFIRST="frameworkinstallstructure" - FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools" - FRAMEWORKALTINSTALLFIRST="${FRAMEWORKINSTALLFIRST} bininstall maninstall" - FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools" + FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure bininstall maninstall" + if test "$UNIVERSAL_ARCHS" = "all" + then + FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps4way frameworkinstallunixtools4way" + else + FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools" + fi + if test "x${prefix}" = "xNONE" ; then FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}" else @@ -159,6 +184,12 @@ FRAMEWORKUNIXTOOLSPREFIX="${prefix}" fi enable_framework= + + if test "$UNIVERSAL_ARCHS" = "all" + then + FRAMEWORKINSTALLLAST=update4wayuniversal + FRAMEWORKALTINSTALLLAST=update4wayuniversal + fi ]) AC_SUBST(PYTHONFRAMEWORK) AC_SUBST(PYTHONFRAMEWORKIDENTIFIER) @@ -782,6 +813,11 @@ fi AC_SUBST(BASECFLAGS) + +# The -arch flags for universal builds on OSX +UNIVERSAL_ARCH_FLAGS= +AC_SUBST(UNIVERSAL_ARCH_FLAGS) + # tweak BASECFLAGS based on compiler and platform case $GCC in yes) @@ -820,7 +856,23 @@ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd # used to be here, but non-Apple gcc doesn't accept them. if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + + else + AC_MSG_ERROR([proper usage is --with-universalarch=32-bit|64-bit|all]) + + fi + + + BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" fi ;; @@ -1495,6 +1547,12 @@ if test ${cur_target} '>' 10.2; then cur_target=10.3 fi + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a 4-way + # universal build is OSX 10.5, that's the first + # OS release where 4-way builds make sense. + cur_target='10.5' + fi CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the @@ -1505,10 +1563,10 @@ export MACOSX_DEPLOYMENT_TARGET EXPORT_MACOSX_DEPLOYMENT_TARGET='' - if test ${MACOSX_DEPLOYMENT_TARGET-${cur_target}} '>' 10.2 + if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then if test "${enable_universalsdk}"; then - LDFLAGS="-arch i386 -arch ppc -isysroot ${UNIVERSALSDK} ${LDFLAGS}" + LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" fi LDSHARED='$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup' BLDSHARED="$LDSHARED" @@ -3098,23 +3156,6 @@ # check for endianness AC_C_BIGENDIAN -AH_VERBATIM([WORDS_BIGENDIAN], -[ - /* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). - - The block below does compile-time checking for endianness on platforms - that use GCC and therefore allows compiling fat binaries on OSX by using - '-arch ppc -arch i386' as the compile flags. The phrasing was choosen - such that the configure-result is used on systems that don't use GCC. - */ -#ifdef __BIG_ENDIAN__ -#define WORDS_BIGENDIAN 1 -#else -#ifndef __LITTLE_ENDIAN__ -#undef WORDS_BIGENDIAN -#endif -#endif]) # Check whether right shifting a negative integer extends the sign bit # or fills with zeros (like the Cray J90, according to Tim Peters). Modified: python/branches/py3k/pyconfig.h.in ============================================================================== --- python/branches/py3k/pyconfig.h.in (original) +++ python/branches/py3k/pyconfig.h.in Wed Jul 16 04:17:56 2008 @@ -489,6 +489,9 @@ /* Define if you have readline 4.2 */ #undef HAVE_RL_COMPLETION_MATCHES +/* Define when using libedit's readline emulation */ +#undef HAVE_RL_DISPM_VFUNC + /* Define if you have readline 4.0 */ #undef HAVE_RL_PRE_INPUT_HOOK @@ -976,22 +979,9 @@ /* Define to profile with the Pentium timestamp counter */ #undef WITH_TSC - - /* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). - - The block below does compile-time checking for endianness on platforms - that use GCC and therefore allows compiling fat binaries on OSX by using - '-arch ppc -arch i386' as the compile flags. The phrasing was choosen - such that the configure-result is used on systems that don't use GCC. - */ -#ifdef __BIG_ENDIAN__ -#define WORDS_BIGENDIAN 1 -#else -#ifndef __LITTLE_ENDIAN__ +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN -#endif -#endif /* Define to 1 if on AIX 3. System headers sometimes define this. @@ -1006,6 +996,9 @@ /* Define on Irix to enable u_int */ #undef _BSD_TYPES +/* Define on Darwin to activate all library features */ +#undef _DARWIN_C_SOURCE + /* This must be set to 64 on some systems to enable large file support. */ #undef _FILE_OFFSET_BITS Modified: python/branches/py3k/setup.py ============================================================================== --- python/branches/py3k/setup.py (original) +++ python/branches/py3k/setup.py Wed Jul 16 04:17:56 2008 @@ -241,6 +241,19 @@ 'WARNING: skipping import check for Carbon-based "%s"' % ext.name) return + + if self.get_platform() == 'darwin' and ( + sys.maxint > 2**32 and '-arch' in ext.extra_link_args): + # Don't bother doing an import check when an extension was + # build with an explicit '-arch' flag on OSX. That's currently + # only used to build 32-bit only extensions in a 4-way + # universal build and loading 32-bit code into a 64-bit + # process will fail. + self.announce( + 'WARNING: skipping import check for "%s"' % + ext.name) + return + # Workaround for Cygwin: Cygwin currently has fork issues when many # modules have been imported if self.get_platform() == 'cygwin': @@ -507,10 +520,12 @@ # readline do_readline = self.compiler.find_library_file(lib_dirs, 'readline') - if platform == 'darwin': + if platform == 'darwin': # and os.uname()[2] < '9.': # MacOSX 10.4 has a broken readline. Don't try to build # the readline module unless the user has installed a fixed # readline package + # FIXME: The readline emulation on 10.5 is better, but the + # readline module doesn't compile out of the box. if find_file('readline/rlconf.h', inc_dirs, []) is None: do_readline = False if do_readline: @@ -1242,11 +1257,29 @@ include_dirs.append('/usr/X11R6/include') frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] + # All existing framework builds of Tcl/Tk don't support 64-bit + # architectures. + cflags = sysconfig.get_config_vars('CFLAGS')[0] + archs = re.findall('-arch\s+(\w+)', cflags) + if 'x86_64' in archs or 'ppc64' in archs: + try: + archs.remove('x86_64') + except ValueError: + pass + try: + archs.remove('ppc64') + except ValueError: + pass + + for a in archs: + frameworks.append('-arch') + frameworks.append(a) + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], define_macros=[('WITH_APPINIT', 1)], include_dirs = include_dirs, libraries = [], - extra_compile_args = frameworks, + extra_compile_args = frameworks[2:], extra_link_args = frameworks, ) self.extensions.append(ext) @@ -1377,6 +1410,7 @@ '_ctypes', 'libffi_osx')) sources = [os.path.join(ffi_srcdir, p) for p in ['ffi.c', + 'x86/darwin64.S', 'x86/x86-darwin.S', 'x86/x86-ffi_darwin.c', 'x86/x86-ffi64.c', From python-3000-checkins at python.org Wed Jul 16 04:20:16 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 04:20:16 +0200 (CEST) Subject: [Python-3000-checkins] r64991 - python/branches/py3k/configure Message-ID: <20080716022016.82CFB1E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 04:20:15 2008 New Revision: 64991 Log: update configure Modified: python/branches/py3k/configure Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Wed Jul 16 04:20:15 2008 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 64085 . +# From configure.in Revision: 64990 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -701,6 +701,7 @@ LN OPT BASECFLAGS +UNIVERSAL_ARCH_FLAGS OTHER_LIBTOOL_OPT LIBTOOL_CRUFT SO @@ -1322,6 +1323,9 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-universal-archs=ARCH + select architectures for universal build ("32-bit", + "64-bit" or "all") --with-framework-name=FRAMEWORK specify an alternate name of the framework built with --enable-framework @@ -1845,6 +1849,16 @@ _ACEOF +# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables +# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable +# them. + +cat >>confdefs.h <<\_ACEOF +#define _DARWIN_C_SOURCE 1 +_ACEOF + + + define_xopen_source=yes # Arguments passed to configure. @@ -1878,6 +1892,27 @@ +UNIVERSAL_ARCHS="32-bit" +{ echo "$as_me:$LINENO: checking for --with-universal-archs" >&5 +echo $ECHO_N "checking for --with-universal-archs... $ECHO_C" >&6; } + +# Check whether --with-universal-archs was given. +if test "${with_universal_archs+set}" = set; then + withval=$with_universal_archs; + { echo "$as_me:$LINENO: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6; } + UNIVERSAL_ARCHS="$withval" + +else + + { echo "$as_me:$LINENO: result: 32-bit" >&5 +echo "${ECHO_T}32-bit" >&6; } + +fi + + + + # Check whether --with-framework-name was given. if test "${with_framework_name+set}" = set; then @@ -1922,9 +1957,14 @@ PYTHONFRAMEWORKPREFIX=$enableval PYTHONFRAMEWORKINSTALLDIR=$PYTHONFRAMEWORKPREFIX/$PYTHONFRAMEWORKDIR FRAMEWORKINSTALLFIRST="frameworkinstallstructure" - FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkinstallunixtools" - FRAMEWORKALTINSTALLFIRST="${FRAMEWORKINSTALLFIRST} bininstall maninstall" - FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools" + FRAMEWORKALTINSTALLFIRST="frameworkinstallstructure bininstall maninstall" + if test "$UNIVERSAL_ARCHS" = "all" + then + FRAMEWORKINSTALLLAST="frameworkinstallmaclib frameworkinstallapps4way frameworkinstallunixtools4way" + else + FRAMEWORKALTINSTALLLAST="frameworkinstallmaclib frameworkinstallapps frameworkaltinstallunixtools" + fi + if test "x${prefix}" = "xNONE" ; then FRAMEWORKUNIXTOOLSPREFIX="${ac_default_prefix}" else @@ -1961,6 +2001,12 @@ fi enable_framework= + if test "$UNIVERSAL_ARCHS" = "all" + then + FRAMEWORKINSTALLLAST=update4wayuniversal + FRAMEWORKALTINSTALLLAST=update4wayuniversal + fi + fi @@ -4454,6 +4500,11 @@ fi + +# The -arch flags for universal builds on OSX +UNIVERSAL_ARCH_FLAGS= + + # tweak BASECFLAGS based on compiler and platform case $GCC in yes) @@ -4534,7 +4585,25 @@ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd # used to be here, but non-Apple gcc doesn't accept them. if test "${enable_universalsdk}"; then - BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + UNIVERSAL_ARCH_FLAGS="" + if test "$UNIVERSAL_ARCHS" = "32-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + + elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then + UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" + + elif test "$UNIVERSAL_ARCHS" = "all" ; then + UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + + else + { { echo "$as_me:$LINENO: error: proper usage is --with-universalarch=32-bit|64-bit|all" >&5 +echo "$as_me: error: proper usage is --with-universalarch=32-bit|64-bit|all" >&2;} + { (exit 1); exit 1; }; } + + fi + + + BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" fi ;; @@ -12869,6 +12938,12 @@ if test ${cur_target} '>' 10.2; then cur_target=10.3 fi + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a 4-way + # universal build is OSX 10.5, that's the first + # OS release where 4-way builds make sense. + cur_target='10.5' + fi CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the @@ -12879,10 +12954,10 @@ export MACOSX_DEPLOYMENT_TARGET EXPORT_MACOSX_DEPLOYMENT_TARGET='' - if test ${MACOSX_DEPLOYMENT_TARGET-${cur_target}} '>' 10.2 + if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then if test "${enable_universalsdk}"; then - LDFLAGS="-arch i386 -arch ppc -isysroot ${UNIVERSALSDK} ${LDFLAGS}" + LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" fi LDSHARED='$(CC) $(LDFLAGS) -bundle -undefined dynamic_lookup' BLDSHARED="$LDSHARED" @@ -22345,8 +22420,6 @@ esac - - # Check whether right shifting a negative integer extends the sign bit # or fills with zeros (like the Cray J90, according to Tim Peters). { echo "$as_me:$LINENO: checking whether right shift extends the sign bit" >&5 @@ -24901,6 +24974,7 @@ LN!$LN$ac_delim OPT!$OPT$ac_delim BASECFLAGS!$BASECFLAGS$ac_delim +UNIVERSAL_ARCH_FLAGS!$UNIVERSAL_ARCH_FLAGS$ac_delim OTHER_LIBTOOL_OPT!$OTHER_LIBTOOL_OPT$ac_delim LIBTOOL_CRUFT!$LIBTOOL_CRUFT$ac_delim SO!$SO$ac_delim @@ -24912,7 +24986,6 @@ SHLIBS!$SHLIBS$ac_delim USE_SIGNAL_MODULE!$USE_SIGNAL_MODULE$ac_delim SIGNAL_OBJS!$SIGNAL_OBJS$ac_delim -USE_THREAD_MODULE!$USE_THREAD_MODULE$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -24954,6 +25027,7 @@ ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF +USE_THREAD_MODULE!$USE_THREAD_MODULE$ac_delim LDLAST!$LDLAST$ac_delim THREADOBJ!$THREADOBJ$ac_delim DLINCLDIR!$DLINCLDIR$ac_delim @@ -24973,7 +25047,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 17; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 18; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 From python-3000-checkins at python.org Wed Jul 16 04:21:06 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:21:06 +0200 (CEST) Subject: [Python-3000-checkins] r64992 - in python/branches/py3k: configure.in pyconfig.h.in Message-ID: <20080716022106.E3FEF1E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:21:06 2008 New Revision: 64992 Log: Merged revisions 63997 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r63997 | ronald.oussoren | 2008-06-06 23:31:33 +0200 (Fri, 06 Jun 2008) | 2 lines Fix build issue on OSX 10.4 ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/configure.in python/branches/py3k/pyconfig.h.in Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Wed Jul 16 04:21:06 2008 @@ -873,6 +873,7 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" fi ;; @@ -1397,6 +1398,7 @@ CC="$ac_save_cc" + AC_SUBST(OTHER_LIBTOOL_OPT) case $ac_sys_system/$ac_sys_release in Darwin/@<:@01567@:>@\..*) @@ -1718,6 +1720,7 @@ fi AC_MSG_RESULT($LINKFORSHARED) + AC_SUBST(CFLAGSFORSHARED) AC_MSG_CHECKING(CFLAGSFORSHARED) if test ! "$LIBRARY" = "$LDLIBRARY" @@ -2223,6 +2226,13 @@ fi fi +AC_MSG_CHECKING(for OSX 10.5 SDK or later) +AC_TRY_COMPILE([#include ], FSIORefNum fRef = 0, + AC_DEFINE(HAVE_OSX105_SDK, 1, Define if compiling using MacOS X 10.5 SDK or later.) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) +) + # Check for --with-doc-strings AC_MSG_CHECKING(for --with-doc-strings) AC_ARG_WITH(doc-strings, Modified: python/branches/py3k/pyconfig.h.in ============================================================================== --- python/branches/py3k/pyconfig.h.in (original) +++ python/branches/py3k/pyconfig.h.in Wed Jul 16 04:21:06 2008 @@ -426,6 +426,9 @@ /* Define to 1 if you have the `openpty' function. */ #undef HAVE_OPENPTY +/* Define if compiling using MacOS X 10.5 SDK or later. */ +#undef HAVE_OSX105_SDK + /* Define to 1 if you have the `pathconf' function. */ #undef HAVE_PATHCONF @@ -489,9 +492,6 @@ /* Define if you have readline 4.2 */ #undef HAVE_RL_COMPLETION_MATCHES -/* Define when using libedit's readline emulation */ -#undef HAVE_RL_DISPM_VFUNC - /* Define if you have readline 4.0 */ #undef HAVE_RL_PRE_INPUT_HOOK From python-3000-checkins at python.org Wed Jul 16 04:23:21 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:23:21 +0200 (CEST) Subject: [Python-3000-checkins] r64993 - python/branches/py3k Message-ID: <20080716022321.713C01E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:23:21 2008 New Revision: 64993 Log: Blocked revisions 64424 via svnmerge ........ r64424 | raymond.hettinger | 2008-06-20 06:18:15 +0200 (Fri, 20 Jun 2008) | 1 line Make bin() implementation parallel oct() and hex() so that int/long subclasses can override or so that other classes can support. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 04:23:26 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 04:23:26 +0200 (CEST) Subject: [Python-3000-checkins] r64994 - python/branches/py3k/configure Message-ID: <20080716022326.51AD91E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 04:23:25 2008 New Revision: 64994 Log: update configure again :) Modified: python/branches/py3k/configure Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Wed Jul 16 04:23:25 2008 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 64990 . +# From configure.in Revision: 64992 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -4604,6 +4604,7 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" fi ;; @@ -12773,6 +12774,7 @@ + case $ac_sys_system/$ac_sys_release in Darwin/[01567]\..*) OTHER_LIBTOOL_OPT="-prebind -seg1addr 0x10000000" @@ -13115,6 +13117,7 @@ echo "${ECHO_T}$LINKFORSHARED" >&6; } + { echo "$as_me:$LINENO: checking CFLAGSFORSHARED" >&5 echo $ECHO_N "checking CFLAGSFORSHARED... $ECHO_C" >&6; } if test ! "$LIBRARY" = "$LDLIBRARY" @@ -15461,6 +15464,58 @@ fi fi +{ echo "$as_me:$LINENO: checking for OSX 10.5 SDK or later" >&5 +echo $ECHO_N "checking for OSX 10.5 SDK or later... $ECHO_C" >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +FSIORefNum fRef = 0 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_OSX105_SDK 1 +_ACEOF + + { echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; } +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; } + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + # Check for --with-doc-strings { echo "$as_me:$LINENO: checking for --with-doc-strings" >&5 echo $ECHO_N "checking for --with-doc-strings... $ECHO_C" >&6; } From python-3000-checkins at python.org Wed Jul 16 04:39:02 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 04:39:02 +0200 (CEST) Subject: [Python-3000-checkins] r64995 - python/branches/py3k/setup.py Message-ID: <20080716023902.E8F851E4002@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 04:39:02 2008 New Revision: 64995 Log: sys.maxint -> sys.maxsize Modified: python/branches/py3k/setup.py Modified: python/branches/py3k/setup.py ============================================================================== --- python/branches/py3k/setup.py (original) +++ python/branches/py3k/setup.py Wed Jul 16 04:39:02 2008 @@ -243,7 +243,7 @@ return if self.get_platform() == 'darwin' and ( - sys.maxint > 2**32 and '-arch' in ext.extra_link_args): + sys.maxsize > 2**32 and '-arch' in ext.extra_link_args): # Don't bother doing an import check when an extension was # build with an explicit '-arch' flag on OSX. That's currently # only used to build 32-bit only extensions in a 4-way From python-3000-checkins at python.org Wed Jul 16 04:51:06 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:51:06 +0200 (CEST) Subject: [Python-3000-checkins] r64996 - python/branches/py3k Message-ID: <20080716025106.6B8E61E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:51:06 2008 New Revision: 64996 Log: Blocked revisions 64438-64439,64516 via svnmerge ........ r64438 | raymond.hettinger | 2008-06-21 08:39:53 +0200 (Sat, 21 Jun 2008) | 1 line Issue 3008: hex/oct/bin can show floats exactly. ........ r64439 | hyeshik.chang | 2008-06-21 13:15:30 +0200 (Sat, 21 Jun 2008) | 2 lines Fix build on FreeBSD gcc. ........ r64516 | raymond.hettinger | 2008-06-25 00:46:07 +0200 (Wed, 25 Jun 2008) | 1 line Revert 64424, 64438, and 64439. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 04:55:37 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 04:55:37 +0200 (CEST) Subject: [Python-3000-checkins] r64997 - python/branches/py3k Message-ID: <20080716025537.19C571E4011@bag.python.org> Author: georg.brandl Date: Wed Jul 16 04:55:36 2008 New Revision: 64997 Log: Blocked revisions 64453,64471,64489,64527,64535,64554,64595,64702 via svnmerge ........ r64453 | andrew.kuchling | 2008-06-22 15:39:11 +0200 (Sun, 22 Jun 2008) | 1 line Wording fix ........ r64471 | facundo.batista | 2008-06-23 01:19:14 +0200 (Mon, 23 Jun 2008) | 5 lines Fixing the problem stated in issue 2702 with the patch submitted in the issue 3165. Now cPickle does not fails with uncontrolled behaviour when pickling into a very deep nested structure. ........ r64489 | thomas.heller | 2008-06-23 16:49:56 +0200 (Mon, 23 Jun 2008) | 2 lines Fix compilation on Windows. ........ r64527 | facundo.batista | 2008-06-25 21:24:53 +0200 (Wed, 25 Jun 2008) | 9 lines Reverting the patch from #3165, as it broke other behaviours. I left the original test commented out (note that that test came from #2702, which seems to have a problem in FreeBSD and Windows, but not in Linux). I included a new test, to watch over the now-broken behaviour, I took it from #3179. ........ r64535 | georg.brandl | 2008-06-26 20:55:37 +0200 (Thu, 26 Jun 2008) | 2 lines Add a version tag for shutdown(). ........ r64554 | trent.nelson | 2008-06-27 04:24:49 +0200 (Fri, 27 Jun 2008) | 3 lines Initialized merge tracking via "svnmerge" with revisions "1-64347" from svn+ssh://pythondev at svn.python.org/python/branches/tnelson-trunk-bsddb-47-upgrade ........ r64595 | facundo.batista | 2008-06-30 03:10:55 +0200 (Mon, 30 Jun 2008) | 3 lines Fix #2702, with a correct accounting of recursion. ........ r64702 | georg.brandl | 2008-07-04 19:22:53 +0200 (Fri, 04 Jul 2008) | 2 lines Give the pickle special methods a signature. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 05:00:45 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 05:00:45 +0200 (CEST) Subject: [Python-3000-checkins] r64998 - in python/branches/py3k: Doc/library/pprint.rst Lib/test/test_pprint.py Mac/Makefile.in PCbuild/_ctypes.vcproj Message-ID: <20080716030045.7EB3D1E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 05:00:45 2008 New Revision: 64998 Log: Merged revisions 64446,64490,64495,64526,64567 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64446 | facundo.batista | 2008-06-21 19:43:56 +0200 (Sat, 21 Jun 2008) | 4 lines Fixed issue #2888. Now the behaviour of pprint when working with nested structures follows the common sense (and works like in 2.5 and 3.0). ........ r64490 | thomas.heller | 2008-06-23 21:51:41 +0200 (Mon, 23 Jun 2008) | 1 line Include debug info when assembling win64.asm in a debug build. ........ r64495 | benjamin.peterson | 2008-06-24 04:41:08 +0200 (Tue, 24 Jun 2008) | 1 line minor fix ........ r64526 | mark.dickinson | 2008-06-25 17:29:32 +0200 (Wed, 25 Jun 2008) | 2 lines issue #3199: Fix typo in Mac/Makefile.in ........ r64567 | mark.dickinson | 2008-06-28 00:20:14 +0200 (Sat, 28 Jun 2008) | 3 lines Fix typo in configure.in, and propagate configure.in changes from r64002 to configure and pyconfig.h.in. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/pprint.rst python/branches/py3k/Lib/test/test_pprint.py python/branches/py3k/Mac/Makefile.in python/branches/py3k/PCbuild/_ctypes.vcproj Modified: python/branches/py3k/Doc/library/pprint.rst ============================================================================== --- python/branches/py3k/Doc/library/pprint.rst (original) +++ python/branches/py3k/Doc/library/pprint.rst Wed Jul 16 05:00:45 2008 @@ -50,7 +50,7 @@ >>> stuff.insert(0, stuff[:]) >>> pp = pprint.PrettyPrinter(indent=4) >>> pp.pprint(stuff) - [ [ 'spam', 'eggs', 'lumberjack', 'knights', 'ni'], + [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', Modified: python/branches/py3k/Lib/test/test_pprint.py ============================================================================== --- python/branches/py3k/Lib/test/test_pprint.py (original) +++ python/branches/py3k/Lib/test/test_pprint.py Wed Jul 16 05:00:45 2008 @@ -164,6 +164,17 @@ for type in [list, list2]: self.assertEqual(pprint.pformat(type(o), indent=4), exp) + def test_nested_indentations(self): + o1 = list(range(10)) + o2 = dict(first=1, second=2, third=3) + o = [o1, o2] + expected = """\ +[ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + { 'first': 1, + 'second': 2, + 'third': 3}]""" + self.assertEqual(pprint.pformat(o, indent=4, width=42), expected) + def test_sorted_dict(self): # Starting in Python 2.5, pprint sorts dict displays by key regardless # of how small the dictionary may be. Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Wed Jul 16 05:00:45 2008 @@ -112,7 +112,7 @@ $(INSTALL) -d -m $(DIRMODE) "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" ;\ fi for fn in python$(VERSION) pythonw$(VERSION) idle$(VERSION) \ - pydoc$(VERSION) python$(VERSION)-config) smtpd$(VERSION).py ;\ + pydoc$(VERSION) python$(VERSION)-config smtpd$(VERSION).py ;\ do \ ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\ done Modified: python/branches/py3k/PCbuild/_ctypes.vcproj ============================================================================== --- python/branches/py3k/PCbuild/_ctypes.vcproj (original) +++ python/branches/py3k/PCbuild/_ctypes.vcproj Wed Jul 16 05:00:45 2008 @@ -642,7 +642,7 @@ > From python-3000-checkins at python.org Wed Jul 16 05:43:05 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 05:43:05 +0200 (CEST) Subject: [Python-3000-checkins] r64999 - in python/branches/py3k: Doc/glossary.rst Doc/library/abc.rst Doc/library/collections.rst Doc/library/shutil.rst Doc/library/stdtypes.rst Doc/tools/sphinxext/opensearch.xml Doc/whatsnew/2.6.rst Lib/curses/textpad.py Lib/fractions.py Lib/http/client.py Lib/subprocess.py Lib/test/regrtest.py Lib/test/test_audioop.py Lib/test/test_bz2.py Lib/test/test_fractions.py Lib/test/test_multiprocessing.py Lib/test/test_sys.py Misc/ACKS Modules/Setup.dist Modules/_fileio.c Modules/audioop.c Modules/bz2module.c Modules/cmathmodule.c Modules/timemodule.c Objects/abstract.c Python/ceval.c Python/pythonrun.c Message-ID: <20080716034305.841741E4002@bag.python.org> Author: georg.brandl Date: Wed Jul 16 05:43:04 2008 New Revision: 64999 Log: Merged revisions 64623,64640,64665,64687,64689-64690,64719,64721,64735,64742,64744-64746,64756-64761,64767-64769,64771-64772,64774-64775,64788,64793,64835-64836 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64623 | benjamin.peterson | 2008-07-01 21:51:54 +0200 (Tue, 01 Jul 2008) | 1 line write a short little section for multiprocessing; it still needs help ........ r64640 | georg.brandl | 2008-07-01 22:56:03 +0200 (Tue, 01 Jul 2008) | 2 lines Add a comment about incref'ing w. ........ r64665 | jesse.noller | 2008-07-02 18:56:51 +0200 (Wed, 02 Jul 2008) | 1 line Add #!/usr/bin/env python for ben ........ r64687 | andrew.kuchling | 2008-07-03 14:50:03 +0200 (Thu, 03 Jul 2008) | 1 line Tweak wording ........ r64689 | benjamin.peterson | 2008-07-03 14:57:35 +0200 (Thu, 03 Jul 2008) | 1 line lowercase glossary term ........ r64690 | benjamin.peterson | 2008-07-03 15:01:17 +0200 (Thu, 03 Jul 2008) | 1 line let the term be linked ........ r64719 | raymond.hettinger | 2008-07-05 04:11:55 +0200 (Sat, 05 Jul 2008) | 1 line Update comment on prediction macros. ........ r64721 | georg.brandl | 2008-07-05 12:07:18 +0200 (Sat, 05 Jul 2008) | 2 lines Fix tabs. ........ r64735 | mark.dickinson | 2008-07-05 17:25:48 +0200 (Sat, 05 Jul 2008) | 3 lines Minor rewrite of cmath_log to work around a Sun compiler bug. See issue #3168. ........ r64742 | benjamin.peterson | 2008-07-05 18:29:38 +0200 (Sat, 05 Jul 2008) | 1 line make regrtest aware of the lib2to3 resource ........ r64744 | georg.brandl | 2008-07-05 18:43:45 +0200 (Sat, 05 Jul 2008) | 2 lines Keep below 80 chars. ........ r64745 | facundo.batista | 2008-07-05 21:19:50 +0200 (Sat, 05 Jul 2008) | 3 lines Issue 3289. Removed two lines that ended doing nothing. ........ r64746 | facundo.batista | 2008-07-05 22:39:59 +0200 (Sat, 05 Jul 2008) | 4 lines Issue #3239. Differentiate the ascii call from the curses one and the builtin one. ........ r64756 | gregory.p.smith | 2008-07-06 09:16:40 +0200 (Sun, 06 Jul 2008) | 3 lines - Issue #2113: Fix error in subprocess.Popen if the select system call is interrupted by a signal. ........ r64757 | benjamin.peterson | 2008-07-06 14:39:09 +0200 (Sun, 06 Jul 2008) | 1 line remove test_compact_freelists from test_sys ........ r64758 | gregory.p.smith | 2008-07-06 19:06:29 +0200 (Sun, 06 Jul 2008) | 2 lines fix issue3304 - remove an incorrect PyMem_Free in fileio_init ........ r64759 | georg.brandl | 2008-07-06 19:36:20 +0200 (Sun, 06 Jul 2008) | 2 lines Fix opensearch template. ........ r64760 | andrew.kuchling | 2008-07-06 19:43:16 +0200 (Sun, 06 Jul 2008) | 1 line Wording fix ........ r64761 | andrew.kuchling | 2008-07-06 19:44:17 +0200 (Sun, 06 Jul 2008) | 1 line Add two items; rewrap paragraph ........ r64767 | gregory.p.smith | 2008-07-07 06:31:58 +0200 (Mon, 07 Jul 2008) | 4 lines - Issue #3309: Fix bz2.BZFile itererator to release its internal lock properly when raising an exception due to the bz2file being closed. Prevents a deadlock. ........ r64768 | josiah.carlson | 2008-07-07 06:51:46 +0200 (Mon, 07 Jul 2008) | 2 lines Fixed bugs 760475, 953599, and 1519. ........ r64769 | gregory.p.smith | 2008-07-07 06:54:31 +0200 (Mon, 07 Jul 2008) | 2 lines Add commented out #_sha256 and #_sha512 lines per issue 3183. ........ r64771 | gregory.p.smith | 2008-07-07 07:09:12 +0200 (Mon, 07 Jul 2008) | 4 lines - Issue #3094: httplib.HTTPSConnection Host: headers no longer include the redundant ":443" port number designation when the connection is using the default https port (443). ........ r64772 | skip.montanaro | 2008-07-07 13:16:14 +0200 (Mon, 07 Jul 2008) | 2 lines Correct grammar. ........ r64774 | andrew.kuchling | 2008-07-07 18:51:09 +0200 (Mon, 07 Jul 2008) | 1 line Fix example to match text ........ r64775 | facundo.batista | 2008-07-07 19:02:59 +0200 (Mon, 07 Jul 2008) | 3 lines Issue 3306. Better control for a lenght in findmax() function. ........ r64788 | georg.brandl | 2008-07-08 09:05:23 +0200 (Tue, 08 Jul 2008) | 2 lines Add missing ABCs to list. ........ r64793 | nick.coghlan | 2008-07-08 16:21:42 +0200 (Tue, 08 Jul 2008) | 1 line Add missing NEWS and ACK entries for r64791 ........ r64835 | raymond.hettinger | 2008-07-10 11:31:08 +0200 (Thu, 10 Jul 2008) | 1 line Issue 3287: Raise correct exception for float inputs. ........ r64836 | raymond.hettinger | 2008-07-10 12:28:41 +0200 (Thu, 10 Jul 2008) | 1 line Use operator.index() instead of n.__index__(). ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/glossary.rst python/branches/py3k/Doc/library/abc.rst python/branches/py3k/Doc/library/collections.rst python/branches/py3k/Doc/library/shutil.rst python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/tools/sphinxext/opensearch.xml python/branches/py3k/Doc/whatsnew/2.6.rst python/branches/py3k/Lib/curses/textpad.py python/branches/py3k/Lib/fractions.py python/branches/py3k/Lib/http/client.py python/branches/py3k/Lib/subprocess.py python/branches/py3k/Lib/test/regrtest.py python/branches/py3k/Lib/test/test_audioop.py python/branches/py3k/Lib/test/test_bz2.py python/branches/py3k/Lib/test/test_fractions.py python/branches/py3k/Lib/test/test_multiprocessing.py python/branches/py3k/Lib/test/test_sys.py python/branches/py3k/Misc/ACKS python/branches/py3k/Modules/Setup.dist python/branches/py3k/Modules/_fileio.c python/branches/py3k/Modules/audioop.c python/branches/py3k/Modules/bz2module.c python/branches/py3k/Modules/cmathmodule.c python/branches/py3k/Modules/timemodule.c python/branches/py3k/Objects/abstract.c python/branches/py3k/Python/ceval.c python/branches/py3k/Python/pythonrun.c Modified: python/branches/py3k/Doc/glossary.rst ============================================================================== --- python/branches/py3k/Doc/glossary.rst (original) +++ python/branches/py3k/Doc/glossary.rst Wed Jul 16 05:43:04 2008 @@ -16,7 +16,7 @@ The typical Python prompt of the interactive shell when entering code for an indented code block. - Abstract Base Class + abstract base class Abstract Base Classes (abbreviated ABCs) complement :term:`duck-typing` by providing a way to define interfaces when other techniques like :func:`hasattr` would be clumsy. Python comes with many builtin ABCs for data structures Modified: python/branches/py3k/Doc/library/abc.rst ============================================================================== --- python/branches/py3k/Doc/library/abc.rst (original) +++ python/branches/py3k/Doc/library/abc.rst Wed Jul 16 05:43:04 2008 @@ -8,8 +8,8 @@ .. sectionauthor:: Georg Brandl .. much of the content adapted from docstrings -This module provides the infrastructure for defining :term:`abstract base -classes` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this +This module provides the infrastructure for defining an :term:`abstract base +class` (ABCs) in Python, as outlined in :pep:`3119`; see the PEP for why this was added to Python. (See also :pep:`3141` and the :mod:`numbers` module regarding a type hierarchy for numbers based on ABCs.) Modified: python/branches/py3k/Doc/library/collections.rst ============================================================================== --- python/branches/py3k/Doc/library/collections.rst (original) +++ python/branches/py3k/Doc/library/collections.rst Wed Jul 16 05:43:04 2008 @@ -37,42 +37,50 @@ The collections module offers the following ABCs: -========================= ==================== ====================== ==================================================== -ABC Inherits Abstract Methods Mixin Methods -========================= ==================== ====================== ==================================================== -:class:`Container` ``__contains__`` -:class:`Hashable` ``__hash__`` -:class:`Iterable` ``__iter__`` -:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__`` -:class:`Sized` ``__len__`` - -:class:`Mapping` :class:`Sized`, ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``, - :class:`Iterable`, ``__len__``. and ``get``, ``__eq__``, and ``__ne__`` - :class:`Container` ``__iter__`` - -:class:`MutableMapping` :class:`Mapping` ``__getitem__`` Inherited Mapping methods and - ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``, - ``__delitem__``, and ``setdefault`` - ``__iter__``, and - ``__len__`` - -:class:`Sequence` :class:`Sized`, ``__getitem__`` ``__contains__``. ``__iter__``, ``__reversed__``. - :class:`Iterable`, and ``__len__`` ``index``, and ``count`` - :class:`Container` - -:class:`MutableSequnce` :class:`Sequence` ``__getitem__`` Inherited Sequence methods and - ``__delitem__``, ``append``, ``reverse``, ``extend``, ``pop``, - ``insert``, ``remove``, and ``__iadd__`` - and ``__len__`` - -:class:`Set` :class:`Sized`, ``__len__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, - :class:`Iterable`, ``__iter__``, and ``__gt__``, ``__ge__``, ``__and__``, ``__or__`` - :class:`Container` ``__contains__`` ``__sub__``, ``__xor__``, and ``isdisjoint`` - -:class:`MutableSet` :class:`Set` ``add`` and Inherited Set methods and - ``discard`` ``clear``, ``pop``, ``remove``, ``__ior__``, - ``__iand__``, ``__ixor__``, and ``__isub__`` -========================= ==================== ====================== ==================================================== +========================= ===================== ====================== ==================================================== +ABC Inherits Abstract Methods Mixin Methods +========================= ===================== ====================== ==================================================== +:class:`Container` ``__contains__`` +:class:`Hashable` ``__hash__`` +:class:`Iterable` ``__iter__`` +:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__`` +:class:`Sized` ``__len__`` +:class:`Callable` ``__call__`` + +:class:`Sequence` :class:`Sized`, ``__getitem__`` ``__contains__``. ``__iter__``, ``__reversed__``. + :class:`Iterable`, and ``__len__`` ``index``, and ``count`` + :class:`Container` + +:class:`MutableSequnce` :class:`Sequence` ``__getitem__`` Inherited Sequence methods and + ``__delitem__``, ``append``, ``reverse``, ``extend``, ``pop``, + ``insert``, ``remove``, and ``__iadd__`` + and ``__len__`` + +:class:`Set` :class:`Sized`, ``__len__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, + :class:`Iterable`, ``__iter__``, and ``__gt__``, ``__ge__``, ``__and__``, ``__or__`` + :class:`Container` ``__contains__`` ``__sub__``, ``__xor__``, and ``isdisjoint`` + +:class:`MutableSet` :class:`Set` ``add`` and Inherited Set methods and + ``discard`` ``clear``, ``pop``, ``remove``, ``__ior__``, + ``__iand__``, ``__ixor__``, and ``__isub__`` + +:class:`Mapping` :class:`Sized`, ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``, + :class:`Iterable`, ``__len__``. and ``get``, ``__eq__``, and ``__ne__`` + :class:`Container` ``__iter__`` + +:class:`MutableMapping` :class:`Mapping` ``__getitem__`` Inherited Mapping methods and + ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``, + ``__delitem__``, and ``setdefault`` + ``__iter__``, and + ``__len__`` + +:class:`MappingView` :class:`Sized` ``__len__`` +:class:`KeysView` :class:`MappingView`, ``__contains__``, + :class:`Set` ``__iter__`` +:class:`ItemsView` :class:`MappingView`, ``__contains__``, + :class:`Set` ``__iter__`` +:class:`ValuesView` :class:`MappingView` ``__contains__``, ``__iter__`` +========================= ===================== ====================== ==================================================== These ABCs allow us to ask classes or instances if they provide particular functionality, for example:: Modified: python/branches/py3k/Doc/library/shutil.rst ============================================================================== --- python/branches/py3k/Doc/library/shutil.rst (original) +++ python/branches/py3k/Doc/library/shutil.rst Wed Jul 16 05:43:04 2008 @@ -78,18 +78,39 @@ Unix command :program:`cp -p`. -.. function:: copytree(src, dst[, symlinks]) +.. function:: ignore_patterns(\*patterns) + + This factory function creates a function that can be used as a callable for + :func:`copytree`\'s *ignore* argument, ignoring files and directories that + match one of the glob-style *patterns* provided. See the example below. + + +.. function:: copytree(src, dst[, symlinks=False[, ignore=None]]) Recursively copy an entire directory tree rooted at *src*. The destination - directory, named by *dst*, must not already exist; it will be created as well as - missing parent directories. Permissions and times of directories are copied with - :func:`copystat`, individual files are copied using :func:`copy2`. If - *symlinks* is true, symbolic links in the source tree are represented as - symbolic links in the new tree; if false or omitted, the contents of the linked - files are copied to the new tree. If exception(s) occur, an :exc:`Error` is - raised with a list of reasons. + directory, named by *dst*, must not already exist; it will be created as well + as missing parent directories. Permissions and times of directories are + copied with :func:`copystat`, individual files are copied using + :func:`copy2`. + + If *symlinks* is true, symbolic links in the source tree are represented as + symbolic links in the new tree; if false or omitted, the contents of the + linked files are copied to the new tree. + + If *ignore* is given, it must be a callable that will receive as its + arguments the directory being visited by :func:`copytree`, and a list of its + contents, as returned by :func:`os.listdir`. Since :func:`copytree` is + called recursively, the *ignore* callable will be called once for each + directory that is copied. The callable must return a sequence of directory + and file names relative to the current directory (i.e. a subset of the items + in its second argument); these names will then be ignored in the copy + process. :func:`ignore_patterns` can be used to create such a callable that + ignores names based on glob-style patterns. + + If exception(s) occur, an :exc:`Error` is raised with a list of reasons. - The source code for this should be considered an example rather than a tool. + The source code for this should be considered an example rather than the + ultimate tool. .. function:: rmtree(path[, ignore_errors[, onerror]]) Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Wed Jul 16 05:43:04 2008 @@ -2027,7 +2027,7 @@ files, like ttys, it makes sense to continue reading after an EOF is hit.) Note that this method may call the underlying C function :cfunc:`fread` more than once in an effort to acquire as close to *size* bytes as possible. Also note - that when in non-blocking mode, less data than what was requested may be + that when in non-blocking mode, less data than was requested may be returned, even if no *size* parameter was given. Modified: python/branches/py3k/Doc/tools/sphinxext/opensearch.xml ============================================================================== --- python/branches/py3k/Doc/tools/sphinxext/opensearch.xml (original) +++ python/branches/py3k/Doc/tools/sphinxext/opensearch.xml Wed Jul 16 05:43:04 2008 @@ -1,14 +1,4 @@ - - - Python Docs - Python Documentation - Search the Python documentation - utf-8 - - - - - - http://www.python.org/images/favicon16x16.ico - - +{% extends "!opensearch.xml" %} +{% block extra -%} +http://www.python.org/images/favicon16x16.ico +{%- endblock %} Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Wed Jul 16 05:43:04 2008 @@ -1681,6 +1681,11 @@ available, instead of restricting itself to protocol 1. (Contributed by W. Barnes; :issue:`1551443`.) +* The :mod:`cgi` module will now read variables from the query string of an + HTTP POST request. This makes it possible to use form actions with + URLs such as "/cgi-bin/add.py?category=1". (Contributed by + Alexandre Fiori and Nubis; :issue:`1817`.) + * The :mod:`cmath` module underwent an extensive set of revisions, thanks to Mark Dickinson and Christian Heimes, that added some new features and greatly improved the accuracy of the computations. @@ -2137,6 +2142,24 @@ * The :mod:`sets` module has been deprecated; it's better to use the built-in :class:`set` and :class:`frozenset` types. +* The :func:`shutil.copytree` function now has an optional **ignore** argument + that takes a callable object. This callable will receive each directory path + and a list of the directory's contents, and returns a list of names that + will be ignored, not copied. + + The :mod:`shutil` module also provides an :func:`ignore_patterns` + function for use with this new parameter. + :func:`ignore_patterns` takes an arbitrary number of glob-style patterns + and will ignore any files and directories that match this pattern. + The following example copies a directory tree, but skip both SVN's internal + :file:`.svn` directories and Emacs backup + files, which have names ending with '~':: + + shutil.copytree('Doc/library', '/tmp/library', + ignore=shutil.ignore_patterns('*~', '.svn')) + + (Contributed by Tarek Ziad?; :issue:`2663`.) + * Integrating signal handling with GUI handling event loops like those used by Tkinter or GTk+ has long been a problem; most software ends up polling, waking up every fraction of a second. @@ -2500,9 +2523,10 @@ ... ValueError: malformed string -The module also includes -:class:`NodeVisitor` and :class:`NodeTransformer` classes -for traversing and modifying an AST, and functions for common transformations such as changing line numbers. +The module also includes :class:`NodeVisitor` and +:class:`NodeTransformer` classes for traversing and modifying an AST, +and functions for common transformations such as changing line +numbers. .. ====================================================================== Modified: python/branches/py3k/Lib/curses/textpad.py ============================================================================== --- python/branches/py3k/Lib/curses/textpad.py (original) +++ python/branches/py3k/Lib/curses/textpad.py Wed Jul 16 05:43:04 2008 @@ -1,6 +1,7 @@ """Simple textbox editing widget with Emacs-like keybindings.""" -import curses, ascii +import curses +import curses.ascii def rectangle(win, uly, ulx, lry, lrx): """Draw a rectangle with corners at the provided upper-left @@ -54,7 +55,7 @@ returning the index of the last non-blank character.""" last = self.maxx while True: - if ascii.ascii(self.win.inch(y, last)) != ascii.SP: + if curses.ascii.ascii(self.win.inch(y, last)) != curses.ascii.SP: last = min(self.maxx, last+1) break elif last == 0: @@ -76,7 +77,7 @@ pass if self.insert_mode: (backy, backx) = self.win.getyx() - if ascii.isprint(oldch): + if curses.ascii.isprint(oldch): self._insert_printable_char(oldch) self.win.move(backy, backx) @@ -84,12 +85,12 @@ "Process a single editing command." (y, x) = self.win.getyx() self.lastcmd = ch - if ascii.isprint(ch): + if curses.ascii.isprint(ch): if y < self.maxy or x < self.maxx: self._insert_printable_char(ch) - elif ch == ascii.SOH: # ^a + elif ch == curses.ascii.SOH: # ^a self.win.move(y, 0) - elif ch in (ascii.STX,curses.KEY_LEFT, ascii.BS,curses.KEY_BACKSPACE): + elif ch in (curses.ascii.STX,curses.KEY_LEFT, curses.ascii.BS,curses.KEY_BACKSPACE): if x > 0: self.win.move(y, x-1) elif y == 0: @@ -98,46 +99,46 @@ self.win.move(y-1, self._end_of_line(y-1)) else: self.win.move(y-1, self.maxx) - if ch in (ascii.BS, curses.KEY_BACKSPACE): + if ch in (curses.ascii.BS, curses.KEY_BACKSPACE): self.win.delch() - elif ch == ascii.EOT: # ^d + elif ch == curses.ascii.EOT: # ^d self.win.delch() - elif ch == ascii.ENQ: # ^e + elif ch == curses.ascii.ENQ: # ^e if self.stripspaces: self.win.move(y, self._end_of_line(y)) else: self.win.move(y, self.maxx) - elif ch in (ascii.ACK, curses.KEY_RIGHT): # ^f + elif ch in (curses.ascii.ACK, curses.KEY_RIGHT): # ^f if x < self.maxx: self.win.move(y, x+1) elif y == self.maxy: pass else: self.win.move(y+1, 0) - elif ch == ascii.BEL: # ^g + elif ch == curses.ascii.BEL: # ^g return 0 - elif ch == ascii.NL: # ^j + elif ch == curses.ascii.NL: # ^j if self.maxy == 0: return 0 elif y < self.maxy: self.win.move(y+1, 0) - elif ch == ascii.VT: # ^k + elif ch == curses.ascii.VT: # ^k if x == 0 and self._end_of_line(y) == 0: self.win.deleteln() else: # first undo the effect of self._end_of_line self.win.move(y, x) self.win.clrtoeol() - elif ch == ascii.FF: # ^l + elif ch == curses.ascii.FF: # ^l self.win.refresh() - elif ch in (ascii.SO, curses.KEY_DOWN): # ^n + elif ch in (curses.ascii.SO, curses.KEY_DOWN): # ^n if y < self.maxy: self.win.move(y+1, x) if x > self._end_of_line(y+1): self.win.move(y+1, self._end_of_line(y+1)) - elif ch == ascii.SI: # ^o + elif ch == curses.ascii.SI: # ^o self.win.insertln() - elif ch in (ascii.DLE, curses.KEY_UP): # ^p + elif ch in (curses.ascii.DLE, curses.KEY_UP): # ^p if y > 0: self.win.move(y-1, x) if x > self._end_of_line(y-1): @@ -155,7 +156,7 @@ for x in range(self.maxx+1): if self.stripspaces and x > stop: break - result = result + chr(ascii.ascii(self.win.inch(y, x))) + result = result + chr(curses.ascii.ascii(self.win.inch(y, x))) if self.maxy > 0: result = result + "\n" return result Modified: python/branches/py3k/Lib/fractions.py ============================================================================== --- python/branches/py3k/Lib/fractions.py (original) +++ python/branches/py3k/Lib/fractions.py Wed Jul 16 05:43:04 2008 @@ -94,9 +94,8 @@ if denominator == 0: raise ZeroDivisionError('Fraction(%s, 0)' % numerator) - - numerator = numerator.__index__() - denominator = denominator.__index__() + numerator = operator.index(numerator) + denominator = operator.index(denominator) g = gcd(numerator, denominator) self._numerator = numerator // g self._denominator = denominator // g Modified: python/branches/py3k/Lib/http/client.py ============================================================================== --- python/branches/py3k/Lib/http/client.py (original) +++ python/branches/py3k/Lib/http/client.py Wed Jul 16 05:43:04 2008 @@ -783,7 +783,7 @@ host_enc = self.host.encode("ascii") except UnicodeEncodeError: host_enc = self.host.encode("idna") - if self.port == HTTP_PORT: + if self.port == self.default_port: self.putheader('Host', host_enc) else: host_enc = host_enc.decode("ascii") Modified: python/branches/py3k/Lib/subprocess.py ============================================================================== --- python/branches/py3k/Lib/subprocess.py (original) +++ python/branches/py3k/Lib/subprocess.py Wed Jul 16 05:43:04 2008 @@ -1149,7 +1149,12 @@ input_offset = 0 while read_set or write_set: - rlist, wlist, xlist = select.select(read_set, write_set, []) + try: + rlist, wlist, xlist = select.select(read_set, write_set, []) + except select.error as e: + if e.args[0] == errno.EINTR: + continue + raise # XXX Rewrite these to use non-blocking I/O on the # file objects; they are no longer using C stdio! Modified: python/branches/py3k/Lib/test/regrtest.py ============================================================================== --- python/branches/py3k/Lib/test/regrtest.py (original) +++ python/branches/py3k/Lib/test/regrtest.py Wed Jul 16 05:43:04 2008 @@ -101,6 +101,8 @@ curses - Tests that use curses and will modify the terminal's state and output modes. + lib2to3 - Run the tests for 2to3 (They take a while.) + largefile - It is okay to run some test that may create huge files. These tests can take a long time and may consume >2GB of disk space temporarily. @@ -173,8 +175,8 @@ from test import support -RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', - 'decimal', 'compiler', 'subprocess', 'urlfetch') +RESOURCE_NAMES = ('audio', 'curses', 'lib2to3', 'largefile', 'network', + 'bsddb', 'decimal', 'compiler', 'subprocess', 'urlfetch') def usage(msg): Modified: python/branches/py3k/Lib/test/test_audioop.py ============================================================================== --- python/branches/py3k/Lib/test/test_audioop.py (original) +++ python/branches/py3k/Lib/test/test_audioop.py Wed Jul 16 05:43:04 2008 @@ -163,6 +163,10 @@ self.assertEqual(audioop.getsample(data[1], 2, i), i) self.assertEqual(audioop.getsample(data[2], 4, i), i) + def test_negavitelen(self): + # from issue 3306, previously it segfaulted + self.assertRaises(audioop.error, + audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392) def test_main(): run_unittest(TestAudioop) Modified: python/branches/py3k/Lib/test/test_bz2.py ============================================================================== --- python/branches/py3k/Lib/test/test_bz2.py (original) +++ python/branches/py3k/Lib/test/test_bz2.py Wed Jul 16 05:43:04 2008 @@ -120,6 +120,17 @@ self.assertEqual(list(iter(bz2f)), sio.readlines()) bz2f.close() + def testClosedIteratorDeadlock(self): + # "Test that iteration on a closed bz2file releases the lock." + # http://bugs.python.org/issue3309 + self.createTempFile() + bz2f = BZ2File(self.filename) + bz2f.close() + self.assertRaises(ValueError, bz2f.__next__) + # This call will deadlock of the above .__next__ call failed to + # release the lock. + self.assertRaises(ValueError, bz2f.readlines) + def testWrite(self): # "Test BZ2File.write()" bz2f = BZ2File(self.filename, "w") Modified: python/branches/py3k/Lib/test/test_fractions.py ============================================================================== --- python/branches/py3k/Lib/test/test_fractions.py (original) +++ python/branches/py3k/Lib/test/test_fractions.py Wed Jul 16 05:43:04 2008 @@ -62,11 +62,11 @@ self.assertRaisesMessage(ZeroDivisionError, "Fraction(12, 0)", F, 12, 0) - self.assertRaises(AttributeError, F, 1.5) - self.assertRaises(AttributeError, F, 1.5 + 3j) + self.assertRaises(TypeError, F, 1.5) + self.assertRaises(TypeError, F, 1.5 + 3j) - self.assertRaises(AttributeError, F, F(1, 2), 3) - self.assertRaises(AttributeError, F, "3/2", 3) + self.assertRaises(TypeError, F, F(1, 2), 3) + self.assertRaises(TypeError, F, "3/2", 3) def testFromString(self): self.assertEquals((5, 1), _components(F("5"))) Modified: python/branches/py3k/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k/Lib/test/test_multiprocessing.py Wed Jul 16 05:43:04 2008 @@ -1,3 +1,5 @@ +#!/usr/bin/env python + # # Unit tests for the multiprocessing package # Modified: python/branches/py3k/Lib/test/test_sys.py ============================================================================== --- python/branches/py3k/Lib/test/test_sys.py (original) +++ python/branches/py3k/Lib/test/test_sys.py Wed Jul 16 05:43:04 2008 @@ -336,21 +336,6 @@ def test_clear_type_cache(self): sys._clear_type_cache() - def test_compact_freelists(self): - sys._compact_freelists() - r = sys._compact_freelists() - ## freed blocks shouldn't change - #self.assertEqual(r[0][2], 0) - ## fill freelists - #ints = list(range(10000)) - #floats = [float(i) for i in ints] - #del ints - #del floats - ## should free more than 100 blocks - #r = sys._compact_freelists() - #self.assert_(r[0][1] > 100, r[0][1]) - #self.assert_(r[0][2] > 100, r[0][2]) - def test_ioencoding(self): import subprocess,os env = dict(os.environ) Modified: python/branches/py3k/Misc/ACKS ============================================================================== --- python/branches/py3k/Misc/ACKS (original) +++ python/branches/py3k/Misc/ACKS Wed Jul 16 05:43:04 2008 @@ -145,6 +145,7 @@ Matthew Dixon Cowles Christopher A. Craig Laura Creighton +Simon Cross Drew Csillag John Cugini Tom Culliton Modified: python/branches/py3k/Modules/Setup.dist ============================================================================== --- python/branches/py3k/Modules/Setup.dist (original) +++ python/branches/py3k/Modules/Setup.dist Wed Jul 16 05:43:04 2008 @@ -228,9 +228,11 @@ #_md5 md5module.c md5.c -# The _sha module implements the SHA checksum algorithm. -# (NIST's Secure Hash Algorithm.) +# The _sha module implements the SHA checksum algorithms. +# (NIST's Secure Hash Algorithms.) #_sha shamodule.c +#_sha256 sha256module.c +#_sha512 sha512module.c # The _tkinter module. Modified: python/branches/py3k/Modules/_fileio.c ============================================================================== --- python/branches/py3k/Modules/_fileio.c (original) +++ python/branches/py3k/Modules/_fileio.c Wed Jul 16 05:43:04 2008 @@ -278,7 +278,6 @@ ret = -1; done: - PyMem_Free(name); return ret; } Modified: python/branches/py3k/Modules/audioop.c ============================================================================== --- python/branches/py3k/Modules/audioop.c (original) +++ python/branches/py3k/Modules/audioop.c Wed Jul 16 05:43:04 2008 @@ -575,7 +575,7 @@ } len1 >>= 1; - if ( len1 < len2 ) { + if ( len2 < 0 || len1 < len2 ) { PyErr_SetString(AudioopError, "Input sample should be longer"); return 0; } Modified: python/branches/py3k/Modules/bz2module.c ============================================================================== --- python/branches/py3k/Modules/bz2module.c (original) +++ python/branches/py3k/Modules/bz2module.c Wed Jul 16 05:43:04 2008 @@ -1264,6 +1264,7 @@ PyBytesObject* ret; ACQUIRE_LOCK(self); if (self->mode == MODE_CLOSED) { + RELEASE_LOCK(self); PyErr_SetString(PyExc_ValueError, "I/O operation on closed file"); return NULL; Modified: python/branches/py3k/Modules/cmathmodule.c ============================================================================== --- python/branches/py3k/Modules/cmathmodule.c (original) +++ python/branches/py3k/Modules/cmathmodule.c Wed Jul 16 05:43:04 2008 @@ -839,8 +839,10 @@ errno = 0; PyFPE_START_PROTECT("complex function", return 0) x = c_log(x); - if (PyTuple_GET_SIZE(args) == 2) - x = c_quot(x, c_log(y)); + if (PyTuple_GET_SIZE(args) == 2) { + y = c_log(y); + x = c_quot(x, y); + } PyFPE_END_PROTECT(x) if (errno != 0) return math_error(); Modified: python/branches/py3k/Modules/timemodule.c ============================================================================== --- python/branches/py3k/Modules/timemodule.c (original) +++ python/branches/py3k/Modules/timemodule.c Wed Jul 16 05:43:04 2008 @@ -641,8 +641,6 @@ { struct tm buf; time_t tt; - tt = time(&tt); - buf = *localtime(&tt); if (!gettmarg(tup, &buf)) return NULL; tt = mktime(&buf); Modified: python/branches/py3k/Objects/abstract.c ============================================================================== --- python/branches/py3k/Objects/abstract.c (original) +++ python/branches/py3k/Objects/abstract.c Wed Jul 16 05:43:04 2008 @@ -1632,7 +1632,7 @@ return m->sq_item(s, i); } - return type_error("'%.200s' object is unindexable", s); + return type_error("'%.200s' object does not support indexing", s); } PyObject * Modified: python/branches/py3k/Python/ceval.c ============================================================================== --- python/branches/py3k/Python/ceval.c (original) +++ python/branches/py3k/Python/ceval.c Wed Jul 16 05:43:04 2008 @@ -617,18 +617,20 @@ COMPARE_OP is often followed by JUMP_IF_FALSE or JUMP_IF_TRUE. And, those opcodes are often followed by a POP_TOP. - Verifying the prediction costs a single high-speed test of register + Verifying the prediction costs a single high-speed test of a register variable against a constant. If the pairing was good, then the - processor has a high likelihood of making its own successful branch - prediction which results in a nearly zero overhead transition to the - next opcode. - - A successful prediction saves a trip through the eval-loop including - its two unpredictable branches, the HAS_ARG test and the switch-case. - - If collecting opcode statistics, turn off prediction so that - statistics are accurately maintained (the predictions bypass - the opcode frequency counter updates). + processor's own internal branch predication has a high likelihood of + success, resulting in a nearly zero-overhead transition to the + next opcode. A successful prediction saves a trip through the eval-loop + including its two unpredictable branches, the HAS_ARG test and the + switch-case. Combined with the processor's internal branch prediction, + a successful PREDICT has the effect of making the two opcodes run as if + they were a single new opcode with the bodies combined. + + If collecting opcode statistics, your choices are to either keep the + predictions turned-on and interpret the results as if some opcodes + had been combined or turn-off predictions so that the opcode frequency + counter updates for both opcodes. */ #ifdef DYNAMIC_EXECUTION_PROFILE Modified: python/branches/py3k/Python/pythonrun.c ============================================================================== --- python/branches/py3k/Python/pythonrun.c (original) +++ python/branches/py3k/Python/pythonrun.c Wed Jul 16 05:43:04 2008 @@ -229,14 +229,14 @@ if (install_sigs) initsigs(); /* Signal handling stuff, including initintr() */ - /* Initialize warnings. */ - _PyWarnings_Init(); - if (PySys_HasWarnOptions()) { - PyObject *warnings_module = PyImport_ImportModule("warnings"); - if (!warnings_module) - PyErr_Clear(); - Py_XDECREF(warnings_module); - } + /* Initialize warnings. */ + _PyWarnings_Init(); + if (PySys_HasWarnOptions()) { + PyObject *warnings_module = PyImport_ImportModule("warnings"); + if (!warnings_module) + PyErr_Clear(); + Py_XDECREF(warnings_module); + } initmain(); /* Module __main__ */ if (!Py_NoSiteFlag) @@ -1246,7 +1246,7 @@ PyException_SetTraceback(v, tb); if (exception == NULL) return; - /* Now we know v != NULL too */ + /* Now we know v != NULL too */ if (set_sys_last_vars) { PySys_SetObject("last_type", exception); PySys_SetObject("last_value", v); @@ -2096,14 +2096,14 @@ PyAPI_FUNC(PyObject *) PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l) { - return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL); + return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL); } #undef PyRun_FileEx PyAPI_FUNC(PyObject *) PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c) { - return PyRun_FileExFlags(fp, p, s, g, l, c, NULL); + return PyRun_FileExFlags(fp, p, s, g, l, c, NULL); } #undef PyRun_FileFlags @@ -2111,7 +2111,7 @@ PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, PyCompilerFlags *flags) { - return PyRun_FileExFlags(fp, p, s, g, l, 0, flags); + return PyRun_FileExFlags(fp, p, s, g, l, 0, flags); } #undef PyRun_SimpleFile From python-3000-checkins at python.org Wed Jul 16 05:45:47 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 05:45:47 +0200 (CEST) Subject: [Python-3000-checkins] r65000 - python/branches/py3k Message-ID: <20080716034547.536F71E400C@bag.python.org> Author: georg.brandl Date: Wed Jul 16 05:45:47 2008 New Revision: 65000 Log: Blocked revisions 64854-64855 via svnmerge ........ r64854 | raymond.hettinger | 2008-07-10 17:37:08 +0200 (Thu, 10 Jul 2008) | 1 line Clear the -3 warnings in optparse.py ........ r64855 | raymond.hettinger | 2008-07-10 18:06:41 +0200 (Thu, 10 Jul 2008) | 1 line Suppress -3 warnings in unittest.py ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 12:33:39 2008 From: python-3000-checkins at python.org (mark.dickinson) Date: Wed, 16 Jul 2008 12:33:39 +0200 (CEST) Subject: [Python-3000-checkins] r65006 - python/branches/py3k Message-ID: <20080716103339.8C4A21E4003@bag.python.org> Author: mark.dickinson Date: Wed Jul 16 12:33:39 2008 New Revision: 65006 Log: Blocked revisions 65005 via svnmerge ........ r65005 | mark.dickinson | 2008-07-16 10:40:03 +0100 (Wed, 16 Jul 2008) | 2 lines Issue #3360: Fix incorrect parsing of "020000000000.0". ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 13:31:01 2008 From: python-3000-checkins at python.org (mark.dickinson) Date: Wed, 16 Jul 2008 13:31:01 +0200 (CEST) Subject: [Python-3000-checkins] r65008 - in python/branches/py3k: Doc/library/stdtypes.rst Doc/whatsnew/2.6.rst Lib/test/test_float.py Misc/NEWS Objects/floatobject.c Message-ID: <20080716113101.1146F1E4003@bag.python.org> Author: mark.dickinson Date: Wed Jul 16 13:30:51 2008 New Revision: 65008 Log: Merged revisions 64974 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64974 | mark.dickinson | 2008-07-15 20:08:33 +0100 (Tue, 15 Jul 2008) | 3 lines Issue #3008: add instance method float.hex and class method float.fromhex to convert floats to and from hexadecimal strings respectively. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/whatsnew/2.6.rst python/branches/py3k/Lib/test/test_float.py python/branches/py3k/Misc/NEWS python/branches/py3k/Objects/floatobject.c Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Wed Jul 16 13:30:51 2008 @@ -423,6 +423,71 @@ .. _typeiter: + +Additional Methods on Float +--------------------------- + +The float type has some additional methods to support conversion to +and from hexadecimal strings. Since Python's floats are stored +internally as binary numbers, converting a float to or from a +*decimal* string usually involves a small rounding error. In +contrast, hexadecimal strings allow exact representation and +specification of floating-point numbers. This can be useful when +debugging, and in numerical work. + + +.. method:: float.hex() + + Return a representation of a floating-point number as a hexadecimal + string. For finite floating-point numbers, this representation + will always include a leading ``0x`` and a trailing ``p`` and + exponent. + + +.. method:: float.fromhex(s) + + Class method to return the float represented by a hexadecimal + string *s*. The string *s* may have leading and trailing + whitespace. + + +Note that :meth:`float.hex` is an instance method, while +:meth:`float.fromhex` is a class method. + +A hexadecimal string takes the form:: + + [sign] ['0x'] integer ['.' fraction] ['p' exponent] + +where the optional ``sign`` may by either ``+`` or ``-``, ``integer`` +and ``fraction`` are strings of hexadecimal digits, and ``exponent`` +is a decimal integer with an optional leading sign. Case is not +significant, and there must be at least one hexadecimal digit in +either the integer or the fraction. This syntax is similar to the +syntax specified in section 6.4.4.2 of the C99 standard, and also to +the syntax used in Java 1.5 onwards. In particular, the output of +:meth:`float.hex` is usable as a hexadecimal floating-point literal in +C or Java code, and hexadecimal strings produced by C's ``%a`` format +character or Java's ``Double.toHexString`` are accepted by +:meth:`float.fromhex`. + + +Note that the exponent is written in decimal rather than hexadecimal, +and that it gives the power of 2 by which to multiply the coefficient. +For example, the hexadecimal string ``0x3.a7p10`` represents the +floating-point number ``(3 + 10./16 + 7./16**2) * 2.0**10``, or +``3740.0``:: + + >>> float.fromhex('0x3.a7p10') + 3740.0 + + +Applying the reverse conversion to ``3740.0`` gives a different +hexadecimal string representing the same number:: + + >>> float.hex(3740.0) + '0x1.d380000000000p+11' + + Iterator Types ============== Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Wed Jul 16 13:30:51 2008 @@ -1397,6 +1397,11 @@ :func:`isnan`, return true if their floating-point argument is infinite or Not A Number. (:issue:`1640`) + The float type has a new instance method :meth:`float.hex` and a + corresponding new class method :meth:`float.fromhex` to convert + floating-point numbers to and from hexadecimal strings, + respectively. (:issue:`3008`) + * The :mod:`math` module has a number of new functions, and the existing functions have been improved to give more consistent behaviour across platforms, especially with respect to handling of Modified: python/branches/py3k/Lib/test/test_float.py ============================================================================== --- python/branches/py3k/Lib/test/test_float.py (original) +++ python/branches/py3k/Lib/test/test_float.py Wed Jul 16 13:30:51 2008 @@ -3,7 +3,7 @@ import os from test import support import math -from math import isinf, isnan +from math import isinf, isnan, copysign, ldexp import operator INF = float("inf") @@ -358,6 +358,389 @@ self.failIf(NAN.is_inf()) self.failIf((0.).is_inf()) +fromHex = float.fromhex +toHex = float.hex +class HexFloatTestCase(unittest.TestCase): + MAX = fromHex('0x.fffffffffffff8p+1024') # max normal + MIN = fromHex('0x1p-1022') # min normal + TINY = fromHex('0x0.0000000000001p-1022') # min subnormal + EPS = fromHex('0x0.0000000000001p0') # diff between 1.0 and next float up + + def identical(self, x, y): + # check that floats x and y are identical, or that both + # are NaNs + if isnan(x) or isnan(y): + if isnan(x) == isnan(y): + return + elif x == y and (x != 0.0 or copysign(1.0, x) == copysign(1.0, y)): + return + self.fail('%r not identical to %r' % (x, y)) + + def test_ends(self): + self.identical(self.MIN, 2.**-1022) + self.identical(self.TINY, 2.**-1074) + self.identical(self.EPS, 2.**-52) + self.identical(self.MAX, 2.*(2.**1023 - 2.**970)) + + def test_invalid_inputs(self): + invalid_inputs = [ + 'infi', # misspelt infinities and nans + '-Infinit', + '++inf', + '-+Inf', + '--nan', + '+-NaN', + 'snan', + 'NaNs', + 'nna', + '0xnan', + '', + ' ', + 'x1.0p0', + '0xX1.0p0', + '+ 0x1.0p0', # internal whitespace + '- 0x1.0p0', + '0 x1.0p0', + '0x 1.0p0', + '0x1 2.0p0', + '+0x1 .0p0', + '0x1. 0p0', + '-0x1.0 1p0', + '-0x1.0 p0', + '+0x1.0p +0', + '0x1.0p -0', + '0x1.0p 0', + '+0x1.0p+ 0', + '-0x1.0p- 0', + '++0x1.0p-0', # double signs + '--0x1.0p0', + '+-0x1.0p+0', + '-+0x1.0p0', + '0x1.0p++0', + '+0x1.0p+-0', + '-0x1.0p-+0', + '0x1.0p--0', + '0x1.0.p0', + '0x.p0', # no hex digits before or after point + '0x1,p0', # wrong decimal point character + '0x1pa', + '0x1p\uff10', # fullwidth Unicode digits + '\uff10x1p0', + '0x\uff11p0', + '0x1.\uff10p0', + '0x1p0 \n 0x2p0', + '0x1p0\0 0x1p0', # embedded null byte is not end of string + ] + for x in invalid_inputs: + self.assertRaises(ValueError, fromHex, x) + + + def test_from_hex(self): + MIN = self.MIN; + MAX = self.MAX; + TINY = self.TINY; + EPS = self.EPS; + + # two spellings of infinity, with optional signs; case-insensitive + self.identical(fromHex('inf'), INF) + self.identical(fromHex('+Inf'), INF) + self.identical(fromHex('-INF'), -INF) + self.identical(fromHex('iNf'), INF) + self.identical(fromHex('Infinity'), INF) + self.identical(fromHex('+INFINITY'), INF) + self.identical(fromHex('-infinity'), -INF) + self.identical(fromHex('-iNFiNitY'), -INF) + + # nans with optional sign; case insensitive + self.identical(fromHex('nan'), NAN) + self.identical(fromHex('+NaN'), NAN) + self.identical(fromHex('-NaN'), NAN) + self.identical(fromHex('-nAN'), NAN) + + # variations in input format + self.identical(fromHex('1'), 1.0) + self.identical(fromHex('+1'), 1.0) + self.identical(fromHex('1.'), 1.0) + self.identical(fromHex('1.0'), 1.0) + self.identical(fromHex('1.0p0'), 1.0) + self.identical(fromHex('01'), 1.0) + self.identical(fromHex('01.'), 1.0) + self.identical(fromHex('0x1'), 1.0) + self.identical(fromHex('0x1.'), 1.0) + self.identical(fromHex('0x1.0'), 1.0) + self.identical(fromHex('+0x1.0'), 1.0) + self.identical(fromHex('0x1p0'), 1.0) + self.identical(fromHex('0X1p0'), 1.0) + self.identical(fromHex('0X1P0'), 1.0) + self.identical(fromHex('0x1P0'), 1.0) + self.identical(fromHex('0x1.p0'), 1.0) + self.identical(fromHex('0x1.0p0'), 1.0) + self.identical(fromHex('0x.1p4'), 1.0) + self.identical(fromHex('0x.1p04'), 1.0) + self.identical(fromHex('0x.1p004'), 1.0) + self.identical(fromHex('0x1p+0'), 1.0) + self.identical(fromHex('0x1P-0'), 1.0) + self.identical(fromHex('+0x1p0'), 1.0) + self.identical(fromHex('0x01p0'), 1.0) + self.identical(fromHex('0x1p00'), 1.0) + self.identical(fromHex(' 0x1p0 '), 1.0) + self.identical(fromHex('\n 0x1p0'), 1.0) + self.identical(fromHex('0x1p0 \t'), 1.0) + self.identical(fromHex('0xap0'), 10.0) + self.identical(fromHex('0xAp0'), 10.0) + self.identical(fromHex('0xaP0'), 10.0) + self.identical(fromHex('0xAP0'), 10.0) + self.identical(fromHex('0xbep0'), 190.0) + self.identical(fromHex('0xBep0'), 190.0) + self.identical(fromHex('0xbEp0'), 190.0) + self.identical(fromHex('0XBE0P-4'), 190.0) + self.identical(fromHex('0xBEp0'), 190.0) + self.identical(fromHex('0xB.Ep4'), 190.0) + self.identical(fromHex('0x.BEp8'), 190.0) + self.identical(fromHex('0x.0BEp12'), 190.0) + + # moving the point around + pi = fromHex('0x1.921fb54442d18p1') + self.identical(fromHex('0x.006487ed5110b46p11'), pi) + self.identical(fromHex('0x.00c90fdaa22168cp10'), pi) + self.identical(fromHex('0x.01921fb54442d18p9'), pi) + self.identical(fromHex('0x.03243f6a8885a3p8'), pi) + self.identical(fromHex('0x.06487ed5110b46p7'), pi) + self.identical(fromHex('0x.0c90fdaa22168cp6'), pi) + self.identical(fromHex('0x.1921fb54442d18p5'), pi) + self.identical(fromHex('0x.3243f6a8885a3p4'), pi) + self.identical(fromHex('0x.6487ed5110b46p3'), pi) + self.identical(fromHex('0x.c90fdaa22168cp2'), pi) + self.identical(fromHex('0x1.921fb54442d18p1'), pi) + self.identical(fromHex('0x3.243f6a8885a3p0'), pi) + self.identical(fromHex('0x6.487ed5110b46p-1'), pi) + self.identical(fromHex('0xc.90fdaa22168cp-2'), pi) + self.identical(fromHex('0x19.21fb54442d18p-3'), pi) + self.identical(fromHex('0x32.43f6a8885a3p-4'), pi) + self.identical(fromHex('0x64.87ed5110b46p-5'), pi) + self.identical(fromHex('0xc9.0fdaa22168cp-6'), pi) + self.identical(fromHex('0x192.1fb54442d18p-7'), pi) + self.identical(fromHex('0x324.3f6a8885a3p-8'), pi) + self.identical(fromHex('0x648.7ed5110b46p-9'), pi) + self.identical(fromHex('0xc90.fdaa22168cp-10'), pi) + self.identical(fromHex('0x1921.fb54442d18p-11'), pi) + # ... + self.identical(fromHex('0x1921fb54442d1.8p-47'), pi) + self.identical(fromHex('0x3243f6a8885a3p-48'), pi) + self.identical(fromHex('0x6487ed5110b46p-49'), pi) + self.identical(fromHex('0xc90fdaa22168cp-50'), pi) + self.identical(fromHex('0x1921fb54442d18p-51'), pi) + self.identical(fromHex('0x3243f6a8885a30p-52'), pi) + self.identical(fromHex('0x6487ed5110b460p-53'), pi) + self.identical(fromHex('0xc90fdaa22168c0p-54'), pi) + self.identical(fromHex('0x1921fb54442d180p-55'), pi) + + + # results that should overflow... + self.assertRaises(OverflowError, fromHex, '-0x1p1024') + self.assertRaises(OverflowError, fromHex, '0x1p+1025') + self.assertRaises(OverflowError, fromHex, '+0X1p1030') + self.assertRaises(OverflowError, fromHex, '-0x1p+1100') + self.assertRaises(OverflowError, fromHex, '0X1p123456789123456789') + self.assertRaises(OverflowError, fromHex, '+0X.8p+1025') + self.assertRaises(OverflowError, fromHex, '+0x0.8p1025') + self.assertRaises(OverflowError, fromHex, '-0x0.4p1026') + self.assertRaises(OverflowError, fromHex, '0X2p+1023') + self.assertRaises(OverflowError, fromHex, '0x2.p1023') + self.assertRaises(OverflowError, fromHex, '-0x2.0p+1023') + self.assertRaises(OverflowError, fromHex, '+0X4p+1022') + self.assertRaises(OverflowError, fromHex, '0x1.ffffffffffffffp+1023') + self.assertRaises(OverflowError, fromHex, '-0X1.fffffffffffff9p1023') + self.assertRaises(OverflowError, fromHex, '0X1.fffffffffffff8p1023') + self.assertRaises(OverflowError, fromHex, '+0x3.fffffffffffffp1022') + self.assertRaises(OverflowError, fromHex, '0x3fffffffffffffp+970') + self.assertRaises(OverflowError, fromHex, '0x10000000000000000p960') + self.assertRaises(OverflowError, fromHex, '-0Xffffffffffffffffp960') + + # ...and those that round to +-max float + self.identical(fromHex('+0x1.fffffffffffffp+1023'), MAX) + self.identical(fromHex('-0X1.fffffffffffff7p1023'), -MAX) + self.identical(fromHex('0X1.fffffffffffff7fffffffffffffp1023'), MAX) + + # zeros + self.identical(fromHex('0x0p0'), 0.0) + self.identical(fromHex('0x0p1000'), 0.0) + self.identical(fromHex('-0x0p1023'), -0.0) + self.identical(fromHex('0X0p1024'), 0.0) + self.identical(fromHex('-0x0p1025'), -0.0) + self.identical(fromHex('0X0p2000'), 0.0) + self.identical(fromHex('0x0p123456789123456789'), 0.0) + self.identical(fromHex('-0X0p-0'), -0.0) + self.identical(fromHex('-0X0p-1000'), -0.0) + self.identical(fromHex('0x0p-1023'), 0.0) + self.identical(fromHex('-0X0p-1024'), -0.0) + self.identical(fromHex('-0x0p-1025'), -0.0) + self.identical(fromHex('-0x0p-1072'), -0.0) + self.identical(fromHex('0X0p-1073'), 0.0) + self.identical(fromHex('-0x0p-1074'), -0.0) + self.identical(fromHex('0x0p-1075'), 0.0) + self.identical(fromHex('0X0p-1076'), 0.0) + self.identical(fromHex('-0X0p-2000'), -0.0) + self.identical(fromHex('-0x0p-123456789123456789'), -0.0) + + # values that should underflow to 0 + self.identical(fromHex('0X1p-1075'), 0.0) + self.identical(fromHex('-0X1p-1075'), -0.0) + self.identical(fromHex('-0x1p-123456789123456789'), -0.0) + self.identical(fromHex('0x1.00000000000000001p-1075'), TINY) + self.identical(fromHex('-0x1.1p-1075'), -TINY) + self.identical(fromHex('0x1.fffffffffffffffffp-1075'), TINY) + + # check round-half-even is working correctly near 0 ... + self.identical(fromHex('0x1p-1076'), 0.0) + self.identical(fromHex('0X2p-1076'), 0.0) + self.identical(fromHex('0X3p-1076'), TINY) + self.identical(fromHex('0x4p-1076'), TINY) + self.identical(fromHex('0X5p-1076'), TINY) + self.identical(fromHex('0X6p-1076'), 2*TINY) + self.identical(fromHex('0x7p-1076'), 2*TINY) + self.identical(fromHex('0X8p-1076'), 2*TINY) + self.identical(fromHex('0X9p-1076'), 2*TINY) + self.identical(fromHex('0xap-1076'), 2*TINY) + self.identical(fromHex('0Xbp-1076'), 3*TINY) + self.identical(fromHex('0xcp-1076'), 3*TINY) + self.identical(fromHex('0Xdp-1076'), 3*TINY) + self.identical(fromHex('0Xep-1076'), 4*TINY) + self.identical(fromHex('0xfp-1076'), 4*TINY) + self.identical(fromHex('0x10p-1076'), 4*TINY) + self.identical(fromHex('-0x1p-1076'), -0.0) + self.identical(fromHex('-0X2p-1076'), -0.0) + self.identical(fromHex('-0x3p-1076'), -TINY) + self.identical(fromHex('-0X4p-1076'), -TINY) + self.identical(fromHex('-0x5p-1076'), -TINY) + self.identical(fromHex('-0x6p-1076'), -2*TINY) + self.identical(fromHex('-0X7p-1076'), -2*TINY) + self.identical(fromHex('-0X8p-1076'), -2*TINY) + self.identical(fromHex('-0X9p-1076'), -2*TINY) + self.identical(fromHex('-0Xap-1076'), -2*TINY) + self.identical(fromHex('-0xbp-1076'), -3*TINY) + self.identical(fromHex('-0xcp-1076'), -3*TINY) + self.identical(fromHex('-0Xdp-1076'), -3*TINY) + self.identical(fromHex('-0xep-1076'), -4*TINY) + self.identical(fromHex('-0Xfp-1076'), -4*TINY) + self.identical(fromHex('-0X10p-1076'), -4*TINY) + + # ... and near MIN ... + self.identical(fromHex('0x0.ffffffffffffd6p-1022'), MIN-3*TINY) + self.identical(fromHex('0x0.ffffffffffffd8p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffdap-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffdcp-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffdep-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffe0p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffe2p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffe4p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffe6p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffe8p-1022'), MIN-2*TINY) + self.identical(fromHex('0x0.ffffffffffffeap-1022'), MIN-TINY) + self.identical(fromHex('0x0.ffffffffffffecp-1022'), MIN-TINY) + self.identical(fromHex('0x0.ffffffffffffeep-1022'), MIN-TINY) + self.identical(fromHex('0x0.fffffffffffff0p-1022'), MIN-TINY) + self.identical(fromHex('0x0.fffffffffffff2p-1022'), MIN-TINY) + self.identical(fromHex('0x0.fffffffffffff4p-1022'), MIN-TINY) + self.identical(fromHex('0x0.fffffffffffff6p-1022'), MIN-TINY) + self.identical(fromHex('0x0.fffffffffffff8p-1022'), MIN) + self.identical(fromHex('0x0.fffffffffffffap-1022'), MIN) + self.identical(fromHex('0x0.fffffffffffffcp-1022'), MIN) + self.identical(fromHex('0x0.fffffffffffffep-1022'), MIN) + self.identical(fromHex('0x1.00000000000000p-1022'), MIN) + self.identical(fromHex('0x1.00000000000002p-1022'), MIN) + self.identical(fromHex('0x1.00000000000004p-1022'), MIN) + self.identical(fromHex('0x1.00000000000006p-1022'), MIN) + self.identical(fromHex('0x1.00000000000008p-1022'), MIN) + self.identical(fromHex('0x1.0000000000000ap-1022'), MIN+TINY) + self.identical(fromHex('0x1.0000000000000cp-1022'), MIN+TINY) + self.identical(fromHex('0x1.0000000000000ep-1022'), MIN+TINY) + self.identical(fromHex('0x1.00000000000010p-1022'), MIN+TINY) + self.identical(fromHex('0x1.00000000000012p-1022'), MIN+TINY) + self.identical(fromHex('0x1.00000000000014p-1022'), MIN+TINY) + self.identical(fromHex('0x1.00000000000016p-1022'), MIN+TINY) + self.identical(fromHex('0x1.00000000000018p-1022'), MIN+2*TINY) + + # ... and near 1.0. + self.identical(fromHex('0x0.fffffffffffff0p0'), 1.0-EPS) + self.identical(fromHex('0x0.fffffffffffff1p0'), 1.0-EPS) + self.identical(fromHex('0X0.fffffffffffff2p0'), 1.0-EPS) + self.identical(fromHex('0x0.fffffffffffff3p0'), 1.0-EPS) + self.identical(fromHex('0X0.fffffffffffff4p0'), 1.0-EPS) + self.identical(fromHex('0X0.fffffffffffff5p0'), 1.0-EPS/2) + self.identical(fromHex('0X0.fffffffffffff6p0'), 1.0-EPS/2) + self.identical(fromHex('0x0.fffffffffffff7p0'), 1.0-EPS/2) + self.identical(fromHex('0x0.fffffffffffff8p0'), 1.0-EPS/2) + self.identical(fromHex('0X0.fffffffffffff9p0'), 1.0-EPS/2) + self.identical(fromHex('0X0.fffffffffffffap0'), 1.0-EPS/2) + self.identical(fromHex('0x0.fffffffffffffbp0'), 1.0-EPS/2) + self.identical(fromHex('0X0.fffffffffffffcp0'), 1.0) + self.identical(fromHex('0x0.fffffffffffffdp0'), 1.0) + self.identical(fromHex('0X0.fffffffffffffep0'), 1.0) + self.identical(fromHex('0x0.ffffffffffffffp0'), 1.0) + self.identical(fromHex('0X1.00000000000000p0'), 1.0) + self.identical(fromHex('0X1.00000000000001p0'), 1.0) + self.identical(fromHex('0x1.00000000000002p0'), 1.0) + self.identical(fromHex('0X1.00000000000003p0'), 1.0) + self.identical(fromHex('0x1.00000000000004p0'), 1.0) + self.identical(fromHex('0X1.00000000000005p0'), 1.0) + self.identical(fromHex('0X1.00000000000006p0'), 1.0) + self.identical(fromHex('0X1.00000000000007p0'), 1.0) + self.identical(fromHex('0x1.00000000000007ffffffffffffffffffffp0'), + 1.0) + self.identical(fromHex('0x1.00000000000008p0'), 1.0) + self.identical(fromHex('0x1.00000000000008000000000000000001p0'), + 1+EPS) + self.identical(fromHex('0X1.00000000000009p0'), 1.0+EPS) + self.identical(fromHex('0x1.0000000000000ap0'), 1.0+EPS) + self.identical(fromHex('0x1.0000000000000bp0'), 1.0+EPS) + self.identical(fromHex('0X1.0000000000000cp0'), 1.0+EPS) + self.identical(fromHex('0x1.0000000000000dp0'), 1.0+EPS) + self.identical(fromHex('0x1.0000000000000ep0'), 1.0+EPS) + self.identical(fromHex('0X1.0000000000000fp0'), 1.0+EPS) + self.identical(fromHex('0x1.00000000000010p0'), 1.0+EPS) + self.identical(fromHex('0X1.00000000000011p0'), 1.0+EPS) + self.identical(fromHex('0x1.00000000000012p0'), 1.0+EPS) + self.identical(fromHex('0X1.00000000000013p0'), 1.0+EPS) + self.identical(fromHex('0X1.00000000000014p0'), 1.0+EPS) + self.identical(fromHex('0x1.00000000000015p0'), 1.0+EPS) + self.identical(fromHex('0x1.00000000000016p0'), 1.0+EPS) + self.identical(fromHex('0X1.00000000000017p0'), 1.0+EPS) + self.identical(fromHex('0x1.00000000000017ffffffffffffffffffffp0'), + 1.0+EPS) + self.identical(fromHex('0x1.00000000000018p0'), 1.0+2*EPS) + self.identical(fromHex('0X1.00000000000018000000000000000001p0'), + 1.0+2*EPS) + self.identical(fromHex('0x1.00000000000019p0'), 1.0+2*EPS) + self.identical(fromHex('0X1.0000000000001ap0'), 1.0+2*EPS) + self.identical(fromHex('0X1.0000000000001bp0'), 1.0+2*EPS) + self.identical(fromHex('0x1.0000000000001cp0'), 1.0+2*EPS) + self.identical(fromHex('0x1.0000000000001dp0'), 1.0+2*EPS) + self.identical(fromHex('0x1.0000000000001ep0'), 1.0+2*EPS) + self.identical(fromHex('0X1.0000000000001fp0'), 1.0+2*EPS) + self.identical(fromHex('0x1.00000000000020p0'), 1.0+2*EPS) + + def test_roundtrip(self): + def roundtrip(x): + return fromHex(toHex(x)) + + for x in [NAN, INF, self.MAX, self.MIN, self.MIN-self.TINY, self.TINY, 0.0]: + self.identical(x, roundtrip(x)) + self.identical(-x, roundtrip(-x)) + + # fromHex(toHex(x)) should exactly recover x, for any non-NaN float x. + import random + for i in range(10000): + e = random.randrange(-1200, 1200) + m = random.random() + s = random.choice([1.0, -1.0]) + try: + x = s*ldexp(m, e) + except OverflowError: + pass + else: + self.identical(x, fromHex(toHex(x))) + def test_main(): support.run_unittest( @@ -367,6 +750,7 @@ FormatTestCase, ReprTestCase, InfNanTest, + HexFloatTestCase, ) if __name__ == '__main__': Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Wed Jul 16 13:30:51 2008 @@ -12,6 +12,10 @@ Core and Builtins ----------------- +- Issue #3008: the float type has a new instance method 'float.hex' + and a new class method 'float.fromhex' to convert floating-point + numbers to and from hexadecimal strings, respectively. + - Issue #3083: Add alternate (#) formatting for bin, oct, hex output for str.format(). This adds the prefix 0b, 0o, or 0x, respectively. Modified: python/branches/py3k/Objects/floatobject.c ============================================================================== --- python/branches/py3k/Objects/floatobject.c (original) +++ python/branches/py3k/Objects/floatobject.c Wed Jul 16 13:30:51 2008 @@ -10,6 +10,11 @@ #include #include +#undef MAX +#undef MIN +#define MAX(x, y) ((x) < (y) ? (y) : (x)) +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + #ifdef HAVE_IEEEFP_H #include #endif @@ -1015,6 +1020,405 @@ return v; } +/* turn ASCII hex characters into integer values and vice versa */ + +static char +char_from_hex(int x) +{ + assert(0 <= x && x < 16); + return "0123456789abcdef"[x]; +} + +static int +hex_from_char(char c) { + int x; + assert(isxdigit(c)); + switch(c) { + case '0': + x = 0; + break; + case '1': + x = 1; + break; + case '2': + x = 2; + break; + case '3': + x = 3; + break; + case '4': + x = 4; + break; + case '5': + x = 5; + break; + case '6': + x = 6; + break; + case '7': + x = 7; + break; + case '8': + x = 8; + break; + case '9': + x = 9; + break; + case 'a': + case 'A': + x = 10; + break; + case 'b': + case 'B': + x = 11; + break; + case 'c': + case 'C': + x = 12; + break; + case 'd': + case 'D': + x = 13; + break; + case 'e': + case 'E': + x = 14; + break; + case 'f': + case 'F': + x = 15; + break; + default: + x = -1; + break; + } + return x; +} + +/* convert a float to a hexadecimal string */ + +/* TOHEX_NBITS is DBL_MANT_DIG rounded up to the next integer + of the form 4k+1. */ +#define TOHEX_NBITS DBL_MANT_DIG + 3 - (DBL_MANT_DIG+2)%4 + +static PyObject * +float_hex(PyObject *v) +{ + double x, m; + int e, shift, i, si, esign; + /* Space for 1+(TOHEX_NBITS-1)/4 digits, a decimal point, and the + trailing NUL byte. */ + char s[(TOHEX_NBITS-1)/4+3]; + + CONVERT_TO_DOUBLE(v, x); + + if (Py_IS_NAN(x) || Py_IS_INFINITY(x)) + return float_str((PyFloatObject *)v); + + if (x == 0.0) { + if(copysign(1.0, x) == -1.0) + return PyUnicode_FromString("-0x0.0p+0"); + else + return PyUnicode_FromString("0x0.0p+0"); + } + + m = frexp(fabs(x), &e); + shift = 1 - MAX(DBL_MIN_EXP - e, 0); + m = ldexp(m, shift); + e -= shift; + + si = 0; + s[si] = char_from_hex((int)m); + si++; + m -= (int)m; + s[si] = '.'; + si++; + for (i=0; i < (TOHEX_NBITS-1)/4; i++) { + m *= 16.0; + s[si] = char_from_hex((int)m); + si++; + m -= (int)m; + } + s[si] = '\0'; + + if (e < 0) { + esign = (int)'-'; + e = -e; + } + else + esign = (int)'+'; + + if (x < 0.0) + return PyUnicode_FromFormat("-0x%sp%c%d", s, esign, e); + else + return PyUnicode_FromFormat("0x%sp%c%d", s, esign, e); +} + +PyDoc_STRVAR(float_hex_doc, +"float.hex() -> string\n\ +\n\ +Return a hexadecimal representation of a floating-point number.\n\ +>>> (-0.1).hex()\n\ +'-0x1.999999999999ap-4'\n\ +>>> 3.14159.hex()\n\ +'0x1.921f9f01b866ep+1'"); + +/* Convert a hexadecimal string to a float. */ + +static PyObject * +float_fromhex(PyObject *cls, PyObject *arg) +{ + PyObject *result_as_float, *result; + double x; + long exp, top_exp, lsb, key_digit; + char *s, *coeff_start, *s_store, *coeff_end, *exp_start, *s_end; + int half_eps, digit, round_up, sign=1; + Py_ssize_t length, ndigits, fdigits, i; + + /* + * For the sake of simplicity and correctness, we impose an artificial + * limit on ndigits, the total number of hex digits in the coefficient + * The limit is chosen to ensure that, writing exp for the exponent, + * + * (1) if exp > LONG_MAX/2 then the value of the hex string is + * guaranteed to overflow (provided it's nonzero) + * + * (2) if exp < LONG_MIN/2 then the value of the hex string is + * guaranteed to underflow to 0. + * + * (3) if LONG_MIN/2 <= exp <= LONG_MAX/2 then there's no danger of + * overflow in the calculation of exp and top_exp below. + * + * More specifically, ndigits is assumed to satisfy the following + * inequalities: + * + * 4*ndigits <= DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2 + * 4*ndigits <= LONG_MAX/2 + 1 - DBL_MAX_EXP + * + * If either of these inequalities is not satisfied, a ValueError is + * raised. Otherwise, write x for the value of the hex string, and + * assume x is nonzero. Then + * + * 2**(exp-4*ndigits) <= |x| < 2**(exp+4*ndigits). + * + * Now if exp > LONG_MAX/2 then: + * + * exp - 4*ndigits >= LONG_MAX/2 + 1 - (LONG_MAX/2 + 1 - DBL_MAX_EXP) + * = DBL_MAX_EXP + * + * so |x| >= 2**DBL_MAX_EXP, which is too large to be stored in C + * double, so overflows. If exp < LONG_MIN/2, then + * + * exp + 4*ndigits <= LONG_MIN/2 - 1 + ( + * DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2) + * = DBL_MIN_EXP - DBL_MANT_DIG - 1 + * + * and so |x| < 2**(DBL_MIN_EXP-DBL_MANT_DIG-1), hence underflows to 0 + * when converted to a C double. + * + * It's easy to show that if LONG_MIN/2 <= exp <= LONG_MAX/2 then both + * exp+4*ndigits and exp-4*ndigits are within the range of a long. + */ + + s = PyUnicode_AsStringAndSize(arg, &length); + if (s == NULL) + return NULL; + s_end = s + length; + + /******************** + * Parse the string * + ********************/ + + /* leading whitespace and optional sign */ + while (isspace(*s)) + s++; + if (*s == '-') { + s++; + sign = -1; + } + else if (*s == '+') + s++; + + /* infinities and nans */ + if (PyOS_mystrnicmp(s, "nan", 4) == 0) { + x = Py_NAN; + goto finished; + } + if (PyOS_mystrnicmp(s, "inf", 4) == 0 || + PyOS_mystrnicmp(s, "infinity", 9) == 0) { + x = sign*Py_HUGE_VAL; + goto finished; + } + + /* [0x] */ + s_store = s; + if (*s == '0') { + s++; + if (tolower(*s) == (int)'x') + s++; + else + s = s_store; + } + + /* coefficient: [. ] */ + coeff_start = s; + while (isxdigit(*s)) + s++; + s_store = s; + if (*s == '.') { + s++; + while (isxdigit(*s)) + s++; + coeff_end = s-1; + } + else + coeff_end = s; + + /* ndigits = total # of hex digits; fdigits = # after point */ + ndigits = coeff_end - coeff_start; + fdigits = coeff_end - s_store; + if (ndigits == 0) + goto parse_error; + if (ndigits > MIN(DBL_MIN_EXP - DBL_MANT_DIG - LONG_MIN/2, + LONG_MAX/2 + 1 - DBL_MAX_EXP)/4) + goto insane_length_error; + + /* [p ] */ + if (tolower(*s) == (int)'p') { + s++; + exp_start = s; + if (*s == '-' || *s == '+') + s++; + if (!isdigit(*s)) + goto parse_error; + s++; + while (isdigit(*s)) + s++; + exp = strtol(exp_start, NULL, 10); + } + else + exp = 0; + + /* optional trailing whitespace leading to the end of the string */ + while (isspace(*s)) + s++; + if (s != s_end) + goto parse_error; + +/* for 0 <= j < ndigits, HEX_DIGIT(j) gives the jth most significant digit */ +#define HEX_DIGIT(j) hex_from_char(*((j) < fdigits ? \ + coeff_end-(j) : \ + coeff_end-1-(j))) + + /******************************************* + * Compute rounded value of the hex string * + *******************************************/ + + /* Discard leading zeros, and catch extreme overflow and underflow */ + while (ndigits > 0 && HEX_DIGIT(ndigits-1) == 0) + ndigits--; + if (ndigits == 0 || exp < LONG_MIN/2) { + x = sign * 0.0; + goto finished; + } + if (exp > LONG_MAX/2) + goto overflow_error; + + /* Adjust exponent for fractional part. */ + exp = exp - 4*((long)fdigits); + + /* top_exp = 1 more than exponent of most sig. bit of coefficient */ + top_exp = exp + 4*((long)ndigits - 1); + for (digit = HEX_DIGIT(ndigits-1); digit != 0; digit /= 2) + top_exp++; + + /* catch almost all nonextreme cases of overflow and underflow here */ + if (top_exp < DBL_MIN_EXP - DBL_MANT_DIG) { + x = sign * 0.0; + goto finished; + } + if (top_exp > DBL_MAX_EXP) + goto overflow_error; + + /* lsb = exponent of least significant bit of the *rounded* value. + This is top_exp - DBL_MANT_DIG unless result is subnormal. */ + lsb = MAX(top_exp, (long)DBL_MIN_EXP) - DBL_MANT_DIG; + + x = 0.0; + if (exp >= lsb) { + /* no rounding required */ + for (i = ndigits-1; i >= 0; i--) + x = 16.0*x + HEX_DIGIT(i); + x = sign * ldexp(x, (int)(exp)); + goto finished; + } + /* rounding required. key_digit is the index of the hex digit + containing the first bit to be rounded away. */ + half_eps = 1 << (int)((lsb - exp - 1) % 4); + key_digit = (lsb - exp - 1) / 4; + for (i = ndigits-1; i > key_digit; i--) + x = 16.0*x + HEX_DIGIT(i); + digit = HEX_DIGIT(key_digit); + x = 16.0*x + (double)(digit & (16-2*half_eps)); + + /* round-half-even: round up if bit lsb-1 is 1 and at least one of + bits lsb, lsb-2, lsb-3, lsb-4, ... is 1. */ + if ((digit & half_eps) != 0) { + round_up = 0; + if ((digit & (3*half_eps-1)) != 0 || + (half_eps == 8 && (HEX_DIGIT(key_digit+1) & 1) != 0)) + round_up = 1; + else + for (i = key_digit-1; i >= 0; i--) + if (HEX_DIGIT(i) != 0) { + round_up = 1; + break; + } + if (round_up == 1) { + x += 2*half_eps; + if (top_exp == DBL_MAX_EXP && + x == ldexp((double)(2*half_eps), DBL_MANT_DIG)) + /* overflow corner case: pre-rounded value < + 2**DBL_MAX_EXP; rounded=2**DBL_MAX_EXP. */ + goto overflow_error; + } + } + x = sign * ldexp(x, (int)(exp+4*key_digit)); + + finished: + result_as_float = Py_BuildValue("(d)", x); + if (result_as_float == NULL) + return NULL; + result = PyObject_CallObject(cls, result_as_float); + Py_DECREF(result_as_float); + return result; + + overflow_error: + PyErr_SetString(PyExc_OverflowError, + "hexadecimal value too large to represent as a float"); + return NULL; + + parse_error: + PyErr_SetString(PyExc_ValueError, + "invalid hexadecimal floating-point string"); + return NULL; + + insane_length_error: + PyErr_SetString(PyExc_ValueError, + "hexadecimal string too long to convert"); + return NULL; +} + +PyDoc_STRVAR(float_fromhex_doc, +"float.fromhex(string) -> float\n\ +\n\ +Create a floating-point number from a hexadecimal string.\n\ +>>> float.fromhex('0x1.ffffp10')\n\ +2047.984375\n\ +>>> float.fromhex('-0x1p-1074')\n\ +-4.9406564584124654e-324"); + + static PyObject * float_as_integer_ratio(PyObject *v, PyObject *unused) { @@ -1326,6 +1730,10 @@ "When an argument is passed, works like built-in round(x, ndigits)."}, {"as_integer_ratio", (PyCFunction)float_as_integer_ratio, METH_NOARGS, float_as_integer_ratio_doc}, + {"fromhex", (PyCFunction)float_fromhex, + METH_O|METH_CLASS, float_fromhex_doc}, + {"hex", (PyCFunction)float_hex, + METH_NOARGS, float_hex_doc}, {"is_integer", (PyCFunction)float_is_integer, METH_NOARGS, "Returns True if the float is an integer."}, #if 0 From python-3000-checkins at python.org Wed Jul 16 13:32:31 2008 From: python-3000-checkins at python.org (mark.dickinson) Date: Wed, 16 Jul 2008 13:32:31 +0200 (CEST) Subject: [Python-3000-checkins] r65009 - in python/branches/py3k: Lib/test/test_float.py Message-ID: <20080716113231.BAD3E1E4009@bag.python.org> Author: mark.dickinson Date: Wed Jul 16 13:32:23 2008 New Revision: 65009 Log: Merged revisions 64981 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64981 | mark.dickinson | 2008-07-15 22:55:23 +0100 (Tue, 15 Jul 2008) | 4 lines Fix float.from_hex tests. It appears that Linux/ia64 doesn't like computing 2.0**-1074 accurately. Using ldexp(1.0, -1074) should be safer. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_float.py Modified: python/branches/py3k/Lib/test/test_float.py ============================================================================== --- python/branches/py3k/Lib/test/test_float.py (original) +++ python/branches/py3k/Lib/test/test_float.py Wed Jul 16 13:32:23 2008 @@ -377,10 +377,10 @@ self.fail('%r not identical to %r' % (x, y)) def test_ends(self): - self.identical(self.MIN, 2.**-1022) - self.identical(self.TINY, 2.**-1074) - self.identical(self.EPS, 2.**-52) - self.identical(self.MAX, 2.*(2.**1023 - 2.**970)) + self.identical(self.MIN, ldexp(1.0, -1022)) + self.identical(self.TINY, ldexp(1.0, -1074)) + self.identical(self.EPS, ldexp(1.0, -52)) + self.identical(self.MAX, 2.*(ldexp(1.0, 1023) - ldexp(1.0, 970))) def test_invalid_inputs(self): invalid_inputs = [ From python-3000-checkins at python.org Wed Jul 16 14:55:30 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 14:55:30 +0200 (CEST) Subject: [Python-3000-checkins] r65010 - in python/branches/py3k: Doc/c-api/conversion.rst Doc/c-api/float.rst Doc/c-api/sequence.rst Doc/extending/windows.rst Doc/library/__future__.rst Doc/library/ctypes.rst Doc/library/ftplib.rst Doc/library/functions.rst Doc/library/gc.rst Doc/library/multiprocessing.rst Doc/library/operator.rst Doc/library/select.rst Doc/library/stdtypes.rst Doc/library/string.rst Doc/library/sys.rst Doc/library/tkinter.tix.rst Doc/library/tkinter.turtle.rst Doc/library/urllib.request.rst Doc/library/wsgiref.rst Doc/library/xmlrpc.client.rst Doc/tutorial/stdlib2.rst Doc/using/windows.rst Doc/whatsnew/2.6.rst Include/floatobject.h Include/object.h Include/traceback.h Lib/bisect.py Lib/fractions.py Lib/multiprocessing/connection.py Lib/shutil.py Lib/test/test_bisect.py Lib/test/test_float.py Lib/test/test_fractions.py Lib/test/test_import.py Lib/test/test_shutil.py Lib/zipfile.py Misc/ACKS Modules/_bisectmodule.c Modules/gcmodule.c Modules/posixmodule.c Objects/floatobject.c Python/_warnings.c Python/import.c Python/sysmodule.c Python/traceback.c Tools/faqwiz/move-faqwiz.sh Message-ID: <20080716125530.9F5A01E401A@bag.python.org> Author: georg.brandl Date: Wed Jul 16 14:55:28 2008 New Revision: 65010 Log: Merged revisions 64722,64729,64753,64845-64846,64849,64871,64880-64882,64885,64888,64897,64900-64901,64915,64926-64929,64938-64941,64944,64961,64966,64973 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64722 | georg.brandl | 2008-07-05 12:13:36 +0200 (Sat, 05 Jul 2008) | 4 lines #2663: support an *ignore* argument to shutil.copytree(). Patch by Tarek Ziade. This is a new feature, but Barry authorized adding it in the beta period. ........ r64729 | mark.dickinson | 2008-07-05 13:33:52 +0200 (Sat, 05 Jul 2008) | 5 lines Issue 3188: accept float('infinity') as well as float('inf'). This makes the float constructor behave in the same way as specified by various other language standards, including C99, IEEE 754r, and the IBM Decimal standard. ........ r64753 | gregory.p.smith | 2008-07-06 05:35:58 +0200 (Sun, 06 Jul 2008) | 4 lines - Issue #2862: Make int and float freelist management consistent with other freelists. Changes their CompactFreeList apis into ClearFreeList apis and calls them via gc.collect(). ........ r64845 | raymond.hettinger | 2008-07-10 16:03:19 +0200 (Thu, 10 Jul 2008) | 1 line Issue 3301: Bisect functions behaved badly when lo was negative. ........ r64846 | raymond.hettinger | 2008-07-10 16:34:57 +0200 (Thu, 10 Jul 2008) | 1 line Issue 3285: Fractions from_float() and from_decimal() accept Integral arguments. ........ r64849 | andrew.kuchling | 2008-07-10 16:43:31 +0200 (Thu, 10 Jul 2008) | 1 line Wording changes ........ r64871 | raymond.hettinger | 2008-07-11 14:00:21 +0200 (Fri, 11 Jul 2008) | 1 line Add cautionary note on the use of PySequence_Fast_ITEMS. ........ r64880 | amaury.forgeotdarc | 2008-07-11 23:28:25 +0200 (Fri, 11 Jul 2008) | 5 lines #3317 in zipfile module, restore the previous names of global variables: some applications relied on them. Also remove duplicated lines. ........ r64881 | amaury.forgeotdarc | 2008-07-11 23:45:06 +0200 (Fri, 11 Jul 2008) | 3 lines #3342: In tracebacks, printed source lines were not indented since r62555. #3343: Py_DisplaySourceLine should be a private function. Rename it to _Py_DisplaySourceLine. ........ r64882 | josiah.carlson | 2008-07-12 00:17:14 +0200 (Sat, 12 Jul 2008) | 2 lines Fix for the AttributeError in test_asynchat. ........ r64885 | josiah.carlson | 2008-07-12 01:26:59 +0200 (Sat, 12 Jul 2008) | 2 lines Fixed test for asyncore. ........ r64888 | matthias.klose | 2008-07-12 09:51:48 +0200 (Sat, 12 Jul 2008) | 2 lines - Fix bashisms in Tools/faqwiz/move-faqwiz.sh ........ r64897 | benjamin.peterson | 2008-07-12 22:16:19 +0200 (Sat, 12 Jul 2008) | 1 line fix various doc typos #3320 ........ r64900 | alexandre.vassalotti | 2008-07-13 00:06:53 +0200 (Sun, 13 Jul 2008) | 2 lines Fixed typo. ........ r64901 | benjamin.peterson | 2008-07-13 01:41:19 +0200 (Sun, 13 Jul 2008) | 1 line #1778443 robotparser fixes from Aristotelis Mikropoulos ........ r64915 | nick.coghlan | 2008-07-13 16:52:36 +0200 (Sun, 13 Jul 2008) | 1 line Fix issue 3221 by emitting a RuntimeWarning instead of raising SystemError when the parent module can't be found during an absolute import (likely due to non-PEP 361 aware code which sets a module level __package__ attribute) ........ r64926 | martin.v.loewis | 2008-07-13 22:31:49 +0200 (Sun, 13 Jul 2008) | 2 lines Add turtle into the module index. ........ r64927 | alexandre.vassalotti | 2008-07-13 22:42:44 +0200 (Sun, 13 Jul 2008) | 3 lines Issue #3274: Use a less common identifier for the temporary variable in Py_CLEAR(). ........ r64928 | andrew.kuchling | 2008-07-13 23:43:25 +0200 (Sun, 13 Jul 2008) | 1 line Re-word ........ r64929 | andrew.kuchling | 2008-07-13 23:43:52 +0200 (Sun, 13 Jul 2008) | 1 line Add various items; move ctypes items into a subsection of their own ........ r64938 | andrew.kuchling | 2008-07-14 02:35:32 +0200 (Mon, 14 Jul 2008) | 1 line Typo fixes ........ r64939 | andrew.kuchling | 2008-07-14 02:40:55 +0200 (Mon, 14 Jul 2008) | 1 line Typo fix ........ r64940 | andrew.kuchling | 2008-07-14 03:18:16 +0200 (Mon, 14 Jul 2008) | 1 line Typo fix ........ r64941 | andrew.kuchling | 2008-07-14 03:18:31 +0200 (Mon, 14 Jul 2008) | 1 line Expand the multiprocessing section ........ r64944 | gregory.p.smith | 2008-07-14 08:06:48 +0200 (Mon, 14 Jul 2008) | 7 lines Fix posix.fork1() / os.fork1() to only call PyOS_AfterFork() in the child process rather than both parent and child. Does anyone actually use fork1()? It appears to be a Solaris thing but if Python is built with pthreads on Solaris, fork1() and fork() should be the same. ........ r64961 | jesse.noller | 2008-07-15 15:47:33 +0200 (Tue, 15 Jul 2008) | 1 line multiprocessing/connection.py patch to remove fqdn oddness for issue 3270 ........ r64966 | nick.coghlan | 2008-07-15 17:40:22 +0200 (Tue, 15 Jul 2008) | 1 line Add missing NEWS entry for r64962 ........ r64973 | jesse.noller | 2008-07-15 20:29:18 +0200 (Tue, 15 Jul 2008) | 1 line Revert 3270 patch: self._address is in pretty widespread use, need to revisit ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/c-api/conversion.rst python/branches/py3k/Doc/c-api/float.rst python/branches/py3k/Doc/c-api/sequence.rst python/branches/py3k/Doc/extending/windows.rst python/branches/py3k/Doc/library/__future__.rst python/branches/py3k/Doc/library/ctypes.rst python/branches/py3k/Doc/library/ftplib.rst python/branches/py3k/Doc/library/functions.rst python/branches/py3k/Doc/library/gc.rst python/branches/py3k/Doc/library/multiprocessing.rst python/branches/py3k/Doc/library/operator.rst python/branches/py3k/Doc/library/select.rst python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/library/string.rst python/branches/py3k/Doc/library/sys.rst python/branches/py3k/Doc/library/tkinter.tix.rst python/branches/py3k/Doc/library/tkinter.turtle.rst python/branches/py3k/Doc/library/urllib.request.rst python/branches/py3k/Doc/library/wsgiref.rst python/branches/py3k/Doc/library/xmlrpc.client.rst python/branches/py3k/Doc/tutorial/stdlib2.rst python/branches/py3k/Doc/using/windows.rst python/branches/py3k/Doc/whatsnew/2.6.rst python/branches/py3k/Include/floatobject.h python/branches/py3k/Include/object.h python/branches/py3k/Include/traceback.h python/branches/py3k/Lib/bisect.py python/branches/py3k/Lib/fractions.py python/branches/py3k/Lib/multiprocessing/connection.py python/branches/py3k/Lib/shutil.py python/branches/py3k/Lib/test/test_bisect.py python/branches/py3k/Lib/test/test_float.py python/branches/py3k/Lib/test/test_fractions.py python/branches/py3k/Lib/test/test_import.py python/branches/py3k/Lib/test/test_shutil.py python/branches/py3k/Lib/zipfile.py python/branches/py3k/Misc/ACKS python/branches/py3k/Modules/_bisectmodule.c python/branches/py3k/Modules/gcmodule.c python/branches/py3k/Modules/posixmodule.c python/branches/py3k/Objects/floatobject.c python/branches/py3k/Python/_warnings.c python/branches/py3k/Python/import.c python/branches/py3k/Python/sysmodule.c python/branches/py3k/Python/traceback.c python/branches/py3k/Tools/faqwiz/move-faqwiz.sh Modified: python/branches/py3k/Doc/c-api/conversion.rst ============================================================================== --- python/branches/py3k/Doc/c-api/conversion.rst (original) +++ python/branches/py3k/Doc/c-api/conversion.rst Wed Jul 16 14:55:28 2008 @@ -83,11 +83,11 @@ .. cfunction:: char * PyOS_stricmp(char *s1, char *s2) - Case insensitive comparison of strings. The functions works almost - identical to :cfunc:`strcmp` except that it ignores the case. + Case insensitive comparison of strings. The function works almost + identically to :cfunc:`strcmp` except that it ignores the case. .. cfunction:: char * PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size) - Case insensitive comparison of strings. The functions works almost - identical to :cfunc:`strncmp` except that it ignores the case. + Case insensitive comparison of strings. The function works almost + identically to :cfunc:`strncmp` except that it ignores the case. Modified: python/branches/py3k/Doc/c-api/float.rst ============================================================================== --- python/branches/py3k/Doc/c-api/float.rst (original) +++ python/branches/py3k/Doc/c-api/float.rst Wed Jul 16 14:55:28 2008 @@ -73,8 +73,7 @@ Return the minimum normalized positive float *DBL_MIN* as C :ctype:`double`. -.. cfunction:: void PyFloat_CompactFreeList(size_t *bc, size_t *bf, size_t *sum) +.. cfunction:: int PyFloat_ClearFreeList(void) - Compact the float free list. *bc* is the number of allocated blocks before - blocks are freed, *bf* is the number of freed blocks and *sum* is the number - of remaining objects in the blocks. + Clear the float free list. Return the number of items that could not + be freed. Modified: python/branches/py3k/Doc/c-api/sequence.rst ============================================================================== --- python/branches/py3k/Doc/c-api/sequence.rst (original) +++ python/branches/py3k/Doc/c-api/sequence.rst Wed Jul 16 14:55:28 2008 @@ -143,6 +143,10 @@ Return the underlying array of PyObject pointers. Assumes that *o* was returned by :cfunc:`PySequence_Fast` and *o* is not *NULL*. + + Note, if a list gets resized, the reallocation may relocate the items array. + So, only use the underlying array pointer in contexts where the sequence + cannot change. .. cfunction:: PyObject* PySequence_ITEM(PyObject *o, Py_ssize_t i) Modified: python/branches/py3k/Doc/extending/windows.rst ============================================================================== --- python/branches/py3k/Doc/extending/windows.rst (original) +++ python/branches/py3k/Doc/extending/windows.rst Wed Jul 16 14:55:28 2008 @@ -23,7 +23,7 @@ This chapter mentions a number of filenames that include an encoded Python version number. These filenames are represented with the version number shown - as ``XY``; in practive, ``'X'`` will be the major version number and ``'Y'`` + as ``XY``; in practice, ``'X'`` will be the major version number and ``'Y'`` will be the minor version number of the Python release you're working with. For example, if you are using Python 2.2.1, ``XY`` will actually be ``22``. Modified: python/branches/py3k/Doc/library/__future__.rst ============================================================================== --- python/branches/py3k/Doc/library/__future__.rst (original) +++ python/branches/py3k/Doc/library/__future__.rst Wed Jul 16 14:55:28 2008 @@ -16,7 +16,7 @@ * To document when incompatible changes were introduced, and when they will be --- or were --- made mandatory. This is a form of executable documentation, and - can be inspected programatically via importing :mod:`__future__` and examining + can be inspected programmatically via importing :mod:`__future__` and examining its contents. Each statement in :file:`__future__.py` is of the form:: Modified: python/branches/py3k/Doc/library/ctypes.rst ============================================================================== --- python/branches/py3k/Doc/library/ctypes.rst (original) +++ python/branches/py3k/Doc/library/ctypes.rst Wed Jul 16 14:55:28 2008 @@ -1781,8 +1781,8 @@ .. function:: byref(obj[, offset]) Returns a light-weight pointer to ``obj``, which must be an - instance of a ctypes type. ``offset`` defaults to zero, it must be - an integer which is added to the internal pointer value. + instance of a ctypes type. ``offset`` defaults to zero, and must be + an integer that will be added to the internal pointer value. ``byref(obj, offset)`` corresponds to this C code:: Modified: python/branches/py3k/Doc/library/ftplib.rst ============================================================================== --- python/branches/py3k/Doc/library/ftplib.rst (original) +++ python/branches/py3k/Doc/library/ftplib.rst Wed Jul 16 14:55:28 2008 @@ -300,7 +300,7 @@ Send a ``QUIT`` command to the server and close the connection. This is the "polite" way to close a connection, but it may raise an exception of the server - reponds with an error to the ``QUIT`` command. This implies a call to the + responds with an error to the ``QUIT`` command. This implies a call to the :meth:`close` method which renders the :class:`FTP` instance useless for subsequent calls (see below). Modified: python/branches/py3k/Doc/library/functions.rst ============================================================================== --- python/branches/py3k/Doc/library/functions.rst (original) +++ python/branches/py3k/Doc/library/functions.rst Wed Jul 16 14:55:28 2008 @@ -1186,6 +1186,7 @@ care about trailing, unmatched values from the longer iterables. If those values are important, use :func:`itertools.zip_longest` instead. + .. rubric:: Footnotes .. [#] Specifying a buffer size currently has no effect on systems that don't have Modified: python/branches/py3k/Doc/library/gc.rst ============================================================================== --- python/branches/py3k/Doc/library/gc.rst (original) +++ python/branches/py3k/Doc/library/gc.rst Wed Jul 16 14:55:28 2008 @@ -44,6 +44,11 @@ :exc:`ValueError` is raised if the generation number is invalid. The number of unreachable objects found is returned. + The free lists maintained for a number of builtin types are cleared + whenever a full collection or collection of the highest generation (2) + is run. Not all items in some free lists may be freed due to the + particular implementation, in particular :class:`float`. + .. function:: set_debug(flags) Modified: python/branches/py3k/Doc/library/multiprocessing.rst ============================================================================== --- python/branches/py3k/Doc/library/multiprocessing.rst (original) +++ python/branches/py3k/Doc/library/multiprocessing.rst Wed Jul 16 14:55:28 2008 @@ -158,7 +158,7 @@ The ``'d'`` and ``'i'`` arguments used when creating ``num`` and ``arr`` are typecodes of the kind used by the :mod:`array` module: ``'d'`` indicates a - double precision float and ``'i'`` inidicates a signed integer. These shared + double precision float and ``'i'`` indicates a signed integer. These shared objects will be process and thread safe. For more flexibility in using shared memory one can use the @@ -168,7 +168,7 @@ **Server process** A manager object returned by :func:`Manager` controls a server process which - holds python objects and allows other processes to manipulate them using + holds Python objects and allows other processes to manipulate them using proxies. A manager returned by :func:`Manager` will support types :class:`list`, @@ -451,7 +451,7 @@ This means that if you try joining that process you may get a deadlock unless you are sure that all items which have been put on the queue have been consumed. Similarly, if the child process is non-daemonic then the parent - process may hang on exit when it tries to join all it non-daemonic children. + process may hang on exit when it tries to join all its non-daemonic children. Note that a queue created using a manager does not have this issue. See :ref:`multiprocessing-programming`. @@ -532,7 +532,8 @@ Equivalent to ``get(False)``. :class:`multiprocessing.Queue` has a few additional methods not found in - :class:`queue.Queue` which are usually unnecessary: + :class:`queue.Queue`. These methods are usually unnecessary for most + code: .. method:: close() @@ -772,7 +773,7 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~ Generally synchronization primitives are not as necessary in a multiprocess -program as they are in a mulithreaded program. See the documentation for +program as they are in a multithreaded program. See the documentation for :mod:`threading` module. Note that one can also create synchronization primitives by using a manager @@ -782,7 +783,7 @@ A bounded semaphore object: a clone of :class:`threading.BoundedSemaphore`. - (On Mac OSX this is indistiguishable from :class:`Semaphore` because + (On Mac OSX this is indistinguishable from :class:`Semaphore` because ``sem_getvalue()`` is not implemented on that platform). .. class:: Condition([lock]) @@ -891,8 +892,8 @@ .. note:: - Although it is posible to store a pointer in shared memory remember that this - will refer to a location in the address space of a specific process. + Although it is possible to store a pointer in shared memory remember that + this will refer to a location in the address space of a specific process. However, the pointer is quite likely to be invalid in the context of a second process and trying to dereference the pointer from the second process may cause a crash. @@ -1081,7 +1082,7 @@ Start a subprocess to start the manager. - .. method:: server_forever() + .. method:: serve_forever() Run the server in the current process. @@ -1774,7 +1775,7 @@ handler which sends output to :data:`sys.stderr` using format ``'[%(levelname)s/%(processName)s] %(message)s'``. (The logger allows use of the non-standard ``'%(processName)s'`` format.) Message sent to this logger - will not by default propogate to the root logger. + will not by default propagate to the root logger. Note that on Windows child processes will only inherit the level of the parent process's logger -- any other customization of the logger will not be Modified: python/branches/py3k/Doc/library/operator.rst ============================================================================== --- python/branches/py3k/Doc/library/operator.rst (original) +++ python/branches/py3k/Doc/library/operator.rst Wed Jul 16 14:55:28 2008 @@ -513,7 +513,7 @@ +-----------------------+-------------------------+---------------------------------+ | Right Shift | ``a >> b`` | ``rshift(a, b)`` | +-----------------------+-------------------------+---------------------------------+ -| Sequence Repitition | ``seq * i`` | ``repeat(seq, i)`` | +| Sequence Repetition | ``seq * i`` | ``repeat(seq, i)`` | +-----------------------+-------------------------+---------------------------------+ | String Formatting | ``s % obj`` | ``mod(s, obj)`` | +-----------------------+-------------------------+---------------------------------+ Modified: python/branches/py3k/Doc/library/select.rst ============================================================================== --- python/branches/py3k/Doc/library/select.rst (original) +++ python/branches/py3k/Doc/library/select.rst Wed Jul 16 14:55:28 2008 @@ -330,7 +330,7 @@ +---------------------------+---------------------------------------------+ | :const:`KQ_EV_DISABLE` | Disablesevent | +---------------------------+---------------------------------------------+ - | :const:`KQ_EV_ONESHOT` | Removes event after first occurence | + | :const:`KQ_EV_ONESHOT` | Removes event after first occurrence | +---------------------------+---------------------------------------------+ | :const:`KQ_EV_CLEAR` | Reset the state after an event is retrieved | +---------------------------+---------------------------------------------+ @@ -365,7 +365,7 @@ +============================+============================================+ | :const:`KQ_NOTE_DELETE` | *unlink()* was called | +----------------------------+--------------------------------------------+ - | :const:`KQ_NOTE_WRITE` | a write occured | + | :const:`KQ_NOTE_WRITE` | a write occurred | +----------------------------+--------------------------------------------+ | :const:`KQ_NOTE_EXTEND` | the file was extended | +----------------------------+--------------------------------------------+ Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Wed Jul 16 14:55:28 2008 @@ -1565,7 +1565,7 @@ .. method:: isdisjoint(other) Return True if the set has no elements in common with *other*. Sets are - disjoint if and only if their interesection is the empty set. + disjoint if and only if their intersection is the empty set. .. method:: issubset(other) set <= other Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Wed Jul 16 14:55:28 2008 @@ -266,7 +266,7 @@ "noses " -Which is subsitituted into the string, yielding:: +Which is substituted into the string, yielding:: "A man with two noses " Modified: python/branches/py3k/Doc/library/sys.rst ============================================================================== --- python/branches/py3k/Doc/library/sys.rst (original) +++ python/branches/py3k/Doc/library/sys.rst Wed Jul 16 14:55:28 2008 @@ -54,19 +54,6 @@ A string containing the copyright pertaining to the Python interpreter. -.. function:: _compact_freelists() - - Compact the free list of floats by deallocating unused blocks. - It can reduce the memory usage of the Python process several tenth of - thousands of integers or floats have been allocated at once. - - The return value is a tuple of tuples each containing three elements, - amount of used objects, total block count before the blocks are deallocated - and amount of freed blocks. - - This function should be used for specialized purposes only. - - .. function:: _clear_type_cache() Clear the internal type cache. The type cache is used to speed up attribute Modified: python/branches/py3k/Doc/library/tkinter.tix.rst ============================================================================== --- python/branches/py3k/Doc/library/tkinter.tix.rst (original) +++ python/branches/py3k/Doc/library/tkinter.tix.rst Wed Jul 16 14:55:28 2008 @@ -305,8 +305,8 @@ .. \ulink{FileEntry}{http://tix.sourceforge.net/dist/current/demos/samples/FileEnt.tcl} -Hierachical ListBox -^^^^^^^^^^^^^^^^^^^ +Hierarchical ListBox +^^^^^^^^^^^^^^^^^^^^ .. class:: HList() Modified: python/branches/py3k/Doc/library/tkinter.turtle.rst ============================================================================== --- python/branches/py3k/Doc/library/tkinter.turtle.rst (original) +++ python/branches/py3k/Doc/library/tkinter.turtle.rst Wed Jul 16 14:55:28 2008 @@ -2,6 +2,10 @@ :mod:`turtle` --- Turtle graphics for Tk ======================================== +.. module:: tkinter.turtle + :synopsis: Turtle graphics for Tk +.. sectionauthor:: Gregor Lingl + Introduction ============ @@ -1251,7 +1255,7 @@ ... left(10) ... >>> for _ in range(8): - ... left(45); fd(2) # a regular octogon + ... left(45); fd(2) # a regular octagon Animation control @@ -1262,7 +1266,7 @@ :param delay: positive integer Set or return the drawing *delay* in milliseconds. (This is approximately - the time interval between two consecutived canvas updates.) The longer the + the time interval between two consecutive canvas updates.) The longer the drawing delay, the slower the animation. Optional argument: Modified: python/branches/py3k/Doc/library/urllib.request.rst ============================================================================== --- python/branches/py3k/Doc/library/urllib.request.rst (original) +++ python/branches/py3k/Doc/library/urllib.request.rst Wed Jul 16 14:55:28 2008 @@ -1062,7 +1062,7 @@ obtain the HTTP proxy's URL. This example replaces the default :class:`ProxyHandler` with one that uses -programatically-supplied proxy URLs, and adds proxy authorization support with +programmatically-supplied proxy URLs, and adds proxy authorization support with :class:`ProxyBasicAuthHandler`. :: proxy_handler = urllib.request.ProxyHandler({'http': 'http://www.example.com:3128/'}) Modified: python/branches/py3k/Doc/library/wsgiref.rst ============================================================================== --- python/branches/py3k/Doc/library/wsgiref.rst (original) +++ python/branches/py3k/Doc/library/wsgiref.rst Wed Jul 16 14:55:28 2008 @@ -413,7 +413,7 @@ from wsgiref.validate import validator from wsgiref.simple_server import make_server - # Our callable object which is intentionally not compilant to the + # Our callable object which is intentionally not compliant to the # standard, so the validator is going to break def simple_app(environ, start_response): status = '200 OK' # HTTP Status Modified: python/branches/py3k/Doc/library/xmlrpc.client.rst ============================================================================== --- python/branches/py3k/Doc/library/xmlrpc.client.rst (original) +++ python/branches/py3k/Doc/library/xmlrpc.client.rst Wed Jul 16 14:55:28 2008 @@ -344,7 +344,7 @@ try: proxy.add(2, 5) except xmlrpc.client.Fault, err: - print("A fault occured") + print("A fault occurred") print("Fault code: %d" % err.faultCode) print("Fault string: %s" % err.faultString) @@ -391,7 +391,7 @@ try: proxy.some_method() except xmlrpc.client.ProtocolError, err: - print("A protocol error occured") + print("A protocol error occurred") print("URL: %s" % err.url) print("HTTP/HTTPS headers: %s" % err.headers) print("Error code: %d" % err.errcode) Modified: python/branches/py3k/Doc/tutorial/stdlib2.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/stdlib2.rst (original) +++ python/branches/py3k/Doc/tutorial/stdlib2.rst Wed Jul 16 14:55:28 2008 @@ -286,7 +286,7 @@ performance trade-offs. The :mod:`array` module provides an :class:`array()` object that is like a list -that stores only homogenous data and stores it more compactly. The following +that stores only homogeneous data and stores it more compactly. The following example shows an array of numbers stored as two byte unsigned binary numbers (typecode ``"H"``) rather than the usual 16 bytes per entry for regular lists of python int objects:: Modified: python/branches/py3k/Doc/using/windows.rst ============================================================================== --- python/branches/py3k/Doc/using/windows.rst (original) +++ python/branches/py3k/Doc/using/windows.rst Wed Jul 16 14:55:28 2008 @@ -186,7 +186,7 @@ startup. You can also make all ``.py`` scripts execute with :program:`pythonw.exe`, -setting this through the usual facilites, for example (might require +setting this through the usual facilities, for example (might require administrative rights): #. Launch a command prompt. @@ -215,7 +215,7 @@ The `PyWin32 `_ module by Mark Hammond is a collection of modules for advanced Windows-specific support. This includes -utilites for: +utilities for: * `Component Object Model `_ (COM) * Win32 API calls Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Wed Jul 16 14:55:28 2008 @@ -51,7 +51,7 @@ This article explains the new features in Python 2.6. The release schedule is described in :pep:`361`; currently the final release is -scheduled for September 3 2008. +scheduled for October 1 2008. This article doesn't attempt to provide a complete specification of the new features, but instead provides a convenient overview. For @@ -526,28 +526,152 @@ PEP 371: The ``multiprocessing`` Package ===================================================== -.. XXX I think this still needs help - -:mod:`multiprocessing` makes it easy to distribute work over multiple processes. -Its API is similiar to that of :mod:`threading`. For example:: - - from multiprocessing import Process - - def long_hard_task(n): - print n * 43 - - for i in range(10): - Process(target=long_hard_task, args=(i)).start() +The new :mod:`multiprocessing` package lets Python programs create new +processes that will perform a computation and return a result to the +parent. The parent and child processes can communicate using queues +and pipes, synchronize their operations using locks and semaphores, +and can share simple arrays of data. + +The :mod:`multiprocessing` module started out as an exact emulation of +the :mod:`threading` module using processes instead of threads. That +goal was discarded along the path to Python 2.6, but the general +approach of the module is still similar. The fundamental class +is the :class:`Process`, which is passed a callable object and +a collection of arguments. The :meth:`start` method +sets the callable running in a subprocess, after which you can call +the :meth:`is_alive` method to check whether the subprocess is still running +and the :meth:`join` method to wait for the process to exit. + +Here's a simple example where the subprocess will calculate a +factorial. The function doing the calculation is a bit strange; it's +written to take significantly longer when the input argument is a +multiple of 4. + +:: + + import time + from multiprocessing import Process, Queue + + + def factorial(queue, N): + "Compute a factorial." + # If N is a multiple of 4, this function will take much longer. + if (N % 4) == 0: + time.sleep(.05 * N/4) + + # Calculate the result + fact = 1L + for i in range(1, N+1): + fact = fact * i + + # Put the result on the queue + queue.put(fact) + + if __name__ == '__main__': + queue = Queue() + + N = 5 + + p = Process(target=factorial, args=(queue, N)) + p.start() + p.join() + + result = queue.get() + print 'Factorial', N, '=', result + +A :class:`Queue` object is created and stored as a global. The child +process will use the value of the variable when the child was created; +because it's a :class:`Queue`, parent and child can use the object to +communicate. (If the parent were to change the value of the global +variable, the child's value would be unaffected, and vice versa.) + +Two other classes, :class:`Pool` and :class:`Manager`, provide +higher-level interfaces. :class:`Pool` will create a fixed number of +worker processes, and requests can then be distributed to the workers +by calling :meth:`apply` or `apply_async`, adding a single request, +and :meth:`map` or :meth:`map_async` to distribute a number of +requests. The following code uses a :class:`Pool` to spread requests +across 5 worker processes, receiving a list of results back. + +:: + + from multiprocessing import Pool + + p = Pool(5) + result = p.map(factorial, range(1, 1000, 10)) + for v in result: + print v + +This produces the following output:: + + 1 + 39916800 + 51090942171709440000 + 8222838654177922817725562880000000 + 33452526613163807108170062053440751665152000000000 + ... -will multiply the numbers between 0 and 10 times 43 and print out the result -concurrently. +The :class:`Manager` class creates a separate server process that can +hold master copies of Python data structures. Other processes can +then access and modify these data structures by using proxy objects. +The following example creates a shared dictionary by calling the +:meth:`dict` method; the worker processes then insert values into the +dictionary. (No locking is done automatically, which doesn't matter +in this example. :class:`Manager`'s methods also include +:meth:`Lock`, :meth:`RLock`, and :meth:`Semaphore` to create shared locks. + +:: + + import time + from multiprocessing import Pool, Manager + + def factorial(N, dictionary): + "Compute a factorial." + # Calculate the result + fact = 1L + for i in range(1, N+1): + fact = fact * i + + # Store result in dictionary + dictionary[N] = fact + + if __name__ == '__main__': + p = Pool(5) + mgr = Manager() + d = mgr.dict() # Create shared dictionary + + # Run tasks using the pool + for N in range(1, 1000, 10): + p.apply_async(factorial, (N, d)) + + # Mark pool as closed -- no more tasks can be added. + p.close() + + # Wait for tasks to exit + p.join() + + # Output results + for k, v in sorted(d.items()): + print k, v + +This will produce the output:: + + 1 1 + 11 39916800 + 21 51090942171709440000 + 31 8222838654177922817725562880000000 + 41 33452526613163807108170062053440751665152000000000 + 51 1551118753287382280224243016469303211063259720016986112000000000000 .. seealso:: + The documentation for the :mod:`multiprocessing` module. + :pep:`371` - Addition of the multiprocessing package PEP written by Jesse Noller and Richard Oudkerk; implemented by Richard Oudkerk and Jesse Noller. + .. ====================================================================== .. _pep-3101: @@ -1775,21 +1899,6 @@ (Contributed by Raymond Hettinger.) -* XXX Describe the new ctypes calling convention that allows safe - access to errno. - (Implemented by Thomas Heller; :issue:`1798`.) - -* The :mod:`ctypes` module now supports a :class:`c_bool` datatype - that represents the C99 ``bool`` type. (Contributed by David Remahl; - :issue:`1649190`.) - - The :mod:`ctypes` string, buffer and array types also have improved - support for extended slicing syntax, - where various combinations of ``(start, stop, step)`` are supplied. - (Implemented by Thomas Wouters.) - - .. Revision 57769 - * A new method in the :mod:`curses` module: for a window, :meth:`chgat` changes the display characters for a certain number of characters on a single line. (Contributed by Fabian Kreutz.) @@ -2628,6 +2737,45 @@ .. ====================================================================== +ctypes Enhancements +-------------------------------------------------- + +Thomas Heller continued to maintain and enhance the +:mod:`ctypes` module. + +:mod:`ctypes` now supports a :class:`c_bool` datatype +that represents the C99 ``bool`` type. (Contributed by David Remahl; +:issue:`1649190`.) + +The :mod:`ctypes` string, buffer and array types have improved +support for extended slicing syntax, +where various combinations of ``(start, stop, step)`` are supplied. +(Implemented by Thomas Wouters.) + +.. Revision 57769 + +A new calling convention tells :mod:`ctypes` to clear the ``errno`` or +Win32 LastError variables at the outset of each wrapped call. +(Implemented by Thomas Heller; :issue:`1798`.) + +For the Unix ``errno`` variable: when creating a wrapped function, +you can supply ``use_errno=True`` as a keyword parameter +to the :func:`DLL` function +and then call the module-level methods :meth:`set_errno` +and :meth:`get_errno` to set and retrieve the error value. + +The Win32 LastError variable is supported similarly by +the :func:`DLL`, :func:`OleDLL`, and :func:`WinDLL` functions. +You supply ``use_last_error=True`` as a keyword parameter +and then call the module-level methods :meth:`set_last_error` +and :meth:`get_last_error`. + +The :func:`byref` function, used to retrieve a pointer to a ctypes +instance, now has an optional **offset** parameter that is a byte +count that will be added to the returned pointer. + +.. ====================================================================== + Improved SSL Support -------------------------------------------------- Modified: python/branches/py3k/Include/floatobject.h ============================================================================== --- python/branches/py3k/Include/floatobject.h (original) +++ python/branches/py3k/Include/floatobject.h Wed Jul 16 14:55:28 2008 @@ -103,7 +103,7 @@ PyAPI_FUNC(double) _PyFloat_Unpack8(const unsigned char *p, int le); /* free list api */ -PyAPI_FUNC(void) PyFloat_CompactFreeList(size_t *, size_t *, size_t *); +PyAPI_FUNC(int) PyFloat_ClearFreeList(void); /* Format the object based on the format_spec, as defined in PEP 3101 (Advanced String Formatting). */ Modified: python/branches/py3k/Include/object.h ============================================================================== --- python/branches/py3k/Include/object.h (original) +++ python/branches/py3k/Include/object.h Wed Jul 16 14:55:28 2008 @@ -695,9 +695,9 @@ #define Py_CLEAR(op) \ do { \ if (op) { \ - PyObject *tmp = (PyObject *)(op); \ + PyObject *_py_tmp = (PyObject *)(op); \ (op) = NULL; \ - Py_DECREF(tmp); \ + Py_DECREF(_py_tmp); \ } \ } while (0) Modified: python/branches/py3k/Include/traceback.h ============================================================================== --- python/branches/py3k/Include/traceback.h (original) +++ python/branches/py3k/Include/traceback.h Wed Jul 16 14:55:28 2008 @@ -19,7 +19,7 @@ PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *); PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *); -PyAPI_FUNC(int) Py_DisplaySourceLine(PyObject *, const char *, int, int); +PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, const char *, int, int); /* Reveal traceback type so we can typecheck traceback objects */ PyAPI_DATA(PyTypeObject) PyTraceBack_Type; Modified: python/branches/py3k/Lib/bisect.py ============================================================================== --- python/branches/py3k/Lib/bisect.py (original) +++ python/branches/py3k/Lib/bisect.py Wed Jul 16 14:55:28 2008 @@ -9,6 +9,8 @@ slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -30,6 +32,8 @@ slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -49,6 +53,8 @@ slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: @@ -69,6 +75,8 @@ slice of a to be searched. """ + if lo < 0: + raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo < hi: Modified: python/branches/py3k/Lib/fractions.py ============================================================================== --- python/branches/py3k/Lib/fractions.py (original) +++ python/branches/py3k/Lib/fractions.py Wed Jul 16 14:55:28 2008 @@ -108,7 +108,9 @@ Beware that Fraction.from_float(0.3) != Fraction(3, 10). """ - if not isinstance(f, float): + if isinstance(f, numbers.Integral): + f = float(f) + elif not isinstance(f, float): raise TypeError("%s.from_float() only takes floats, not %r (%s)" % (cls.__name__, f, type(f).__name__)) if math.isnan(f) or math.isinf(f): @@ -119,7 +121,9 @@ def from_decimal(cls, dec): """Converts a finite Decimal instance to a rational number, exactly.""" from decimal import Decimal - if not isinstance(dec, Decimal): + if isinstance(dec, numbers.Integral): + dec = Decimal(int(dec)) + elif not isinstance(dec, Decimal): raise TypeError( "%s.from_decimal() only takes Decimals, not %r (%s)" % (cls.__name__, dec, type(dec).__name__)) Modified: python/branches/py3k/Lib/multiprocessing/connection.py ============================================================================== --- python/branches/py3k/Lib/multiprocessing/connection.py (original) +++ python/branches/py3k/Lib/multiprocessing/connection.py Wed Jul 16 14:55:28 2008 @@ -222,11 +222,9 @@ self._family = family self._last_accepted = None - sub_debug('listener bound to address %r', self._address) - if family == 'AF_UNIX': self._unlink = Finalize( - self, os.unlink, args=(self._address,), exitpriority=0 + self, os.unlink, args=(address,), exitpriority=0 ) else: self._unlink = None Modified: python/branches/py3k/Lib/shutil.py ============================================================================== --- python/branches/py3k/Lib/shutil.py (original) +++ python/branches/py3k/Lib/shutil.py Wed Jul 16 14:55:28 2008 @@ -8,6 +8,7 @@ import sys import stat from os.path import abspath +import fnmatch __all__ = ["copyfileobj","copyfile","copymode","copystat","copy","copy2", "copytree","move","rmtree","Error"] @@ -93,8 +94,19 @@ copyfile(src, dst) copystat(src, dst) +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. -def copytree(src, dst, symlinks=False): + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None): """Recursively copy a directory tree using copy2(). The destination directory must not already exist. @@ -105,13 +117,32 @@ it is false, the contents of the files pointed to by symbolic links are copied. + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + XXX Consider this example code rather than the ultimate tool. """ names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + os.makedirs(dst) errors = [] for name in names: + if name in ignored_names: + continue srcname = os.path.join(src, name) dstname = os.path.join(dst, name) try: @@ -119,7 +150,7 @@ linkto = os.readlink(srcname) os.symlink(linkto, dstname) elif os.path.isdir(srcname): - copytree(srcname, dstname, symlinks) + copytree(srcname, dstname, symlinks, ignore) else: copy2(srcname, dstname) # XXX What about devices, sockets etc.? Modified: python/branches/py3k/Lib/test/test_bisect.py ============================================================================== --- python/branches/py3k/Lib/test/test_bisect.py (original) +++ python/branches/py3k/Lib/test/test_bisect.py Wed Jul 16 14:55:28 2008 @@ -114,6 +114,14 @@ self.assertEqual(func(data, elem), expected) self.assertEqual(func(UserList(data), elem), expected) + def test_negative_lo(self): + # Issue 3301 + mod = self.module + self.assertRaises(ValueError, mod.bisect_left, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.bisect_right, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.insort_left, [1, 2, 3], 5, -1, 3), + self.assertRaises(ValueError, mod.insort_right, [1, 2, 3], 5, -1, 3), + def test_random(self, n=25): from random import randrange for i in range(n): Modified: python/branches/py3k/Lib/test/test_float.py ============================================================================== --- python/branches/py3k/Lib/test/test_float.py (original) +++ python/branches/py3k/Lib/test/test_float.py Wed Jul 16 14:55:28 2008 @@ -284,24 +284,36 @@ floats_file.close() # Beginning with Python 2.6 float has cross platform compatible -# ways to create and representate inf and nan +# ways to create and represent inf and nan class InfNanTest(unittest.TestCase): def test_inf_from_str(self): self.assert_(isinf(float("inf"))) self.assert_(isinf(float("+inf"))) self.assert_(isinf(float("-inf"))) + self.assert_(isinf(float("infinity"))) + self.assert_(isinf(float("+infinity"))) + self.assert_(isinf(float("-infinity"))) self.assertEqual(repr(float("inf")), "inf") self.assertEqual(repr(float("+inf")), "inf") self.assertEqual(repr(float("-inf")), "-inf") + self.assertEqual(repr(float("infinity")), "inf") + self.assertEqual(repr(float("+infinity")), "inf") + self.assertEqual(repr(float("-infinity")), "-inf") self.assertEqual(repr(float("INF")), "inf") self.assertEqual(repr(float("+Inf")), "inf") self.assertEqual(repr(float("-iNF")), "-inf") + self.assertEqual(repr(float("Infinity")), "inf") + self.assertEqual(repr(float("+iNfInItY")), "inf") + self.assertEqual(repr(float("-INFINITY")), "-inf") self.assertEqual(str(float("inf")), "inf") self.assertEqual(str(float("+inf")), "inf") self.assertEqual(str(float("-inf")), "-inf") + self.assertEqual(str(float("infinity")), "inf") + self.assertEqual(str(float("+infinity")), "inf") + self.assertEqual(str(float("-infinity")), "-inf") self.assertRaises(ValueError, float, "info") self.assertRaises(ValueError, float, "+info") @@ -309,6 +321,10 @@ self.assertRaises(ValueError, float, "in") self.assertRaises(ValueError, float, "+in") self.assertRaises(ValueError, float, "-in") + self.assertRaises(ValueError, float, "infinit") + self.assertRaises(ValueError, float, "+Infin") + self.assertRaises(ValueError, float, "-INFI") + self.assertRaises(ValueError, float, "infinitys") def test_inf_as_str(self): self.assertEqual(repr(1e300 * 1e300), "inf") Modified: python/branches/py3k/Lib/test/test_fractions.py ============================================================================== --- python/branches/py3k/Lib/test/test_fractions.py (original) +++ python/branches/py3k/Lib/test/test_fractions.py Wed Jul 16 14:55:28 2008 @@ -134,10 +134,8 @@ self.assertNotEquals(F(4, 2), r) def testFromFloat(self): - self.assertRaisesMessage( - TypeError, "Fraction.from_float() only takes floats, not 3 (int)", - F.from_float, 3) - + self.assertRaises(TypeError, F.from_float, 3+4j) + self.assertEquals((10, 1), _components(F.from_float(10))) self.assertEquals((0, 1), _components(F.from_float(-0.0))) self.assertEquals((10, 1), _components(F.from_float(10.0))) self.assertEquals((-5, 2), _components(F.from_float(-2.5))) @@ -161,10 +159,8 @@ F.from_float, nan) def testFromDecimal(self): - self.assertRaisesMessage( - TypeError, - "Fraction.from_decimal() only takes Decimals, not 3 (int)", - F.from_decimal, 3) + self.assertRaises(TypeError, F.from_decimal, 3+4j) + self.assertEquals(F(10, 1), F.from_decimal(10)) self.assertEquals(F(0), F.from_decimal(Decimal("-0"))) self.assertEquals(F(5, 10), F.from_decimal(Decimal("0.5"))) self.assertEquals(F(5, 1000), F.from_decimal(Decimal("5e-3"))) Modified: python/branches/py3k/Lib/test/test_import.py ============================================================================== --- python/branches/py3k/Lib/test/test_import.py (original) +++ python/branches/py3k/Lib/test/test_import.py Wed Jul 16 14:55:28 2008 @@ -1,5 +1,3 @@ -from test.support import TESTFN, run_unittest, catch_warning - import unittest import os import random @@ -8,7 +6,7 @@ import py_compile import warnings import imp -from test.support import unlink, TESTFN, unload +from test.support import unlink, TESTFN, unload, run_unittest, catch_warning def remove_files(name): @@ -267,6 +265,25 @@ from . import relimport self.assertTrue(hasattr(relimport, "RelativeImport")) + def test_issue3221(self): + def check_relative(): + exec("from . import relimport", ns) + # Check both OK with __package__ and __name__ correct + ns = dict(__package__='test', __name__='test.notarealmodule') + check_relative() + # Check both OK with only __name__ wrong + ns = dict(__package__='test', __name__='notarealpkg.notarealmodule') + check_relative() + # Check relative fails with only __package__ wrong + ns = dict(__package__='foo', __name__='test.notarealmodule') + self.assertRaises(SystemError, check_relative) + # Check relative fails with __package__ and __name__ wrong + ns = dict(__package__='foo', __name__='notarealpkg.notarealmodule') + self.assertRaises(SystemError, check_relative) + # Check both fail with package set to a non-string + ns = dict(__package__=object()) + self.assertRaises(ValueError, check_relative) + def test_main(verbose=None): run_unittest(ImportTest, PathsTests, RelativeImport) Modified: python/branches/py3k/Lib/test/test_shutil.py ============================================================================== --- python/branches/py3k/Lib/test/test_shutil.py (original) +++ python/branches/py3k/Lib/test/test_shutil.py Wed Jul 16 14:55:28 2008 @@ -108,6 +108,82 @@ if os.path.exists(path): shutil.rmtree(path) + def test_copytree_with_exclude(self): + + def write_data(path, data): + f = open(path, "w") + f.write(data) + f.close() + + def read_data(path): + f = open(path) + data = f.read() + f.close() + return data + + # creating data + join = os.path.join + exists = os.path.exists + src_dir = tempfile.mkdtemp() + dst_dir = join(tempfile.mkdtemp(), 'destination') + write_data(join(src_dir, 'test.txt'), '123') + write_data(join(src_dir, 'test.tmp'), '123') + os.mkdir(join(src_dir, 'test_dir')) + write_data(join(src_dir, 'test_dir', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2')) + write_data(join(src_dir, 'test_dir2', 'test.txt'), '456') + os.mkdir(join(src_dir, 'test_dir2', 'subdir')) + os.mkdir(join(src_dir, 'test_dir2', 'subdir2')) + write_data(join(src_dir, 'test_dir2', 'subdir', 'test.txt'), '456') + write_data(join(src_dir, 'test_dir2', 'subdir2', 'test.py'), '456') + + + # testing glob-like patterns + try: + patterns = shutil.ignore_patterns('*.tmp', 'test_dir2') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assert_(exists(join(dst_dir, 'test.txt'))) + self.assert_(not exists(join(dst_dir, 'test.tmp'))) + self.assert_(not exists(join(dst_dir, 'test_dir2'))) + finally: + if os.path.exists(dst_dir): + shutil.rmtree(dst_dir) + try: + patterns = shutil.ignore_patterns('*.tmp', 'subdir*') + shutil.copytree(src_dir, dst_dir, ignore=patterns) + # checking the result: some elements should not be copied + self.assert_(not exists(join(dst_dir, 'test.tmp'))) + self.assert_(not exists(join(dst_dir, 'test_dir2', 'subdir2'))) + self.assert_(not exists(join(dst_dir, 'test_dir2', 'subdir'))) + finally: + if os.path.exists(dst_dir): + shutil.rmtree(dst_dir) + + # testing callable-style + try: + def _filter(src, names): + res = [] + for name in names: + path = os.path.join(src, name) + + if (os.path.isdir(path) and + path.split()[-1] == 'subdir'): + res.append(name) + elif os.path.splitext(path)[-1] in ('.py'): + res.append(name) + return res + + shutil.copytree(src_dir, dst_dir, ignore=_filter) + + # checking the result: some elements should not be copied + self.assert_(not exists(join(dst_dir, 'test_dir2', 'subdir2', + 'test.py'))) + self.assert_(not exists(join(dst_dir, 'test_dir2', 'subdir'))) + + finally: + if os.path.exists(dst_dir): + shutil.rmtree(dst_dir) if hasattr(os, "symlink"): def test_dont_copy_file_onto_link_to_itself(self): Modified: python/branches/py3k/Lib/zipfile.py ============================================================================== --- python/branches/py3k/Lib/zipfile.py (original) +++ python/branches/py3k/Lib/zipfile.py Wed Jul 16 14:55:28 2008 @@ -45,9 +45,9 @@ # The "end of central directory" structure, magic number, size, and indices # (section V.I in the format document) -structEndCentDir = b"<4s4H2LH" -magicEndCentDir = b"PK\005\006" -sizeEndCentDir = struct.calcsize(structEndCentDir) +structEndArchive = b"<4s4H2LH" +stringEndArchive = b"PK\005\006" +sizeEndCentDir = struct.calcsize(structEndArchive) _ECD_SIGNATURE = 0 _ECD_DISK_NUMBER = 1 @@ -65,37 +65,9 @@ # The "central directory" structure, magic number, size, and indices # of entries in the structure (section V.F in the format document) structCentralDir = "<4s4B4HL2L5H2L" -magicCentralDir = b"PK\001\002" +stringCentralDir = b"PK\001\002" sizeCentralDir = struct.calcsize(structCentralDir) -# The "local file header" structure, magic number, size, and indices -# (section V.A in the format document) -structFileHeader = "<4s2B4HL2L2H" -magicFileHeader = b"PK\003\004" -sizeFileHeader = struct.calcsize(structFileHeader) - -# The "Zip64 end of central directory locator" structure, magic number, and size -structEndCentDir64Locator = "<4sLQL" -magicEndCentDir64Locator = b"PK\x06\x07" -sizeEndCentDir64Locator = struct.calcsize(structEndCentDir64Locator) - -# The "Zip64 end of central directory" record, magic number, size, and indices -# (section V.G in the format document) -structEndCentDir64 = "<4sQ2H2L4Q" -magicEndCentDir64 = b"PK\x06\x06" -sizeEndCentDir64 = struct.calcsize(structEndCentDir64) - -_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 - # indexes of entries in the central directory structure _CD_SIGNATURE = 0 _CD_CREATE_VERSION = 1 @@ -120,7 +92,7 @@ # The "local file header" structure, magic number, size, and indices # (section V.A in the format document) structFileHeader = "<4s2B4HL2L2H" -magicFileHeader = b"PK\003\004" +stringFileHeader = b"PK\003\004" sizeFileHeader = struct.calcsize(structFileHeader) _FH_SIGNATURE = 0 @@ -137,15 +109,15 @@ _FH_EXTRA_FIELD_LENGTH = 11 # The "Zip64 end of central directory locator" structure, magic number, and size -structEndCentDir64Locator = "<4sLQL" -magicEndCentDir64Locator = b"PK\x06\x07" -sizeEndCentDir64Locator = struct.calcsize(structEndCentDir64Locator) +structEndArchive64Locator = "<4sLQL" +stringEndArchive64Locator = b"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) -structEndCentDir64 = "<4sQ2H2L4Q" -magicEndCentDir64 = b"PK\x06\x06" -sizeEndCentDir64 = struct.calcsize(structEndCentDir64) +structEndArchive64 = "<4sQ2H2L4Q" +stringEndArchive64 = b"PK\x06\x06" +sizeEndCentDir64 = struct.calcsize(structEndArchive64) _CD64_SIGNATURE = 0 _CD64_DIRECTORY_RECSIZE = 1 @@ -176,8 +148,8 @@ """ fpin.seek(offset - sizeEndCentDir64Locator, 2) data = fpin.read(sizeEndCentDir64Locator) - sig, diskno, reloff, disks = struct.unpack(structEndCentDir64Locator, data) - if sig != magicEndCentDir64Locator: + sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data) + if sig != stringEndArchive64Locator: return endrec if diskno != 0 or disks != 1: @@ -188,8 +160,8 @@ data = fpin.read(sizeEndCentDir64) sig, sz, create_version, read_version, disk_num, disk_dir, \ dircount, dircount2, dirsize, diroffset = \ - struct.unpack(structEndCentDir64, data) - if sig != magicEndCentDir64: + struct.unpack(structEndArchive64, data) + if sig != stringEndArchive64: return endrec # Update the original endrec using data from the ZIP64 record @@ -217,9 +189,9 @@ # file if this is the case). fpin.seek(-sizeEndCentDir, 2) data = fpin.read() - if data[0:4] == magicEndCentDir and data[-2:] == b"\000\000": + if data[0:4] == stringEndArchive and data[-2:] == b"\000\000": # the signature is correct and there's no comment, unpack structure - endrec = struct.unpack(structEndCentDir, data) + endrec = struct.unpack(structEndArchive, data) endrec=list(endrec) # Append a blank comment and record start offset @@ -241,11 +213,11 @@ maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0) fpin.seek(maxCommentStart, 0) data = fpin.read() - start = data.rfind(magicEndCentDir) + start = data.rfind(stringEndArchive) if start >= 0: # found the magic number; attempt to unpack and interpret recData = data[start:start+sizeEndCentDir] - endrec = list(struct.unpack(structEndCentDir, recData)) + endrec = list(struct.unpack(structEndArchive, recData)) comment = data[start+sizeEndCentDir:] # check that comment length is correct if endrec[_ECD_COMMENT_SIZE] == len(comment): @@ -352,7 +324,7 @@ self.create_version = max(45, self.extract_version) filename, flag_bits = self._encodeFilenameFlags() - header = struct.pack(structFileHeader, magicFileHeader, + header = struct.pack(structFileHeader, stringFileHeader, self.extract_version, self.reserved, flag_bits, self.compress_type, dostime, dosdate, CRC, compress_size, file_size, @@ -777,7 +749,7 @@ total = 0 while total < size_cd: centdir = fp.read(sizeCentralDir) - if centdir[0:4] != magicCentralDir: + if centdir[0:4] != stringCentralDir: raise BadZipfile("Bad magic number for central directory") centdir = struct.unpack(structCentralDir, centdir) if self.debug > 2: @@ -892,7 +864,7 @@ # Skip the file header: fheader = zef_file.read(sizeFileHeader) - if fheader[0:4] != magicFileHeader: + if fheader[0:4] != stringFileHeader: raise BadZipfile("Bad magic number for file header") fheader = struct.unpack(structFileHeader, fheader) @@ -1184,7 +1156,7 @@ try: filename, flag_bits = zinfo._encodeFilenameFlags() centdir = struct.pack(structCentralDir, - magicCentralDir, create_version, + stringCentralDir, create_version, zinfo.create_system, extract_version, zinfo.reserved, flag_bits, zinfo.compress_type, dostime, dosdate, zinfo.CRC, compress_size, file_size, @@ -1212,13 +1184,13 @@ if pos1 > ZIP64_LIMIT: # Need to write the ZIP64 end-of-archive records zip64endrec = struct.pack( - structEndCentDir64, magicEndCentDir64, + structEndArchive64, stringEndArchive64, 44, 45, 45, 0, 0, count, count, pos2 - pos1, pos1) self.fp.write(zip64endrec) zip64locrec = struct.pack( - structEndCentDir64Locator, - magicEndCentDir64Locator, 0, pos2, 1) + structEndArchive64Locator, + stringEndArchive64Locator, 0, pos2, 1) self.fp.write(zip64locrec) centDirOffset = 0xFFFFFFFF @@ -1229,7 +1201,7 @@ % ZIP_MAX_COMMENT self.comment = self.comment[:ZIP_MAX_COMMENT] - endrec = struct.pack(structEndCentDir, magicEndCentDir, + endrec = struct.pack(structEndArchive, stringEndArchive, 0, 0, count % ZIP_FILECOUNT_LIMIT, count % ZIP_FILECOUNT_LIMIT, pos2 - pos1, centDirOffset, len(self.comment)) Modified: python/branches/py3k/Misc/ACKS ============================================================================== --- python/branches/py3k/Misc/ACKS (original) +++ python/branches/py3k/Misc/ACKS Wed Jul 16 14:55:28 2008 @@ -460,6 +460,7 @@ Mike Meyer Steven Miale Trent Mick +Aristotelis Mikropoulos Damien Miller Chad Miller Jay T. Miller Modified: python/branches/py3k/Modules/_bisectmodule.c ============================================================================== --- python/branches/py3k/Modules/_bisectmodule.c (original) +++ python/branches/py3k/Modules/_bisectmodule.c Wed Jul 16 14:55:28 2008 @@ -11,6 +11,10 @@ PyObject *litem; Py_ssize_t mid, res; + if (lo < 0) { + PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); + return -1; + } if (hi == -1) { hi = PySequence_Size(list); if (hi < 0) @@ -108,6 +112,10 @@ PyObject *litem; int mid, res; + if (lo < 0) { + PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); + return -1; + } if (hi == -1) { hi = PySequence_Size(list); if (hi < 0) Modified: python/branches/py3k/Modules/gcmodule.c ============================================================================== --- python/branches/py3k/Modules/gcmodule.c (original) +++ python/branches/py3k/Modules/gcmodule.c Wed Jul 16 14:55:28 2008 @@ -706,6 +706,7 @@ (void)PyCFunction_ClearFreeList(); (void)PyTuple_ClearFreeList(); (void)PyUnicode_ClearFreeList(); + (void)PyFloat_ClearFreeList(); } /* This is the main function. Read this to understand how the Modified: python/branches/py3k/Modules/posixmodule.c ============================================================================== --- python/branches/py3k/Modules/posixmodule.c (original) +++ python/branches/py3k/Modules/posixmodule.c Wed Jul 16 14:55:28 2008 @@ -3638,7 +3638,8 @@ pid_t pid = fork1(); if (pid == -1) return posix_error(); - PyOS_AfterFork(); + if (pid == 0) + PyOS_AfterFork(); return PyLong_FromLong(pid); } #endif Modified: python/branches/py3k/Objects/floatobject.c ============================================================================== --- python/branches/py3k/Objects/floatobject.c (original) +++ python/branches/py3k/Objects/floatobject.c Wed Jul 16 14:55:28 2008 @@ -225,6 +225,9 @@ if (PyOS_strnicmp(p, "inf", 4) == 0) { Py_RETURN_INF(sign); } + if (PyOS_strnicmp(p, "infinity", 9) == 0) { + Py_RETURN_INF(sign); + } #ifdef Py_NAN if(PyOS_strnicmp(p, "nan", 4) == 0) { Py_RETURN_NAN; @@ -1903,30 +1906,28 @@ PyStructSequence_InitType(&FloatInfoType, &floatinfo_desc); } -void -PyFloat_CompactFreeList(size_t *pbc, size_t *pbf, size_t *bsum) +int +PyFloat_ClearFreeList(void) { PyFloatObject *p; PyFloatBlock *list, *next; - unsigned i; - size_t bc = 0, bf = 0; /* block count, number of freed blocks */ - size_t fsum = 0; /* total unfreed ints */ - int frem; /* remaining unfreed ints per block */ + int i; + int u; /* remaining unfreed ints per block */ + int freelist_size = 0; list = block_list; block_list = NULL; free_list = NULL; while (list != NULL) { - bc++; - frem = 0; + u = 0; for (i = 0, p = &list->objects[0]; i < N_FLOATOBJECTS; i++, p++) { if (PyFloat_CheckExact(p) && Py_REFCNT(p) != 0) - frem++; + u++; } next = list->next; - if (frem) { + if (u) { list->next = block_list; block_list = list; for (i = 0, p = &list->objects[0]; @@ -1941,15 +1942,12 @@ } } else { - PyMem_FREE(list); /* XXX PyObject_FREE ??? */ - bf++; + PyMem_FREE(list); } - fsum += frem; + freelist_size += u; list = next; } - *pbc = bc; - *pbf = bf; - *bsum = fsum; + return freelist_size; } void @@ -1957,25 +1955,21 @@ { PyFloatObject *p; PyFloatBlock *list; - unsigned i; - size_t bc, bf; /* block count, number of freed blocks */ - size_t fsum; /* total unfreed floats per block */ + int i; + int u; /* total unfreed floats per block */ - PyFloat_CompactFreeList(&bc, &bf, &fsum); + u = PyFloat_ClearFreeList(); if (!Py_VerboseFlag) return; fprintf(stderr, "# cleanup floats"); - if (!fsum) { + if (!u) { fprintf(stderr, "\n"); } else { fprintf(stderr, - ": %" PY_FORMAT_SIZE_T "d unfreed float%s in %" - PY_FORMAT_SIZE_T "d out of %" - PY_FORMAT_SIZE_T "d block%s\n", - fsum, fsum == 1 ? "" : "s", - bc - bf, bc, bc == 1 ? "" : "s"); + ": %d unfreed float%s\n", + u, u == 1 ? "" : "s"); } if (Py_VerboseFlag > 1) { list = block_list; Modified: python/branches/py3k/Python/_warnings.c ============================================================================== --- python/branches/py3k/Python/_warnings.c (original) +++ python/branches/py3k/Python/_warnings.c Wed Jul 16 14:55:28 2008 @@ -266,7 +266,8 @@ PyFile_WriteString("\n", f_stderr); } else - Py_DisplaySourceLine(f_stderr, PyUnicode_AsString(filename), lineno, 2); + _Py_DisplaySourceLine(f_stderr, PyUnicode_AsString(filename), + lineno, 2); PyErr_Clear(); } Modified: python/branches/py3k/Python/import.c ============================================================================== --- python/branches/py3k/Python/import.c (original) +++ python/branches/py3k/Python/import.c Wed Jul 16 14:55:28 2008 @@ -2162,6 +2162,7 @@ static PyObject *pathstr = NULL; static PyObject *pkgstr = NULL; PyObject *pkgname, *modname, *modpath, *modules, *parent; + int orig_level = level; if (globals == NULL || !PyDict_Check(globals) || !level) return Py_None; @@ -2292,9 +2293,27 @@ modules = PyImport_GetModuleDict(); parent = PyDict_GetItemString(modules, buf); - if (parent == NULL) - PyErr_Format(PyExc_SystemError, - "Parent module '%.200s' not loaded", buf); + if (parent == NULL) { + if (orig_level < 1) { + PyObject *err_msg = PyBytes_FromFormat( + "Parent module '%.200s' not found " + "while handling absolute import", buf); + if (err_msg == NULL) { + return NULL; + } + if (!PyErr_WarnEx(PyExc_RuntimeWarning, + PyBytes_AsString(err_msg), 1)) { + *buf = '\0'; + *p_buflen = 0; + parent = Py_None; + } + Py_DECREF(err_msg); + } else { + PyErr_Format(PyExc_SystemError, + "Parent module '%.200s' not loaded, " + "cannot perform relative import", buf); + } + } return parent; /* We expect, but can't guarantee, if parent != None, that: - parent.__name__ == buf Modified: python/branches/py3k/Python/sysmodule.c ============================================================================== --- python/branches/py3k/Python/sysmodule.c (original) +++ python/branches/py3k/Python/sysmodule.c Wed Jul 16 14:55:28 2008 @@ -824,29 +824,12 @@ Clear the internal type lookup cache."); -static PyObject * -sys_compact_freelists(PyObject* self, PyObject* args) -{ - size_t fsum, fbc, fbf; - - PyFloat_CompactFreeList(&fbc, &fbf, &fsum); - - return Py_BuildValue("((kkk))", fsum, fbc, fbf); - -} - -PyDoc_STRVAR(sys_compact_freelists__doc__, -"_compact_freelists() -> ((remaing_objects, total_blocks, freed_blocks),)\n\ -Compact the free lists of floats."); - static PyMethodDef sys_methods[] = { /* Might as well keep this in alphabetic order */ {"callstats", (PyCFunction)PyEval_GetCallStats, METH_NOARGS, callstats_doc}, {"_clear_type_cache", sys_clear_type_cache, METH_NOARGS, sys_clear_type_cache__doc__}, - {"_compact_freelists", sys_compact_freelists, METH_NOARGS, - sys_compact_freelists__doc__}, {"_current_frames", sys_current_frames, METH_NOARGS, current_frames_doc}, {"displayhook", sys_displayhook, METH_O, displayhook_doc}, Modified: python/branches/py3k/Python/traceback.c ============================================================================== --- python/branches/py3k/Python/traceback.c (original) +++ python/branches/py3k/Python/traceback.c Wed Jul 16 14:55:28 2008 @@ -129,7 +129,7 @@ } int -Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno, int indent) +_Py_DisplaySourceLine(PyObject *f, const char *filename, int lineno, int indent) { int err = 0; FILE *xfp = NULL; @@ -241,7 +241,7 @@ err = PyFile_WriteString(linebuf, f); if (err != 0) return err; - return Py_DisplaySourceLine(f, filename, lineno, 4); + return _Py_DisplaySourceLine(f, filename, lineno, 4); } static int Modified: python/branches/py3k/Tools/faqwiz/move-faqwiz.sh ============================================================================== --- python/branches/py3k/Tools/faqwiz/move-faqwiz.sh (original) +++ python/branches/py3k/Tools/faqwiz/move-faqwiz.sh Wed Jul 16 14:55:28 2008 @@ -9,7 +9,7 @@ # blackjesus:~> ./move-faqwiz.sh 2\.1 3\.2 # Moving FAQ question 02.001 to 03.002 -if [ x$2 == x ]; then +if [ x$2 = x ]; then echo "Need 2 args: original_version final_version." exit 2 fi @@ -19,7 +19,7 @@ exit 2 fi -function cut_n_pad() { +cut_n_pad() { t=`echo $1 | cut -d. -f $2` export $3=`echo $t | awk "{ tmp = \\$0; l = length(tmp); for (i = 0; i < $2-l+1; i++) { tmp = "0".tmp } print tmp }"` } @@ -28,7 +28,13 @@ cut_n_pad $1 2 suffix1 cut_n_pad $2 1 prefix2 cut_n_pad $2 2 suffix2 -tmpfile=tmp$RANDOM.tmp +if which tempfile >/dev/null; then + tmpfile=$(tempfile -d .) +elif [ -n "$RANDOM" ]; then + tmpfile=tmp$RANDOM.tmp +else + tmpfile=tmp$$.tmp +fi file1=faq$prefix1.$suffix1.htp file2=faq$prefix2.$suffix2.htp From python-3000-checkins at python.org Wed Jul 16 14:58:30 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 14:58:30 +0200 (CEST) Subject: [Python-3000-checkins] r65011 - in python/branches/py3k: Doc/library/stdtypes.rst Misc/ACKS Misc/developers.txt Message-ID: <20080716125830.65FE71E4003@bag.python.org> Author: georg.brandl Date: Wed Jul 16 14:58:29 2008 New Revision: 65011 Log: Merged revisions 64982-64983,65004 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r64982 | georg.brandl | 2008-07-16 01:59:15 +0200 (Wed, 16 Jul 2008) | 2 lines Move label to correct heading. ........ r64983 | georg.brandl | 2008-07-16 02:00:04 +0200 (Wed, 16 Jul 2008) | 2 lines Keep sorted. ........ r65004 | martin.v.loewis | 2008-07-16 07:28:26 +0200 (Wed, 16 Jul 2008) | 2 lines Add Antoine. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Misc/ACKS python/branches/py3k/Misc/developers.txt Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Wed Jul 16 14:58:29 2008 @@ -421,9 +421,6 @@ overflow check. -.. _typeiter: - - Additional Methods on Float --------------------------- @@ -488,6 +485,8 @@ '0x1.d380000000000p+11' +.. _typeiter: + Iterator Types ============== Modified: python/branches/py3k/Misc/ACKS ============================================================================== --- python/branches/py3k/Misc/ACKS (original) +++ python/branches/py3k/Misc/ACKS Wed Jul 16 14:58:29 2008 @@ -216,6 +216,7 @@ Matt Fleming Hern?n Mart?nez Foffani Michael Foord +Amaury Forgeot d'Arc Doug Fort John Fouhy Martin Franklin @@ -658,6 +659,7 @@ Oliver Steele Greg Stein Chris Stern +Victor Stinner Richard Stoakley Peter Stoehr Casper Stoel @@ -770,7 +772,5 @@ Mike Zarnstorff Siebren van der Zee Uwe Zessin -Amaury Forgeot d'Arc -Peter ?strand Tarek Ziad? -Victor Stinner +Peter ?strand Modified: python/branches/py3k/Misc/developers.txt ============================================================================== --- python/branches/py3k/Misc/developers.txt (original) +++ python/branches/py3k/Misc/developers.txt Wed Jul 16 14:58:29 2008 @@ -17,6 +17,9 @@ Permissions History ------------------- +- Antoine Pitrou was given SVN access on July 16 2008, by recommendation + from GvR, for general contributions to Python. + - Jesse Noller was given SVN access on 16 June 2008 by Georg Brandl, for work on the multiprocessing module. From python-3000-checkins at python.org Wed Jul 16 19:04:41 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 19:04:41 +0200 (CEST) Subject: [Python-3000-checkins] r65021 - python/branches/py3k Message-ID: <20080716170441.471E41E4003@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 19:04:41 2008 New Revision: 65021 Log: Blocked revisions 65020 via svnmerge ........ r65020 | benjamin.peterson | 2008-07-16 12:03:06 -0500 (Wed, 16 Jul 2008) | 1 line lib2to3 isn't broken anymore, so we can run the test ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 16 20:44:47 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 20:44:47 +0200 (CEST) Subject: [Python-3000-checkins] r65024 - in python/branches/py3k: Lib/lib2to3 Lib/lib2to3/fixer_util.py Lib/lib2to3/fixes/fix_imports.py Lib/lib2to3/fixes/fix_imports2.py Lib/lib2to3/fixes/fix_urllib.py Lib/lib2to3/tests/test_fixers.py Message-ID: <20080716184447.AF3FC1E400A@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 20:44:47 2008 New Revision: 65024 Log: Merged revisions 65019 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ................ r65019 | benjamin.peterson | 2008-07-16 12:01:46 -0500 (Wed, 16 Jul 2008) | 43 lines Merged revisions 64863,64868,64870,64942,65001-65002,65017-65018 via svnmerge from svn+ssh://pythondev at svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r64863 | brett.cannon | 2008-07-10 19:42:32 -0500 (Thu, 10 Jul 2008) | 1 line Add urlparse -> urllib.parse to fix_imports. ........ r64868 | brett.cannon | 2008-07-10 20:00:10 -0500 (Thu, 10 Jul 2008) | 1 line Add robotparser -> urllib.robotparser to fix_imports. ........ r64870 | brett.cannon | 2008-07-11 00:56:27 -0500 (Fri, 11 Jul 2008) | 6 lines Fix the fixers for the new dbm package. Had to create a new fixer (fix_imports2) which did fixes in post-order. This because ``import anydbm`` was being translated into ``import dbm`` which was then subsequently changed into ``import dbm.ndbm``; one transform too many. ........ r64942 | collin.winter | 2008-07-13 20:19:05 -0500 (Sun, 13 Jul 2008) | 1 line Add a comment explaining part of fix_imports.py ........ r65001 | brett.cannon | 2008-07-16 00:11:12 -0500 (Wed, 16 Jul 2008) | 2 lines Remove some extraneous whitespace. ........ r65002 | brett.cannon | 2008-07-16 00:12:04 -0500 (Wed, 16 Jul 2008) | 4 lines Implement a fixer for urllib(2). Thanks Nick Edds for the patch. ........ r65017 | benjamin.peterson | 2008-07-16 11:04:19 -0500 (Wed, 16 Jul 2008) | 1 line fix 2to3 in Python 2.6 ........ r65018 | benjamin.peterson | 2008-07-16 11:55:21 -0500 (Wed, 16 Jul 2008) | 1 line normalize whitespace ........ ................ Added: python/branches/py3k/Lib/lib2to3/fixes/fix_imports2.py - copied unchanged from r65019, /python/trunk/Lib/lib2to3/fixes/fix_imports2.py python/branches/py3k/Lib/lib2to3/fixes/fix_urllib.py - copied unchanged from r65019, /python/trunk/Lib/lib2to3/fixes/fix_urllib.py Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/lib2to3/ (props changed) python/branches/py3k/Lib/lib2to3/fixer_util.py python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Modified: python/branches/py3k/Lib/lib2to3/fixer_util.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixer_util.py (original) +++ python/branches/py3k/Lib/lib2to3/fixer_util.py Wed Jul 16 20:44:47 2008 @@ -112,9 +112,9 @@ """ Return an import statement in the form: from package import name_leafs""" # XXX: May not handle dotted imports properly (eg, package_name='foo.bar') - assert package_name == '.' or '.' not in package.name, "FromImport has "\ - "not been tested with dotted package names -- use at your own "\ - "peril!" + #assert package_name == '.' or '.' not in package_name, "FromImport has "\ + # "not been tested with dotted package names -- use at your own "\ + # "peril!" for leaf in name_leafs: # Pull the leaves out of their old tree Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py Wed Jul 16 20:44:47 2008 @@ -1,10 +1,4 @@ -"""Fix incompatible imports and module references. - -Fixes: - * StringIO -> io - * cStringIO -> io - * md5 -> hashlib -""" +"""Fix incompatible imports and module references.""" # Author: Collin Winter # Local imports @@ -12,7 +6,7 @@ from ..fixer_util import Name, attr_chain, any, set import builtins builtin_names = [name for name in dir(builtins) - if name not in ("__name__", "__doc__")] + if name not in ("__name__", "__doc__", "exec", "print")] # XXX(alexandre): It would be possible to get the modules exports by fetching # XXX: their __all__ attribute. However, I fear that this would add an additional @@ -155,8 +149,7 @@ 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']), - 'whichdb': ('dbm', ['whichdb']), - 'anydbm': ('dbm', ['error', 'open']), + # anydbm and whichdb are handed by fix_imports2. 'dbhash': ('dbm.bsd', ['error', 'open']), 'dumbdbm': ('dbm.dumb', ['error', 'open', '_Database']), 'dbm': ('dbm.ndbm', ['error', 'open', 'library']), @@ -253,25 +246,29 @@ 'CGIHTTPServer': ('http.server', ['CGIHTTPRequestHandler', 'executable', 'nobody_uid', 'nobody']), - 'test.test_support': ('test.support', - ["Error", "TestFailed", "TestSkipped", "ResourceDenied", - "import_module", "verbose", "use_resources", - "max_memuse", "record_original_stdout", - "get_original_stdout", "unload", "unlink", "rmtree", - "forget", "is_resource_enabled", "requires", - "find_unused_port", "bind_port", - "fcmp", "is_jython", "TESTFN", "HOST", - "FUZZ", "findfile", "verify", "vereq", "sortdict", - "check_syntax_error", "open_urlresource", "WarningMessage", - "catch_warning", "CleanImport", "EnvironmentVarGuard", - "TransientResource", "captured_output", "captured_stdout", - "TransientResource", "transient_internet", "run_with_locale", - "set_memlimit", "bigmemtest", "bigaddrspacetest", - "BasicTestRunner", "run_unittest", "run_doctest", - "threading_setup", "threading_cleanup", "reap_children"]), + # 'test.test_support': ('test.support', + # ["Error", "TestFailed", "TestSkipped", "ResourceDenied", + # "import_module", "verbose", "use_resources", + # "max_memuse", "record_original_stdout", + # "get_original_stdout", "unload", "unlink", "rmtree", + # "forget", "is_resource_enabled", "requires", + # "find_unused_port", "bind_port", + # "fcmp", "is_jython", "TESTFN", "HOST", + # "FUZZ", "findfile", "verify", "vereq", "sortdict", + # "check_syntax_error", "open_urlresource", "WarningMessage", + # "catch_warning", "CleanImport", "EnvironmentVarGuard", + # "TransientResource", "captured_output", "captured_stdout", + # "TransientResource", "transient_internet", "run_with_locale", + # "set_memlimit", "bigmemtest", "bigaddrspacetest", + # "BasicTestRunner", "run_unittest", "run_doctest", + # "threading_setup", "threading_cleanup", "reap_children"]), 'commands': ('subprocess', ['getstatusoutput', 'getoutput']), 'UserString' : ('collections', ['UserString']), 'UserList' : ('collections', ['UserList']), + 'urlparse' : ('urllib.parse', + ['urlparse', 'urlunparse', 'urlsplit', + 'urlunsplit', 'urljoin', 'urldefrag']), + 'robotparser' : ('urllib.robotparser', ['RobotFileParser']), } @@ -279,9 +276,9 @@ return "(" + "|".join(map(repr, members)) + ")" -def build_pattern(): +def build_pattern(mapping=MAPPING): bare = set() - for old_module, (new_module, members) in list(MAPPING.items()): + for old_module, (new_module, members) in list(mapping.items()): bare.add(old_module) bare.update(members) members = alternates(members) @@ -297,6 +294,7 @@ yield """import_name< 'import' dotted_as_name< module_name=%r 'as' any > > """ % old_module + # Find usages of module members in code e.g. urllib.foo(bar) yield """power< module_name=%r trailer< '.' %s > any* > """ % (old_module, members) yield """bare_name=%s""" % alternates(bare) @@ -307,6 +305,8 @@ order = "pre" # Pre-order tree traversal + mapping = MAPPING + # Don't match the node if it's within another match def match(self, node): match = super(FixImports, self).match @@ -328,7 +328,7 @@ star = results.get("star") if import_mod or mod_name: - new_name, members = MAPPING[(import_mod or mod_name).value] + new_name, members = self.mapping[(import_mod or mod_name).value] if import_mod: self.replace[import_mod.value] = new_name Modified: python/branches/py3k/Lib/lib2to3/tests/test_fixers.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/tests/test_fixers.py (original) +++ python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Wed Jul 16 20:44:47 2008 @@ -11,6 +11,7 @@ # Python imports import unittest from itertools import chain +from operator import itemgetter from os.path import dirname, pathsep # Local imports @@ -28,8 +29,10 @@ self.verbose = False class FixerTestCase(support.TestCase): - def setUp(self): - options = Options(fix=[self.fixer], print_function=False) + def setUp(self, fix_list=None): + if not fix_list: + fix_list = [self.fixer] + options = Options(fix=fix_list, print_function=False) self.refactor = refactor.RefactoringTool("lib2to3/fixes", options) self.fixer_log = [] self.filename = "" @@ -1494,6 +1497,95 @@ self.check(b, a) +class Test_imports2(Test_imports): + fixer = "imports2" + from ..fixes.fix_imports2 import MAPPING as modules + + +class Test_imports_fixer_order(Test_imports): + + fixer = None + + def setUp(self): + Test_imports.setUp(self, ['imports', 'imports2']) + from ..fixes.fix_imports2 import MAPPING as mapping2 + self.modules = mapping2.copy() + from ..fixes.fix_imports import MAPPING as mapping1 + for key in ('dbhash', 'dumbdbm', 'dbm', 'gdbm'): + self.modules[key] = mapping1[key] + + +class Test_urllib(FixerTestCase): + fixer = "urllib" + from ..fixes.fix_urllib import MAPPING as modules + + def test_import_module(self): + for old, changes in self.modules.items(): + b = "import %s" % old + a = "import %s" % ", ".join(map(itemgetter(0), changes)) + self.check(b, a) + + def test_import_from(self): + for old, changes in self.modules.items(): + all_members = [] + for new, members in changes: + for member in members: + all_members.append(member) + b = "from %s import %s" % (old, member) + a = "from %s import %s" % (new, member) + self.check(b, a) + + s = "from foo import %s" % member + self.unchanged(s) + + b = "from %s import %s" % (old, ", ".join(members)) + a = "from %s import %s" % (new, ", ".join(members)) + self.check(b, a) + + s = "from foo import %s" % ", ".join(members) + self.unchanged(s) + + # test the breaking of a module into multiple replacements + b = "from %s import %s" % (old, ", ".join(all_members)) + a = "\n".join(["from %s import %s" % (new, ", ".join(members)) + for (new, members) in changes]) + self.check(b, a) + + def test_import_module_as(self): + for old in self.modules: + s = "import %s as foo" % old + self.warns_unchanged(s, "This module is now multiple modules") + + def test_import_from_as(self): + for old, changes in self.modules.items(): + for new, members in changes: + for member in members: + b = "from %s import %s as foo_bar" % (old, member) + a = "from %s import %s as foo_bar" % (new, member) + self.check(b, a) + + def test_star(self): + for old in self.modules: + s = "from %s import *" % old + self.warns_unchanged(s, "Cannot handle star imports") + + def test_import_module_usage(self): + for old, changes in self.modules.items(): + for new, members in changes: + for member in members: + b = """ + import %s + foo(%s.%s) + """ % (old, old, member) + a = """ + import %s + foo(%s.%s) + """ % (", ".join([n for (n, mems) + in self.modules[old]]), + new, member) + self.check(b, a) + + class Test_input(FixerTestCase): fixer = "input" From python-3000-checkins at python.org Wed Jul 16 20:52:51 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 20:52:51 +0200 (CEST) Subject: [Python-3000-checkins] r65027 - in python/branches/py3k: Lib/lib2to3 Lib/lib2to3/fixes/fix_urllib.py Message-ID: <20080716185251.227151E4003@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 20:52:50 2008 New Revision: 65027 Log: Merged revisions 65026 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ................ r65026 | benjamin.peterson | 2008-07-16 13:48:35 -0500 (Wed, 16 Jul 2008) | 9 lines Merged revisions 65025 via svnmerge from svn+ssh://pythondev at svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r65025 | benjamin.peterson | 2008-07-16 13:46:30 -0500 (Wed, 16 Jul 2008) | 1 line remove use of has_key ........ ................ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/lib2to3/ (props changed) python/branches/py3k/Lib/lib2to3/fixes/fix_urllib.py Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_urllib.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_urllib.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_urllib.py Wed Jul 16 20:52:50 2008 @@ -120,7 +120,7 @@ if member != ',': for change in MAPPING[mod_member.value]: if member in change[1]: - if mod_dict.has_key(change[0]): + if change[0] in mod_dict: mod_dict[change[0]].append(member) else: mod_dict[change[0]] = [member] From python-3000-checkins at python.org Wed Jul 16 21:41:14 2008 From: python-3000-checkins at python.org (eric.smith) Date: Wed, 16 Jul 2008 21:41:14 +0200 (CEST) Subject: [Python-3000-checkins] r65030 - in python/branches/py3k: Objects/stringlib/formatter.h Message-ID: <20080716194114.CB66F1E4011@bag.python.org> Author: eric.smith Date: Wed Jul 16 21:41:14 2008 New Revision: 65030 Log: Merged revisions 65023 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65023 | eric.smith | 2008-07-16 14:29:51 -0400 (Wed, 16 Jul 2008) | 1 line Renamed a parameter in calc_number_widths, for consistency with the same parameter in fill_non_digits. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Objects/stringlib/formatter.h Modified: python/branches/py3k/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k/Objects/stringlib/formatter.h (original) +++ python/branches/py3k/Objects/stringlib/formatter.h Wed Jul 16 21:41:14 2008 @@ -230,18 +230,18 @@ about what it does? or is passing a single format parameter easier and more efficient enough to justify a little obfuscation? */ static void -calc_number_widths(NumberFieldWidths *r, STRINGLIB_CHAR actual_sign, +calc_number_widths(NumberFieldWidths *spec, STRINGLIB_CHAR actual_sign, Py_ssize_t n_prefix, Py_ssize_t n_digits, const InternalFormatSpec *format) { - r->n_lpadding = 0; - r->n_prefix = 0; - r->n_spadding = 0; - r->n_rpadding = 0; - r->lsign = '\0'; - r->n_lsign = 0; - r->rsign = '\0'; - r->n_rsign = 0; + spec->n_lpadding = 0; + spec->n_prefix = 0; + spec->n_spadding = 0; + spec->n_rpadding = 0; + spec->lsign = '\0'; + spec->n_lsign = 0; + spec->rsign = '\0'; + spec->n_rsign = 0; /* the output will look like: | | @@ -265,32 +265,32 @@ /* compute the various parts we're going to write */ if (format->sign == '+') { /* always put a + or - */ - r->n_lsign = 1; - r->lsign = (actual_sign == '-' ? '-' : '+'); + spec->n_lsign = 1; + spec->lsign = (actual_sign == '-' ? '-' : '+'); } #if ALLOW_PARENS_FOR_SIGN else if (format->sign == '(') { if (actual_sign == '-') { - r->n_lsign = 1; - r->lsign = '('; - r->n_rsign = 1; - r->rsign = ')'; + spec->n_lsign = 1; + spec->lsign = '('; + spec->n_rsign = 1; + spec->rsign = ')'; } } #endif else if (format->sign == ' ') { - r->n_lsign = 1; - r->lsign = (actual_sign == '-' ? '-' : ' '); + spec->n_lsign = 1; + spec->lsign = (actual_sign == '-' ? '-' : ' '); } else { /* non specified, or the default (-) */ if (actual_sign == '-') { - r->n_lsign = 1; - r->lsign = '-'; + spec->n_lsign = 1; + spec->lsign = '-'; } } - r->n_prefix = n_prefix; + spec->n_prefix = n_prefix; /* now the number of padding characters */ if (format->width == -1) { @@ -298,8 +298,8 @@ } else { /* see if any padding is needed */ - if (r->n_lsign + n_digits + r->n_rsign + - r->n_prefix >= format->width) { + if (spec->n_lsign + n_digits + spec->n_rsign + + spec->n_prefix >= format->width) { /* no padding needed, we're already bigger than the requested width */ } @@ -307,24 +307,24 @@ /* determine which of left, space, or right padding is needed */ Py_ssize_t padding = format->width - - (r->n_lsign + r->n_prefix + - n_digits + r->n_rsign); + (spec->n_lsign + spec->n_prefix + + n_digits + spec->n_rsign); if (format->align == '<') - r->n_rpadding = padding; + spec->n_rpadding = padding; else if (format->align == '>') - r->n_lpadding = padding; + spec->n_lpadding = padding; else if (format->align == '^') { - r->n_lpadding = padding / 2; - r->n_rpadding = padding - r->n_lpadding; + spec->n_lpadding = padding / 2; + spec->n_rpadding = padding - spec->n_lpadding; } else if (format->align == '=') - r->n_spadding = padding; + spec->n_spadding = padding; else - r->n_lpadding = padding; + spec->n_lpadding = padding; } } - r->n_total = r->n_lpadding + r->n_lsign + r->n_prefix + - r->n_spadding + n_digits + r->n_rsign + r->n_rpadding; + spec->n_total = spec->n_lpadding + spec->n_lsign + spec->n_prefix + + spec->n_spadding + n_digits + spec->n_rsign + spec->n_rpadding; } /* fill in the non-digit parts of a numbers's string representation, From python-3000-checkins at python.org Wed Jul 16 21:48:47 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 21:48:47 +0200 (CEST) Subject: [Python-3000-checkins] r65031 - python/branches/py3k/Makefile.pre.in Message-ID: <20080716194847.927431E400B@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 21:48:47 2008 New Revision: 65031 Log: fix dependencies Modified: python/branches/py3k/Makefile.pre.in Modified: python/branches/py3k/Makefile.pre.in ============================================================================== --- python/branches/py3k/Makefile.pre.in (original) +++ python/branches/py3k/Makefile.pre.in Wed Jul 16 21:48:47 2008 @@ -561,7 +561,8 @@ Objects/bytesobject.o: $(srcdir)/Objects/bytesobject.c $(BYTESTR_DEPS) Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c \ - $(BYTESTR_DEPS) + $(BYTESTR_DEPS) \ + $(srcdir)/Objects/stringlib/formatter.h Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \ $(BYTESTR_DEPS) From python-3000-checkins at python.org Wed Jul 16 22:33:38 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 16 Jul 2008 22:33:38 +0200 (CEST) Subject: [Python-3000-checkins] r65034 - in python/branches/py3k: configure configure.in Message-ID: <20080716203338.8562C1E4003@bag.python.org> Author: benjamin.peterson Date: Wed Jul 16 22:33:37 2008 New Revision: 65034 Log: Merged revisions 65033 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65033 | benjamin.peterson | 2008-07-16 15:17:04 -0500 (Wed, 16 Jul 2008) | 1 line fix framework install on Mac 10.4 ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/configure python/branches/py3k/configure.in Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Wed Jul 16 22:33:37 2008 @@ -657,6 +657,7 @@ SOVERSION CONFIG_ARGS UNIVERSALSDK +ARCH_RUN_32BIT PYTHONFRAMEWORK PYTHONFRAMEWORKIDENTIFIER PYTHONFRAMEWORKDIR @@ -1892,6 +1893,9 @@ +ARCH_RUN_32BIT= + + UNIVERSAL_ARCHS="32-bit" { echo "$as_me:$LINENO: checking for --with-universal-archs" >&5 echo $ECHO_N "checking for --with-universal-archs... $ECHO_C" >&6; } @@ -4588,12 +4592,14 @@ UNIVERSAL_ARCH_FLAGS="" if test "$UNIVERSAL_ARCHS" = "32-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" elif test "$UNIVERSAL_ARCHS" = "all" ; then UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + ARCH_RUN_32BIT="arch -386 -ppc" else { { echo "$as_me:$LINENO: error: proper usage is --with-universalarch=32-bit|64-bit|all" >&5 @@ -24985,6 +24991,7 @@ SOVERSION!$SOVERSION$ac_delim CONFIG_ARGS!$CONFIG_ARGS$ac_delim UNIVERSALSDK!$UNIVERSALSDK$ac_delim +ARCH_RUN_32BIT!$ARCH_RUN_32BIT$ac_delim PYTHONFRAMEWORK!$PYTHONFRAMEWORK$ac_delim PYTHONFRAMEWORKIDENTIFIER!$PYTHONFRAMEWORKIDENTIFIER$ac_delim PYTHONFRAMEWORKDIR!$PYTHONFRAMEWORKDIR$ac_delim @@ -25040,7 +25047,6 @@ CFLAGSFORSHARED!$CFLAGSFORSHARED$ac_delim SHLIBS!$SHLIBS$ac_delim USE_SIGNAL_MODULE!$USE_SIGNAL_MODULE$ac_delim -SIGNAL_OBJS!$SIGNAL_OBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -25082,6 +25088,7 @@ ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF +SIGNAL_OBJS!$SIGNAL_OBJS$ac_delim USE_THREAD_MODULE!$USE_THREAD_MODULE$ac_delim LDLAST!$LDLAST$ac_delim THREADOBJ!$THREADOBJ$ac_delim @@ -25102,7 +25109,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 18; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 19; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Wed Jul 16 22:33:37 2008 @@ -92,6 +92,9 @@ ]) AC_SUBST(UNIVERSALSDK) +ARCH_RUN_32BIT= +AC_SUBST(ARCH_RUN_32BIT) + UNIVERSAL_ARCHS="32-bit" AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, @@ -859,12 +862,14 @@ UNIVERSAL_ARCH_FLAGS="" if test "$UNIVERSAL_ARCHS" = "32-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" + ARCH_RUN_32BIT="" elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" elif test "$UNIVERSAL_ARCHS" = "all" ; then UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" + ARCH_RUN_32BIT="arch -386 -ppc" else AC_MSG_ERROR([proper usage is --with-universalarch=32-bit|64-bit|all]) From python-3000-checkins at python.org Wed Jul 16 23:21:29 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 16 Jul 2008 23:21:29 +0200 (CEST) Subject: [Python-3000-checkins] r65036 - python/branches/py3k/Doc/tutorial/classes.rst Message-ID: <20080716212129.73DDD1E4003@bag.python.org> Author: georg.brandl Date: Wed Jul 16 23:21:29 2008 New Revision: 65036 Log: #3310: stop referring to basestring. Modified: python/branches/py3k/Doc/tutorial/classes.rst Modified: python/branches/py3k/Doc/tutorial/classes.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/classes.rst (original) +++ python/branches/py3k/Doc/tutorial/classes.rst Wed Jul 16 23:21:29 2008 @@ -531,9 +531,8 @@ * Use :func:`issubclass` to check class inheritance: ``issubclass(bool, int)`` is ``True`` since :class:`bool` is a subclass of :class:`int`. However, - ``issubclass(unicode, str)`` is ``False`` since :class:`unicode` is not a - subclass of :class:`str` (they only share a common ancestor, - :class:`basestring`). + ``issubclass(float, int)`` is ``False`` since :class:`float` is not a + subclass of :class:`int`. From python-3000-checkins at python.org Thu Jul 17 01:15:31 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Thu, 17 Jul 2008 01:15:31 +0200 (CEST) Subject: [Python-3000-checkins] r65043 - in python/branches/py3k: Lib/test/test_bytes.py Objects/bytearrayobject.c Message-ID: <20080716231531.13E7B1E400A@bag.python.org> Author: georg.brandl Date: Thu Jul 17 01:15:30 2008 New Revision: 65043 Log: Merged revisions 65041 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65041 | georg.brandl | 2008-07-17 00:57:41 +0200 (Thu, 17 Jul 2008) | 3 lines #3156: fix consistency in what type bytearray methods accept as items. Also rename confusing "item" parameters to "index". ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_bytes.py python/branches/py3k/Objects/bytearrayobject.c Modified: python/branches/py3k/Lib/test/test_bytes.py ============================================================================== --- python/branches/py3k/Lib/test/test_bytes.py (original) +++ python/branches/py3k/Lib/test/test_bytes.py Thu Jul 17 01:15:30 2008 @@ -17,6 +17,12 @@ import test.string_tests import test.buffer_tests +class Indexable: + def __init__(self, value=0): + self.value = value + def __index__(self): + return self.value + class BaseBytesTest(unittest.TestCase): @@ -53,15 +59,11 @@ self.assertEqual(list(b), ints) def test_from_index(self): - class C: - def __init__(self, i=0): - self.i = i - def __index__(self): - return self.i - b = self.type2test([C(), C(1), C(254), C(255)]) + b = self.type2test([Indexable(), Indexable(1), Indexable(254), + Indexable(255)]) self.assertEqual(list(b), [0, 1, 254, 255]) - self.assertRaises(ValueError, bytearray, [C(-1)]) - self.assertRaises(ValueError, bytearray, [C(256)]) + self.assertRaises(ValueError, bytearray, [Indexable(-1)]) + self.assertRaises(ValueError, bytearray, [Indexable(256)]) def test_from_ssize(self): self.assertEqual(bytearray(0), b'') @@ -506,12 +508,7 @@ self.assertEqual(b, bytearray([1, 100, 3])) b[-1] = 200 self.assertEqual(b, bytearray([1, 100, 200])) - class C: - def __init__(self, i=0): - self.i = i - def __index__(self): - return self.i - b[0] = C(10) + b[0] = Indexable(10) self.assertEqual(b, bytearray([10, 100, 200])) try: b[3] = 0 @@ -529,7 +526,7 @@ except ValueError: pass try: - b[0] = C(-1) + b[0] = Indexable(-1) self.fail("Didn't raise ValueError") except ValueError: pass @@ -665,6 +662,9 @@ self.assertRaises(ValueError, a.extend, [0, 1, 2, 256]) self.assertRaises(ValueError, a.extend, [0, 1, 2, -1]) self.assertEqual(len(a), 0) + a = bytearray(b'') + a.extend([Indexable(ord('a'))]) + self.assertEqual(a, b'a') def test_remove(self): b = bytearray(b'hello') @@ -680,6 +680,8 @@ b.remove(ord('h')) self.assertEqual(b, b'e') self.assertRaises(TypeError, lambda: b.remove(b'e')) + b.remove(Indexable(ord('e'))) + self.assertEqual(b, b'') def test_pop(self): b = bytearray(b'world') @@ -701,6 +703,9 @@ b.append(ord('A')) self.assertEqual(len(b), 1) self.assertRaises(TypeError, lambda: b.append(b'o')) + b = bytearray() + b.append(Indexable(ord('A'))) + self.assertEqual(b, b'A') def test_insert(self): b = bytearray(b'msssspp') @@ -710,6 +715,9 @@ b.insert(1000, ord('i')) self.assertEqual(b, b'mississippi') self.assertRaises(TypeError, lambda: b.insert(0, b'1')) + b = bytearray() + b.insert(0, Indexable(ord('A'))) + self.assertEqual(b, b'A') def test_partition_bytearray_doesnt_share_nullstring(self): a, b, c = bytearray(b"x").partition(b"y") Modified: python/branches/py3k/Objects/bytearrayobject.c ============================================================================== --- python/branches/py3k/Objects/bytearrayobject.c (original) +++ python/branches/py3k/Objects/bytearrayobject.c Thu Jul 17 01:15:30 2008 @@ -36,12 +36,19 @@ if (PyLong_Check(arg)) { face_value = PyLong_AsLong(arg); - if (face_value < 0 || face_value >= 256) { - PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); + } else { + PyObject *index = PyNumber_Index(arg); + if (index == NULL) { + PyErr_Format(PyExc_TypeError, "an integer is required"); return 0; } - } else { - PyErr_Format(PyExc_TypeError, "an integer is required"); + face_value = PyLong_AsLong(index); + Py_DECREF(index); + } + + if (face_value < 0 || face_value >= 256) { + /* this includes the OverflowError in case the long is too large */ + PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); return 0; } @@ -358,10 +365,10 @@ } static PyObject * -bytes_subscript(PyByteArrayObject *self, PyObject *item) +bytes_subscript(PyByteArrayObject *self, PyObject *index) { - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (PyIndex_Check(index)) { + Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -375,9 +382,9 @@ } return PyLong_FromLong((unsigned char)(self->ob_bytes[i])); } - else if (PySlice_Check(item)) { + else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx((PySliceObject *)index, PyByteArray_GET_SIZE(self), &start, &stop, &step, &slicelength) < 0) { return NULL; @@ -501,7 +508,7 @@ static int bytes_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value) { - Py_ssize_t ival; + int ival; if (i < 0) i += Py_SIZE(self); @@ -514,27 +521,21 @@ if (value == NULL) return bytes_setslice(self, i, i+1, NULL); - ival = PyNumber_AsSsize_t(value, PyExc_ValueError); - if (ival == -1 && PyErr_Occurred()) - return -1; - - if (ival < 0 || ival >= 256) { - PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); + if (!_getbytevalue(value, &ival)) return -1; - } self->ob_bytes[i] = ival; return 0; } static int -bytes_ass_subscript(PyByteArrayObject *self, PyObject *item, PyObject *values) +bytes_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values) { Py_ssize_t start, stop, step, slicelen, needed; char *bytes; - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (PyIndex_Check(index)) { + Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return -1; @@ -555,20 +556,15 @@ slicelen = 1; } else { - Py_ssize_t ival = PyNumber_AsSsize_t(values, PyExc_ValueError); - if (ival == -1 && PyErr_Occurred()) - return -1; - if (ival < 0 || ival >= 256) { - PyErr_SetString(PyExc_ValueError, - "byte must be in range(0, 256)"); + int ival; + if (!_getbytevalue(values, &ival)) return -1; - } self->ob_bytes[i] = (char)ival; return 0; } } - else if (PySlice_Check(item)) { - if (PySlice_GetIndicesEx((PySliceObject *)item, + else if (PySlice_Check(index)) { + if (PySlice_GetIndicesEx((PySliceObject *)index, PyByteArray_GET_SIZE(self), &start, &stop, &step, &slicelen) < 0) { return -1; @@ -589,7 +585,7 @@ values = PyByteArray_FromObject(values); if (values == NULL) return -1; - err = bytes_ass_subscript(self, item, values); + err = bytes_ass_subscript(self, index, values); Py_DECREF(values); return err; } @@ -789,7 +785,7 @@ /* Run the iterator to exhaustion */ for (;;) { PyObject *item; - Py_ssize_t value; + int rc, value; /* Get the next item */ item = iternext(it); @@ -803,18 +799,11 @@ } /* Interpret it as an int (__index__) */ - value = PyNumber_AsSsize_t(item, PyExc_ValueError); + rc = _getbytevalue(item, &value); Py_DECREF(item); - if (value == -1 && PyErr_Occurred()) + if (!rc) goto error; - /* Range check */ - if (value < 0 || value >= 256) { - PyErr_SetString(PyExc_ValueError, - "bytes must be in range(0, 256)"); - goto error; - } - /* Append the byte */ if (Py_SIZE(self) < self->ob_alloc) Py_SIZE(self)++; @@ -2517,10 +2506,11 @@ static PyObject * bytes_insert(PyByteArrayObject *self, PyObject *args) { - int value; + PyObject *value; + int ival; Py_ssize_t where, n = Py_SIZE(self); - if (!PyArg_ParseTuple(args, "ni:insert", &where, &value)) + if (!PyArg_ParseTuple(args, "nO:insert", &where, &value)) return NULL; if (n == PY_SSIZE_T_MAX) { @@ -2528,11 +2518,8 @@ "cannot add more objects to bytes"); return NULL; } - if (value < 0 || value >= 256) { - PyErr_SetString(PyExc_ValueError, - "byte must be in range(0, 256)"); + if (!_getbytevalue(value, &ival)) return NULL; - } if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; @@ -2544,7 +2531,7 @@ if (where > n) where = n; memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where); - self->ob_bytes[where] = value; + self->ob_bytes[where] = ival; Py_RETURN_NONE; } From python-3000-checkins at python.org Thu Jul 17 01:18:01 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Thu, 17 Jul 2008 01:18:01 +0200 (CEST) Subject: [Python-3000-checkins] r65045 - python/branches/py3k Message-ID: <20080716231801.9CCA01E4003@bag.python.org> Author: georg.brandl Date: Thu Jul 17 01:18:01 2008 New Revision: 65045 Log: Blocked revisions 65042,65044 via svnmerge ........ r65042 | georg.brandl | 2008-07-17 01:10:05 +0200 (Thu, 17 Jul 2008) | 2 lines Use _getbytevalue() in init too. ........ r65044 | georg.brandl | 2008-07-17 01:17:46 +0200 (Thu, 17 Jul 2008) | 2 lines Backport part of r65043. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 17 01:19:02 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Thu, 17 Jul 2008 01:19:02 +0200 (CEST) Subject: [Python-3000-checkins] r65047 - python/branches/py3k Message-ID: <20080716231902.34A0A1E4003@bag.python.org> Author: georg.brandl Date: Thu Jul 17 01:19:01 2008 New Revision: 65047 Log: Blocked revisions 65046 via svnmerge ........ r65046 | georg.brandl | 2008-07-17 01:18:51 +0200 (Thu, 17 Jul 2008) | 2 lines Byte items *can* be chars in 2.6. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 17 04:21:57 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 04:21:57 +0200 (CEST) Subject: [Python-3000-checkins] r65056 - in python/branches/py3k: Lib/lib2to3 Lib/lib2to3/fixes/fix_imports.py Lib/lib2to3/fixes/fix_imports2.py Lib/lib2to3/pytree.py Lib/lib2to3/tests/test_fixers.py Message-ID: <20080717022157.5BAD81E4003@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 04:21:56 2008 New Revision: 65056 Log: Merged revisions 65055 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ................ r65055 | benjamin.peterson | 2008-07-16 21:07:46 -0500 (Wed, 16 Jul 2008) | 13 lines Merged revisions 65053-65054 via svnmerge from svn+ssh://pythondev at svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r65053 | benjamin.peterson | 2008-07-16 21:04:12 -0500 (Wed, 16 Jul 2008) | 1 line massive optimizations for 2to3 (especially fix_imports) from Nick Edds ........ r65054 | benjamin.peterson | 2008-07-16 21:05:09 -0500 (Wed, 16 Jul 2008) | 1 line normalize whitespace ........ ................ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/lib2to3/ (props changed) python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py python/branches/py3k/Lib/lib2to3/fixes/fix_imports2.py python/branches/py3k/Lib/lib2to3/pytree.py python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_imports.py Thu Jul 17 04:21:56 2008 @@ -4,271 +4,55 @@ # Local imports from .. import fixer_base from ..fixer_util import Name, attr_chain, any, set -import builtins -builtin_names = [name for name in dir(builtins) - if name not in ("__name__", "__doc__", "exec", "print")] - -# XXX(alexandre): It would be possible to get the modules exports by fetching -# XXX: their __all__ attribute. However, I fear that this would add an additional -# XXX: overhead to the fixer. -MAPPING = {"StringIO": ("io", ["StringIO"]), - "cStringIO": ("io", ["StringIO"]), - "cPickle": ("pickle", ['BadPickleGet', 'HIGHEST_PROTOCOL', - 'PickleError', 'Pickler', 'PicklingError', - 'UnpickleableError', 'Unpickler', 'UnpicklingError', - 'compatible_formats', 'dump', 'dumps', 'format_version', - 'load', 'loads']), - "__builtin__" : ("builtins", builtin_names), - 'copy_reg': ('copyreg', ['pickle', - 'constructor', - 'add_extension', - 'remove_extension', - 'clear_extension_cache']), - 'Queue': ('queue', ['Empty', 'Full', 'Queue', - 'PriorityQueue', 'LifoQueue']), - 'SocketServer': ('socketserver', - ['TCPServer', 'UDPServer', 'BaseServer', - 'ForkingUDPServer', 'ForkingTCPServer', - 'ThreadingUDPServer', 'ThreadingTCPServer', - 'BaseRequestHandler', 'StreamRequestHandler', - 'DatagramRequestHandler', 'ThreadingMixIn', - 'ForkingMixIn', 'UnixStreamServer', - 'UnixDatagramServer', 'ThreadingUnixStreamServer', - 'ThreadingUnixDatagramServer']), - 'ConfigParser': ('configparser', - ['NoSectionError', 'DuplicateSectionError', - 'NoOptionError', 'InterpolationError', - 'InterpolationDepthError', - 'InterpolationSyntaxError', - 'ParsingError', 'MissingSectionHeaderError', - 'ConfigParser', 'SafeConfigParser', - 'RawConfigParser', 'DEFAULTSECT', - 'MAX_INTERPOLATION_DEPTH']), - 'repr': ('reprlib', ['Repr', 'repr']), - 'FileDialog': ('tkinter.filedialog', - ['FileDialog', 'LoadFileDialog', 'SaveFileDialog']), - 'tkFileDialog': ('tkinter.filedialog', - ['Open', 'SaveAs', 'Directory', 'askopenfilename', - 'asksaveasfilename', 'askopenfilenames', - 'askopenfile', 'askopenfiles', 'asksaveasfile', - 'askdirectory']), - 'SimpleDialog': ('tkinter.simpledialog', ['SimpleDialog']), - 'tkSimpleDialog': ('tkinter.simpledialog', - ['Dialog', 'askinteger', 'askfloat', - 'askstring']), - 'tkColorChooser': ('tkinter.colorchooser', ['Chooser', 'askcolor']), - 'tkCommonDialog': ('tkinter.commondialog', ['Dialog']), - 'Dialog': ('tkinter.dialog', ['Dialog']), - 'Tkdnd': ('tkinter.dnd', ['DndHandler']), - 'tkFont': ('tkinter.font', - ['nametofont', 'Font', 'families', 'names']), - 'tkMessageBox': ('tkinter.messagebox', - ['Message', 'showinfo', 'showwarning', 'showerror', - 'askquestion', 'askokcancel', 'askyesno', - 'askyesnocancel', 'askretrycancel']), - 'ScrolledText': ('tkinter.scrolledtext', ['ScrolledText']), - 'turtle': ('tkinter.turtle', - ['RawPen', 'Pen', 'Turtle', 'degrees', 'radian', 'reset', - 'clear', 'tracer', 'forward', 'backward', 'left', - 'right', 'up', 'down', 'width', 'color', 'write', 'fill', - 'begin_fill', 'end_fill', 'circle', 'goto', 'heading', - 'setheading', 'position', 'window_width', 'setx', 'sety', - 'towards', 'done', 'delay', 'speed', 'setup', 'title']), - 'Tkconstants': ('tkinter.constants', - ['NO', 'FALSE', 'OFF', 'YES', 'TRUE', 'ON', 'N', 'S', - 'W', 'E', 'NW', 'SW', 'SE', 'NE', 'NS', 'EW', - 'NSEW', 'CENTER', 'NONE', 'X', 'Y', 'BOTH', 'LEFT', - 'TOP', 'RIGHT', 'BOTTOM', 'RAISED', 'SUNKEN', - 'FLAT', 'RIDGE', 'GROOVE', 'SOLID', 'HORIZONTAL', - 'VERTICAL', 'NUMERIC', 'CHAR', 'WORD', 'BASELINE', - 'INSIDE', 'OUTSIDE', 'SEL', 'SEL_FIRST', 'SEL_LAST', - 'END', 'INSERT', 'CURRENT', 'ANCHOR', 'ALL', - 'NORMAL', 'DISABLED', 'ACTIVE', 'HIDDEN', 'CASCADE', - 'CHECKBUTTON', 'COMMAND', 'RADIOBUTTON', - 'SEPARATOR', 'SINGLE', 'BROWSE', 'MULTIPLE', - 'EXTENDED', 'DOTBOX', 'UNDERLINE', 'PIESLICE', - 'CHORD', 'ARC', 'FIRST', 'LAST', 'BUTT', - 'PROJECTING', 'ROUND', 'BEVEL', 'MITTER', 'MOVETO', - 'SCROLL', 'UNITS', 'PAGES']), - 'Tix': ('tkinter.tix', - ['tixCommand', 'Tk', 'Form', 'TixWidget', 'TixSubWidget', - 'DisplayStyle', 'Balloon', 'ButtonBox', 'ComboBox', - 'Control', 'DirList', 'DirTree', 'DirSelectBox', - 'ExFileSelectBox', 'DirSelectDialog', 'ExFileSelectDialog', - 'FileSelectBox', 'FileSelectDialog', 'FileEntry', 'HList', - 'InputOnly', 'LabelEntry', 'LabelFrame', 'ListNoteBook', - 'Meter', 'NoteBook', 'OptionMenu', 'PanedWindow', - 'PopupMenu', 'ResizeHandle', 'ScrolledHList', - 'ScrolledListBox', 'ScrolledText', 'ScrolledTList', - 'ScrolledWindow', 'Select', 'Shell', 'DialogShell', - 'StdButtonBox', 'TList', 'Tree', 'CheckList', 'OptionName', - 'FileTypeList', 'Grid', 'ScrolledGrid']), - 'Tkinter': ('tkinter', - ['_flatten', 'TclError', 'TkVersion', 'TclVersion', - 'Variable', 'StringVar', 'IntVar', 'DoubleVar', - 'BooleanVar','mainloop', 'Tk', 'Tcl', 'Toplevel', - 'Button', 'Canvas', 'Checkbutton', 'Entry', 'Frame', - 'Label', 'Listbox', 'Menu', 'Menubutton', - 'Radiobutton', 'Scale', 'Scrollbar', 'Text', - 'OptionMenu', 'Image', 'PhotoImage', 'BitmapImage', - 'image_names', 'image_types', 'Spinbox', 'LabelFrame', - 'PanedWindow', 'Studbutton', 'Tributton']), - 'markupbase': ('_markupbase', ['ParserBase']), - '_winreg': ('winreg', [ - 'CloseKey', 'ConnectRegistry', 'CreateKey', 'DeleteKey', - 'DeleteValue', 'DisableReflectionKey', 'EnableReflectionKey', - 'EnumKey', 'EnumValue', 'ExpandEnvironmentStrings', 'FlushKey', - 'LoadKey', 'OpenKey', 'OpenKeyEx', 'QueryValue', 'QueryValueEx', - 'QueryInfoKey', 'QueryReflectionKey', 'SaveKey', 'SetValue', - 'SetValueEx', 'HKEY_CLASSES_ROOT', 'HKEY_CURRENT_USER', - 'HKEY_LOCAL_MACHINE', 'HKEY_USERS', 'HKEY_PERFORMANCE_DATA', - 'HKEY_CURRENT_CONFIG', 'HKEY_DYN_DATA', 'KEY_QUERY_VALUE', - 'KEY_SET_VALUE', 'KEY_CREATE_SUB_KEY', 'KEY_ENUMERATE_SUB_KEYS', - 'KEY_NOTIFY', 'KEY_CREATE_LINK', 'KEY_READ', 'KEY_WRITE', - 'KEY_EXECUTE', 'KEY_ALL_ACCESS', 'KEY_WOW64_64KEY', - 'KEY_WOW64_32KEY', 'REG_OPTION_RESERVED', - 'REG_OPTION_NON_VOLATILE', 'REG_OPTION_VOLATILE', - 'REG_OPTION_CREATE_LINK', 'REG_OPTION_BACKUP_RESTORE', - 'REG_OPTION_OPEN_LINK', 'REG_LEGAL_OPTION', - 'REG_CREATED_NEW_KEY', 'REG_OPENED_EXISTING_KEY', - 'REG_WHOLE_HIVE_VOLATILE', 'REG_REFRESH_HIVE', - 'REG_NO_LAZY_FLUSH', 'REG_NOTIFY_CHANGE_NAME', - 'REG_NOTIFY_CHANGE_ATTRIBUTES', 'REG_NOTIFY_CHANGE_LAST_SET', - 'REG_NOTIFY_CHANGE_SECURITY', 'REG_LEGAL_CHANGE_FILTER', - 'REG_NONE', 'REG_SZ', 'REG_EXPAND_SZ', 'REG_BINARY', 'REG_DWORD', - 'REG_DWORD_LITTLE_ENDIAN', 'REG_DWORD_BIG_ENDIAN', 'REG_LINK', - 'REG_MULTI_SZ', 'REG_RESOURCE_LIST', - 'REG_FULL_RESOURCE_DESCRIPTOR', 'REG_RESOURCE_REQUIREMENTS_LIST']), - 'thread': ('_thread', - ['LockType', '_local', 'allocate', 'allocate_lock', - 'error', 'exit', 'exit_thread', 'get_ident', - 'interrupt_main', 'stack_size', 'start_new', - 'start_new_thread']), - 'dummy_thread': ('_dummy_thread', - ['LockType', '_local', 'allocate', 'allocate_lock', - 'error', 'exit', 'exit_thread', 'get_ident', - 'interrupt_main', 'stack_size', 'start_new', - 'start_new_thread']), - # anydbm and whichdb are handed by fix_imports2. - 'dbhash': ('dbm.bsd', ['error', 'open']), - 'dumbdbm': ('dbm.dumb', ['error', 'open', '_Database']), - 'dbm': ('dbm.ndbm', ['error', 'open', 'library']), - 'gdbm': ('dbm.gnu', ['error', 'open', 'open_flags']), - 'xmlrpclib': ('xmlrpc.client', - ['Error', 'ProtocolError', 'ResponseError', 'Fault', - 'ServerProxy', 'Boolean', 'DateTime', 'Binary', - 'ExpatParser', 'FastMarshaller', 'FastParser', - 'FastUnmarshaller', 'MultiCall', 'MultiCallIterator', - 'SlowParser', 'Marshaller', 'Unmarshaller', 'Server', - 'Transport', 'SafeTransport', 'SgmlopParser', - 'boolean', 'getparser', 'dumps', 'loads', 'escape', - 'PARSE_ERROR', 'SERVER_ERROR', 'WRAPPERS', - 'APPLICATION_ERROR', 'SYSTEM_ERROR', - 'TRANSPORT_ERROR', 'NOT_WELLFORMED_ERROR', - 'UNSUPPORTED_ENCODING', 'INVALID_ENCODING_CHAR', - 'INVALID_XMLRPC', 'METHOD_NOT_FOUND', - 'INVALID_METHOD_PARAMS', 'INTERNAL_ERROR', - 'MININT', 'MAXINT']), - 'DocXMLRPCServer': ('xmlrpc.server', - ['CGIXMLRPCRequestHandler', - 'DocCGIXMLRPCRequestHandler', - 'DocXMLRPCRequestHandler', 'DocXMLRPCServer', - 'ServerHTMLDoc', 'SimpleXMLRPCRequestHandler', - 'SimpleXMLRPCServer', 'XMLRPCDocGenerator', - 'resolve_dotted_attribute']), - 'SimpleXMLRPCServer': ('xmlrpc.server', - ['CGIXMLRPCRequestHandler', - 'Fault', 'SimpleXMLRPCDispatcher', - 'SimpleXMLRPCRequestHandler', - 'SimpleXMLRPCServer', 'SocketServer', - 'list_public_methods', - 'remove_duplicates', - 'resolve_dotted_attribute']), - 'httplib': ('http.client', - ['ACCEPTED', 'BAD_GATEWAY', 'BAD_REQUEST', - 'BadStatusLine', 'CONFLICT', 'CONTINUE', 'CREATED', - 'CannotSendHeader', 'CannotSendRequest', - 'EXPECTATION_FAILED', 'FAILED_DEPENDENCY', 'FORBIDDEN', - 'FOUND', 'FakeSocket', 'GATEWAY_TIMEOUT', 'GONE', - 'HTTP', 'HTTPConnection', 'HTTPException', - 'HTTPMessage', 'HTTPResponse', 'HTTPS', - 'HTTPSConnection', 'HTTPS_PORT', 'HTTP_PORT', - 'HTTP_VERSION_NOT_SUPPORTED', 'IM_USED', - 'INSUFFICIENT_STORAGE', 'INTERNAL_SERVER_ERROR', - 'ImproperConnectionState', 'IncompleteRead', - 'InvalidURL', 'LENGTH_REQUIRED', 'LOCKED', - 'LineAndFileWrapper', 'MAXAMOUNT', 'METHOD_NOT_ALLOWED', - 'MOVED_PERMANENTLY', 'MULTIPLE_CHOICES', 'MULTI_STATUS', - 'NON_AUTHORITATIVE_INFORMATION', 'NOT_ACCEPTABLE', - 'NOT_EXTENDED', 'NOT_FOUND', 'NOT_IMPLEMENTED', - 'NOT_MODIFIED', 'NO_CONTENT', 'NotConnected', 'OK', - 'PARTIAL_CONTENT', 'PAYMENT_REQUIRED', - 'PRECONDITION_FAILED', 'PROCESSING', - 'PROXY_AUTHENTICATION_REQUIRED', - 'REQUESTED_RANGE_NOT_SATISFIABLE', - 'REQUEST_ENTITY_TOO_LARGE', 'REQUEST_TIMEOUT', - 'REQUEST_URI_TOO_LONG', 'RESET_CONTENT', - 'ResponseNotReady', 'SEE_OTHER', 'SERVICE_UNAVAILABLE', - 'SSLFile', 'SWITCHING_PROTOCOLS', 'SharedSocket', - 'SharedSocketClient', 'StringIO', 'TEMPORARY_REDIRECT', - 'UNAUTHORIZED', 'UNPROCESSABLE_ENTITY', - 'UNSUPPORTED_MEDIA_TYPE', 'UPGRADE_REQUIRED', - 'USE_PROXY', 'UnimplementedFileMode', 'UnknownProtocol', - 'UnknownTransferEncoding', 'error', 'responses']), - 'Cookie': ('http.cookies', - ['BaseCookie', 'Cookie', 'CookieError', 'Morsel', - 'SerialCookie', 'SimpleCookie', 'SmartCookie']), - 'cookielib': ('http.cookiejar', - ['Absent', 'Cookie', 'CookieJar', 'CookiePolicy', - 'DAYS', 'DEFAULT_HTTP_PORT', 'DefaultCookiePolicy', - 'EPOCH_YEAR', 'ESCAPED_CHAR_RE', 'FileCookieJar', - 'HEADER_ESCAPE_RE', 'HEADER_JOIN_ESCAPE_RE', - 'HEADER_QUOTED_VALUE_RE', 'HEADER_TOKEN_RE', - 'HEADER_VALUE_RE', 'HTTP_PATH_SAFE', 'IPV4_RE', - 'ISO_DATE_RE', 'LOOSE_HTTP_DATE_RE', 'LWPCookieJar', - 'LoadError', 'MISSING_FILENAME_TEXT', 'MONTHS', - 'MONTHS_LOWER', 'MozillaCookieJar', 'STRICT_DATE_RE', - 'TIMEZONE_RE', 'UTC_ZONES', 'WEEKDAY_RE', - 'cut_port_re', 'deepvalues', 'domain_match', - 'eff_request_host', 'escape_path', 'http2time', - 'is_HDN', 'is_third_party', 'iso2time', - 'join_header_words', 'liberal_is_HDN', 'logger', - 'lwp_cookie_str', 'month', 'offset_from_tz_string', - 'parse_ns_headers', 'reach', 'request_host', - 'request_path', 'request_port', 'split_header_words', - 'time', 'time2isoz', 'time2netscape', 'unmatched', - 'uppercase_escaped_char', 'urllib', - 'user_domain_match', 'vals_sorted_by_key']), - 'BaseHTTPServer': ('http.server', - ['BaseHTTPRequestHandler', - 'DEFAULT_ERROR_MESSAGE', 'HTTPServer']), - 'SimpleHTTPServer': ('http.server', ['SimpleHTTPRequestHandler']), - 'CGIHTTPServer': ('http.server', - ['CGIHTTPRequestHandler', 'executable', - 'nobody_uid', 'nobody']), - # 'test.test_support': ('test.support', - # ["Error", "TestFailed", "TestSkipped", "ResourceDenied", - # "import_module", "verbose", "use_resources", - # "max_memuse", "record_original_stdout", - # "get_original_stdout", "unload", "unlink", "rmtree", - # "forget", "is_resource_enabled", "requires", - # "find_unused_port", "bind_port", - # "fcmp", "is_jython", "TESTFN", "HOST", - # "FUZZ", "findfile", "verify", "vereq", "sortdict", - # "check_syntax_error", "open_urlresource", "WarningMessage", - # "catch_warning", "CleanImport", "EnvironmentVarGuard", - # "TransientResource", "captured_output", "captured_stdout", - # "TransientResource", "transient_internet", "run_with_locale", - # "set_memlimit", "bigmemtest", "bigaddrspacetest", - # "BasicTestRunner", "run_unittest", "run_doctest", - # "threading_setup", "threading_cleanup", "reap_children"]), - 'commands': ('subprocess', ['getstatusoutput', 'getoutput']), - 'UserString' : ('collections', ['UserString']), - 'UserList' : ('collections', ['UserList']), - 'urlparse' : ('urllib.parse', - ['urlparse', 'urlunparse', 'urlsplit', - 'urlunsplit', 'urljoin', 'urldefrag']), - 'robotparser' : ('urllib.robotparser', ['RobotFileParser']), + +MAPPING = {'StringIO': 'io', + 'cStringIO': 'io', + 'cPickle': 'pickle', + '__builtin__' : 'builtins', + 'copy_reg': 'copyreg', + 'Queue': 'queue', + 'SocketServer': 'socketserver', + 'ConfigParser': 'configparser', + 'repr': 'reprlib', + 'FileDialog': 'tkinter.filedialog', + 'tkFileDialog': 'tkinter.filedialog', + 'SimpleDialog': 'tkinter.simpledialog', + 'tkSimpleDialog': 'tkinter.simpledialog', + 'tkColorChooser': 'tkinter.colorchooser', + 'tkCommonDialog': 'tkinter.commondialog', + 'Dialog': 'tkinter.dialog', + 'Tkdnd': 'tkinter.dnd', + 'tkFont': 'tkinter.font', + 'tkMessageBox': 'tkinter.messagebox', + 'ScrolledText': 'tkinter.scrolledtext', + 'turtle': 'tkinter.turtle', + 'Tkconstants': 'tkinter.constants', + 'Tix': 'tkinter.tix', + 'Tkinter': 'tkinter', + 'markupbase': '_markupbase', + '_winreg': 'winreg', + 'thread': '_thread', + 'dummy_thread': '_dummy_thread', + # anydbm and whichdb are handled by fix_imports2 + 'dbhash': 'dbm.bsd', + 'dumbdbm': 'dbm.dumb', + 'dbm': 'dbm.ndbm', + 'gdbm': 'dbm.gnu', + 'xmlrpclib': 'xmlrpc.client', + 'DocXMLRPCServer': 'xmlrpc.server', + 'SimpleXMLRPCServer': 'xmlrpc.server', + 'httplib': 'http.client', + 'Cookie': 'http.cookies', + 'cookielib': 'http.cookiejar', + 'BaseHTTPServer': 'http.server', + 'SimpleHTTPServer': 'http.server', + 'CGIHTTPServer': 'http.server', + #'test.test_support': 'test.support', + 'commands': 'subprocess', + 'UserString' : 'collections', + 'UserList' : 'collections', + 'urlparse' : 'urllib.parse', + 'robotparser' : 'urllib.robotparser', } @@ -278,31 +62,26 @@ def build_pattern(mapping=MAPPING): bare = set() - for old_module, (new_module, members) in list(mapping.items()): + for old_module, new_module in mapping.items(): bare.add(old_module) - bare.update(members) - members = alternates(members) yield """import_name< 'import' (module=%r | dotted_as_names< any* module=%r any* >) > """ % (old_module, old_module) yield """import_from< 'from' module_name=%r 'import' - ( %s | import_as_name< %s 'as' any > | - import_as_names< any* >) > - """ % (old_module, members, members) - yield """import_from< 'from' module_name=%r 'import' star='*' > + ( any | import_as_name< any 'as' any > | + import_as_names< any* >) > """ % old_module yield """import_name< 'import' dotted_as_name< module_name=%r 'as' any > > """ % old_module # Find usages of module members in code e.g. urllib.foo(bar) - yield """power< module_name=%r trailer< '.' %s > any* > - """ % (old_module, members) + yield """power< module_name=%r + trailer<'.' any > any* > + """ % old_module yield """bare_name=%s""" % alternates(bare) - class FixImports(fixer_base.BaseFix): PATTERN = "|".join(build_pattern()) - order = "pre" # Pre-order tree traversal mapping = MAPPING @@ -325,19 +104,15 @@ import_mod = results.get("module") mod_name = results.get("module_name") bare_name = results.get("bare_name") - star = results.get("star") if import_mod or mod_name: - new_name, members = self.mapping[(import_mod or mod_name).value] + new_name = self.mapping[(import_mod or mod_name).value] if import_mod: self.replace[import_mod.value] = new_name import_mod.replace(Name(new_name, prefix=import_mod.get_prefix())) elif mod_name: - if star: - self.cannot_convert(node, "Cannot handle star imports.") - else: - mod_name.replace(Name(new_name, prefix=mod_name.get_prefix())) + mod_name.replace(Name(new_name, prefix=mod_name.get_prefix())) elif bare_name: bare_name = bare_name[0] new_name = self.replace.get(bare_name.value) Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_imports2.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_imports2.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_imports2.py Thu Jul 17 04:21:56 2008 @@ -4,8 +4,8 @@ MAPPING = { - 'whichdb': ('dbm', ['whichdb']), - 'anydbm': ('dbm', ['error', 'open']), + 'whichdb': 'dbm', + 'anydbm': 'dbm', } Modified: python/branches/py3k/Lib/lib2to3/pytree.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/pytree.py (original) +++ python/branches/py3k/Lib/lib2to3/pytree.py Thu Jul 17 04:21:56 2008 @@ -652,20 +652,35 @@ if self.name: r[self.name] = nodes[:count] yield count, r + elif self.name == "bare_name": + yield self._bare_name_matches(nodes) else: for count, r in self._recursive_matches(nodes, 0): if self.name: r[self.name] = nodes[:count] yield count, r + def _bare_name_matches(self, nodes): + """Special optimized matcher for bare_name.""" + count = 0 + r = {} + done = False + max = len(nodes) + while not done and count < max: + done = True + for leaf in self.content: + if leaf[0].match(nodes[count], r): + count += 1 + done = False + break + r[self.name] = nodes[:count] + return count, r + def _recursive_matches(self, nodes, count): """Helper to recursively yield the matches.""" assert self.content is not None if count >= self.min: - r = {} - if self.name: - r[self.name] = nodes[:0] - yield 0, r + yield 0, {} if count < self.max: for alt in self.content: for c0, r0 in generate_matches(alt, nodes): Modified: python/branches/py3k/Lib/lib2to3/tests/test_fixers.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/tests/test_fixers.py (original) +++ python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Thu Jul 17 04:21:56 2008 @@ -1413,7 +1413,7 @@ from ..fixes.fix_imports import MAPPING as modules def test_import_module(self): - for old, (new, members) in list(self.modules.items()): + for old, new in self.modules.items(): b = "import %s" % old a = "import %s" % new self.check(b, a) @@ -1423,24 +1423,17 @@ self.check(b, a) def test_import_from(self): - for old, (new, members) in list(self.modules.items()): - for member in members: - b = "from %s import %s" % (old, member) - a = "from %s import %s" % (new, member) - self.check(b, a) - - s = "from foo import %s" % member - self.unchanged(s) - - b = "from %s import %s" % (old, ", ".join(members)) - a = "from %s import %s" % (new, ", ".join(members)) + for old, new in self.modules.items(): + b = "from %s import foo" % old + a = "from %s import foo" % new self.check(b, a) - s = "from foo import %s" % ", ".join(members) - self.unchanged(s) + b = "from %s import foo, bar" % old + a = "from %s import foo, bar" % new + self.check(b, a) def test_import_module_as(self): - for old, (new, members) in list(self.modules.items()): + for old, new in self.modules.items(): b = "import %s as foo_bar" % old a = "import %s as foo_bar" % new self.check(b, a) @@ -1450,50 +1443,27 @@ self.check(b, a) def test_import_from_as(self): - for old, (new, members) in list(self.modules.items()): - for member in members: - b = "from %s import %s as foo_bar" % (old, member) - a = "from %s import %s as foo_bar" % (new, member) - self.check(b, a) + for old, new in self.modules.items(): + b = "from %s import foo as bar" % old + a = "from %s import foo as bar" % new + self.check(b, a) def test_star(self): - for old in self.modules: - s = "from %s import *" % old - self.warns_unchanged(s, "Cannot handle star imports") + for old, new in self.modules.items(): + b = "from %s import *" % old + a = "from %s import *" % new + self.check(b, a) def test_import_module_usage(self): - for old, (new, members) in list(self.modules.items()): - for member in members: - b = """ - import %s - foo(%s, %s.%s) - """ % (old, old, old, member) - a = """ - import %s - foo(%s, %s.%s) - """ % (new, new, new, member) - self.check(b, a) - - def test_from_import_usage(self): - for old, (new, members) in list(self.modules.items()): - for member in members: - b = """ - from %s import %s - foo(%s, %s()) - """ % (old, member, member, member) - a = """ - from %s import %s - foo(%s, %s()) - """ % (new, member, member, member) - self.check(b, a) + for old, new in self.modules.items(): b = """ - from %s import %s - foo(%s) - """ % (old, ", ".join(members), ", ".join(members)) + import %s + foo(%s.bar) + """ % (old, old) a = """ - from %s import %s - foo(%s) - """ % (new, ", ".join(members), ", ".join(members)) + import %s + foo(%s.bar) + """ % (new, new) self.check(b, a) From python-3000-checkins at python.org Thu Jul 17 05:19:15 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 05:19:15 +0200 (CEST) Subject: [Python-3000-checkins] r65058 - python/branches/py3k/Lib/test/test_macos.py Message-ID: <20080717031915.035761E4003@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 05:19:14 2008 New Revision: 65058 Log: kill test_macos Removed: python/branches/py3k/Lib/test/test_macos.py Deleted: python/branches/py3k/Lib/test/test_macos.py ============================================================================== --- python/branches/py3k/Lib/test/test_macos.py Thu Jul 17 05:19:14 2008 +++ (empty file) @@ -1,43 +0,0 @@ -import unittest -import MacOS -import Carbon.File -from test import test_support -import os - -TESTFN2 = test_support.TESTFN + '2' - -class TestMacOS(unittest.TestCase): - - def testOpenRF(self): - try: - fp = open(test_support.TESTFN, 'w') - fp.write('hello world\n') - fp.close() - - rfp = MacOS.openrf(test_support.TESTFN, '*wb') - rfp.write('goodbye world\n') - rfp.close() - - - fp = open(test_support.TESTFN, 'r') - data = fp.read() - fp.close() - self.assertEquals(data, 'hello world\n') - - rfp = MacOS.openrf(test_support.TESTFN, '*rb') - data = rfp.read(100) - data2 = rfp.read(100) - rfp.close() - self.assertEquals(data, 'goodbye world\n') - self.assertEquals(data2, '') - - - finally: - os.unlink(test_support.TESTFN) - -def test_main(): - test_support.run_unittest(TestMacOS) - - -if __name__ == '__main__': - test_main() From python-3000-checkins at python.org Thu Jul 17 18:10:53 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 18:10:53 +0200 (CEST) Subject: [Python-3000-checkins] r65062 - in python/branches/py3k: configure configure.in Message-ID: <20080717161053.099001E4009@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 18:10:34 2008 New Revision: 65062 Log: Merged revisions 65061 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65061 | benjamin.peterson | 2008-07-17 10:59:24 -0500 (Thu, 17 Jul 2008) | 1 line #3381 fix framework builds on 10.4 ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/configure python/branches/py3k/configure.in Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Thu Jul 17 18:10:34 2008 @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 64992 . +# From configure.in Revision: 65034 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -4588,6 +4588,8 @@ Darwin*) # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd # used to be here, but non-Apple gcc doesn't accept them. + + if test "${enable_universalsdk}"; then UNIVERSAL_ARCH_FLAGS="" if test "$UNIVERSAL_ARCHS" = "32-bit" ; then @@ -4610,8 +4612,33 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" - CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + tgt=`sw_vers -productVersion | sed 's/\(10\.0-9*\).*/\1/'` + if test "${UNIVERSALSDK}" != "/" -a "${tgt}" '>' '10.4' ; then + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + fi + fi + + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test ${cur_target} '>' 10.2; then + cur_target=10.3 fi + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a 4-way + # universal build is OSX 10.5, that's the first + # OS release where 4-way builds make sense. + cur_target='10.5' + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' ;; OSF*) @@ -12942,26 +12969,7 @@ Darwin/*) # Use -undefined dynamic_lookup whenever possible (10.3 and later). # This allows an extension to be used in any Python - cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` - if test ${cur_target} '>' 10.2; then - cur_target=10.3 - fi - if test "${UNIVERSAL_ARCHS}" = "all"; then - # Ensure that the default platform for a 4-way - # universal build is OSX 10.5, that's the first - # OS release where 4-way builds make sense. - cur_target='10.5' - fi - CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} - - # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the - # environment with a value that is the same as what we'll use - # in the Makefile to ensure that we'll get the same compiler - # environment during configure and build time. - MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" - export MACOSX_DEPLOYMENT_TARGET - EXPORT_MACOSX_DEPLOYMENT_TARGET='' if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then if test "${enable_universalsdk}"; then Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Thu Jul 17 18:10:34 2008 @@ -858,6 +858,8 @@ Darwin*) # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd # used to be here, but non-Apple gcc doesn't accept them. + + if test "${enable_universalsdk}"; then UNIVERSAL_ARCH_FLAGS="" if test "$UNIVERSAL_ARCHS" = "32-bit" ; then @@ -878,9 +880,34 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" - CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + tgt=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + if test "${UNIVERSALSDK}" != "/" -a "${tgt}" '>' '10.4' ; then + CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" + fi fi + # Calculate the right deployment target for this build. + # + cur_target=`sw_vers -productVersion | sed 's/\(10\.[[0-9]]*\).*/\1/'` + if test ${cur_target} '>' 10.2; then + cur_target=10.3 + fi + if test "${UNIVERSAL_ARCHS}" = "all"; then + # Ensure that the default platform for a 4-way + # universal build is OSX 10.5, that's the first + # OS release where 4-way builds make sense. + cur_target='10.5' + fi + CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} + + # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the + # environment with a value that is the same as what we'll use + # in the Makefile to ensure that we'll get the same compiler + # environment during configure and build time. + MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" + export MACOSX_DEPLOYMENT_TARGET + EXPORT_MACOSX_DEPLOYMENT_TARGET='' + ;; OSF*) BASECFLAGS="$BASECFLAGS -mieee" @@ -1550,26 +1577,7 @@ Darwin/*) # Use -undefined dynamic_lookup whenever possible (10.3 and later). # This allows an extension to be used in any Python - cur_target=`sw_vers -productVersion | sed 's/\(10\.[[0-9]]*\).*/\1/'` - if test ${cur_target} '>' 10.2; then - cur_target=10.3 - fi - if test "${UNIVERSAL_ARCHS}" = "all"; then - # Ensure that the default platform for a 4-way - # universal build is OSX 10.5, that's the first - # OS release where 4-way builds make sense. - cur_target='10.5' - fi - CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} - - # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the - # environment with a value that is the same as what we'll use - # in the Makefile to ensure that we'll get the same compiler - # environment during configure and build time. - MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" - export MACOSX_DEPLOYMENT_TARGET - EXPORT_MACOSX_DEPLOYMENT_TARGET='' if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 then if test "${enable_universalsdk}"; then From python-3000-checkins at python.org Thu Jul 17 18:23:53 2008 From: python-3000-checkins at python.org (guido.van.rossum) Date: Thu, 17 Jul 2008 18:23:53 +0200 (CEST) Subject: [Python-3000-checkins] r65063 - python/branches/py3k/setup.py Message-ID: <20080717162353.A888C1E4007@bag.python.org> Author: guido.van.rossum Date: Thu Jul 17 18:23:53 2008 New Revision: 65063 Log: Fix bug 3375 - _multiprocessing.so build problems on OS X. The solution is to clear sys.path_importer_cache. Modified: python/branches/py3k/setup.py Modified: python/branches/py3k/setup.py ============================================================================== --- python/branches/py3k/setup.py (original) +++ python/branches/py3k/setup.py Thu Jul 17 18:23:53 2008 @@ -263,6 +263,12 @@ ext_filename = os.path.join( self.build_lib, self.get_ext_filename(self.get_ext_fullname(ext.name))) + + # If the build directory didn't exist when setup.py was + # started, sys.path_importer_cache has a negative result + # cached. Clear that cache before trying to import. + sys.path_importer_cache.clear() + try: imp.load_dynamic(ext.name, ext_filename) except ImportError as why: From python-3000-checkins at python.org Thu Jul 17 18:37:17 2008 From: python-3000-checkins at python.org (jeremy.hylton) Date: Thu, 17 Jul 2008 18:37:17 +0200 (CEST) Subject: [Python-3000-checkins] r65064 - python/branches/py3k/Python/ast.c Message-ID: <20080717163717.923361E4007@bag.python.org> Author: jeremy.hylton Date: Thu Jul 17 18:37:17 2008 New Revision: 65064 Log: Fix uninitialized memory read for cases like def(f, *): pass There's not much interesting here. The old code read uninitialized memory but at worst incremented i past NCH(n), but no bad effects followed from that. Modified: python/branches/py3k/Python/ast.c Modified: python/branches/py3k/Python/ast.c ============================================================================== --- python/branches/py3k/Python/ast.c (original) +++ python/branches/py3k/Python/ast.c Thu Jul 17 18:37:17 2008 @@ -742,15 +742,21 @@ } assert(TYPE(n) == typedargslist || TYPE(n) == varargslist); - /* first count the number of positional args & defaults */ + /* First count the number of positional args & defaults. The + variable i is the loop index for this for loop and the next. + The next loop picks up where the first leaves off. + */ for (i = 0; i < NCH(n); i++) { ch = CHILD(n, i); if (TYPE(ch) == STAR) { - /* skip star and possible argument */ + /* skip star */ i++; - i += (TYPE(CHILD(n, i)) == tfpdef - || TYPE(CHILD(n, i)) == vfpdef); - break; + if (i < NCH(n) && /* skip argument following star */ + (TYPE(CHILD(n, i)) == tfpdef || + TYPE(CHILD(n, i)) == vfpdef)) { + i++; + } + break; } if (TYPE(ch) == DOUBLESTAR) break; if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++; From python-3000-checkins at python.org Thu Jul 17 18:49:17 2008 From: python-3000-checkins at python.org (jesse.noller) Date: Thu, 17 Jul 2008 18:49:17 +0200 (CEST) Subject: [Python-3000-checkins] r65065 - in python/branches/py3k: Lib/test/test_threading.py Lib/threading.py Python/ceval.c Message-ID: <20080717164918.0135B1E4016@bag.python.org> Author: jesse.noller Date: Thu Jul 17 18:49:17 2008 New Revision: 65065 Log: Merger 65032 to py3k Modified: python/branches/py3k/Lib/test/test_threading.py python/branches/py3k/Lib/threading.py python/branches/py3k/Python/ceval.c Modified: python/branches/py3k/Lib/test/test_threading.py ============================================================================== --- python/branches/py3k/Lib/test/test_threading.py (original) +++ python/branches/py3k/Lib/test/test_threading.py Thu Jul 17 18:49:17 2008 @@ -324,6 +324,82 @@ sys.getrefcount(weak_raising_cyclic_object()))) +class ThreadJoinOnShutdown(unittest.TestCase): + + def _run_and_join(self, script): + script = """if 1: + import sys, os, time, threading + + # a thread, which waits for the main program to terminate + def joiningfunc(mainthread): + mainthread.join() + print('end of thread') + \n""" + script + + import subprocess + p = subprocess.Popen([sys.executable, "-c", script], stdout=subprocess.PIPE) + rc = p.wait() + self.assertEqual(p.stdout.read(), "end of main\nend of thread\n") + self.failIf(rc == 2, "interpreter was blocked") + self.failUnless(rc == 0, "Unexpected error") + + def test_1_join_on_shutdown(self): + # The usual case: on exit, wait for a non-daemon thread + script = """if 1: + import os + t = threading.Thread(target=joiningfunc, + args=(threading.current_thread(),)) + t.start() + time.sleep(0.1) + print('end of main') + """ + self._run_and_join(script) + + + def test_2_join_in_forked_process(self): + # Like the test above, but from a forked interpreter + import os + if not hasattr(os, 'fork'): + return + script = """if 1: + childpid = os.fork() + if childpid != 0: + os.waitpid(childpid, 0) + sys.exit(0) + + t = threading.Thread(target=joiningfunc, + args=(threading.current_thread(),)) + t.start() + print('end of main') + """ + self._run_and_join(script) + + def test_3_join_in_forked_from_thread(self): + # Like the test above, but fork() was called from a worker thread + # In the forked process, the main Thread object must be marked as stopped. + import os + if not hasattr(os, 'fork'): + return + script = """if 1: + main_thread = threading.current_thread() + def worker(): + childpid = os.fork() + if childpid != 0: + os.waitpid(childpid, 0) + sys.exit(0) + + t = threading.Thread(target=joiningfunc, + args=(main_thread,)) + print('end of main') + t.start() + t.join() # Should not block: main_thread is already stopped + + w = threading.Thread(target=worker) + w.start() + """ + self._run_and_join(script) + + class ThreadingExceptionTests(unittest.TestCase): # A RuntimeError should be raised if Thread.start() is called # multiple times. @@ -364,7 +440,9 @@ def test_main(): test.support.run_unittest(ThreadTests, - ThreadingExceptionTests) + ThreadJoinOnShutdown, + ThreadingExceptionTests, + ) if __name__ == "__main__": test_main() Modified: python/branches/py3k/Lib/threading.py ============================================================================== --- python/branches/py3k/Lib/threading.py (original) +++ python/branches/py3k/Lib/threading.py Thu Jul 17 18:49:17 2008 @@ -783,6 +783,37 @@ from _threading_local import local +def _after_fork(): + # This function is called by Python/ceval.c:PyEval_ReInitThreads which + # is called from PyOS_AfterFork. Here we cleanup threading module state + # that should not exist after a fork. + + # Reset _active_limbo_lock, in case we forked while the lock was held + # by another (non-forked) thread. http://bugs.python.org/issue874900 + global _active_limbo_lock + _active_limbo_lock = _allocate_lock() + + # fork() only copied the current thread; clear references to others. + new_active = {} + current = current_thread() + with _active_limbo_lock: + for ident, thread in _active.items(): + if thread is current: + # There is only one active thread. + new_active[ident] = thread + else: + # All the others are already stopped. + # We don't call _Thread__stop() because it tries to acquire + # thread._Thread__block which could also have been held while + # we forked. + thread._Thread__stopped = True + + _limbo.clear() + _active.clear() + _active.update(new_active) + assert len(_active) == 1 + + # Self-test code def _test(): Modified: python/branches/py3k/Python/ceval.c ============================================================================== --- python/branches/py3k/Python/ceval.c (original) +++ python/branches/py3k/Python/ceval.c Thu Jul 17 18:49:17 2008 @@ -266,6 +266,9 @@ void PyEval_ReInitThreads(void) { + PyObject *threading, *result; + PyThreadState *tstate; + if (!interpreter_lock) return; /*XXX Can't use PyThread_free_lock here because it does too @@ -275,6 +278,23 @@ interpreter_lock = PyThread_allocate_lock(); PyThread_acquire_lock(interpreter_lock, 1); main_thread = PyThread_get_thread_ident(); + + /* Update the threading module with the new state. + */ + tstate = PyThreadState_GET(); + threading = PyMapping_GetItemString(tstate->interp->modules, + "threading"); + if (threading == NULL) { + /* threading not imported */ + PyErr_Clear(); + return; + } + result = PyObject_CallMethod(threading, "_after_fork", NULL); + if (result == NULL) + PyErr_WriteUnraisable(threading); + else + Py_DECREF(result); + Py_DECREF(threading); } #endif From python-3000-checkins at python.org Thu Jul 17 18:55:47 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 18:55:47 +0200 (CEST) Subject: [Python-3000-checkins] r65066 - python/branches/py3k/Lib/test/test_threading.py Message-ID: <20080717165547.8A8D61E4007@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 18:55:47 2008 New Revision: 65066 Log: fix 2/3 of test_threading Modified: python/branches/py3k/Lib/test/test_threading.py Modified: python/branches/py3k/Lib/test/test_threading.py ============================================================================== --- python/branches/py3k/Lib/test/test_threading.py (original) +++ python/branches/py3k/Lib/test/test_threading.py Thu Jul 17 18:55:47 2008 @@ -339,7 +339,7 @@ import subprocess p = subprocess.Popen([sys.executable, "-c", script], stdout=subprocess.PIPE) rc = p.wait() - self.assertEqual(p.stdout.read(), "end of main\nend of thread\n") + self.assertEqual(p.stdout.read().decode(), "end of main\nend of thread\n") self.failIf(rc == 2, "interpreter was blocked") self.failUnless(rc == 0, "Unexpected error") From python-3000-checkins at python.org Thu Jul 17 19:02:58 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 19:02:58 +0200 (CEST) Subject: [Python-3000-checkins] r65067 - in python/branches/py3k: Lib/test/test_threading.py Message-ID: <20080717170258.227BE1E4009@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 19:02:57 2008 New Revision: 65067 Log: Merged revisions 65059 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65059 | benjamin.peterson | 2008-07-17 07:57:22 -0500 (Thu, 17 Jul 2008) | 1 line try to fix test_threading on the Windows bot ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_threading.py Modified: python/branches/py3k/Lib/test/test_threading.py ============================================================================== --- python/branches/py3k/Lib/test/test_threading.py (original) +++ python/branches/py3k/Lib/test/test_threading.py Thu Jul 17 19:02:57 2008 @@ -339,7 +339,8 @@ import subprocess p = subprocess.Popen([sys.executable, "-c", script], stdout=subprocess.PIPE) rc = p.wait() - self.assertEqual(p.stdout.read().decode(), "end of main\nend of thread\n") + data = p.stdout.read().decode().replace('\r', '') + self.assertEqual(data, "end of main\nend of thread\n") self.failIf(rc == 2, "interpreter was blocked") self.failUnless(rc == 0, "Unexpected error") From python-3000-checkins at python.org Thu Jul 17 19:03:47 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 17 Jul 2008 19:03:47 +0200 (CEST) Subject: [Python-3000-checkins] r65068 - python/branches/py3k/Lib/test/test_threading.py Message-ID: <20080717170347.181AA1E4009@bag.python.org> Author: benjamin.peterson Date: Thu Jul 17 19:03:46 2008 New Revision: 65068 Log: XXX disable hanging test Modified: python/branches/py3k/Lib/test/test_threading.py Modified: python/branches/py3k/Lib/test/test_threading.py ============================================================================== --- python/branches/py3k/Lib/test/test_threading.py (original) +++ python/branches/py3k/Lib/test/test_threading.py Thu Jul 17 19:03:46 2008 @@ -375,7 +375,8 @@ """ self._run_and_join(script) - def test_3_join_in_forked_from_thread(self): + # XXX This test hangs! + def Xtest_3_join_in_forked_from_thread(self): # Like the test above, but fork() was called from a worker thread # In the forked process, the main Thread object must be marked as stopped. import os From python-3000-checkins at python.org Thu Jul 17 20:15:35 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Thu, 17 Jul 2008 20:15:35 +0200 (CEST) Subject: [Python-3000-checkins] r65071 - in python/branches/py3k: Doc/library/gettext.rst Lib/gettext.py Misc/NEWS Message-ID: <20080717181535.8E6E01E4005@bag.python.org> Author: georg.brandl Date: Thu Jul 17 20:15:35 2008 New Revision: 65071 Log: Make gettext Unicode interface consistent and clean up the docs. Modified: python/branches/py3k/Doc/library/gettext.rst python/branches/py3k/Lib/gettext.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Doc/library/gettext.rst ============================================================================== --- python/branches/py3k/Doc/library/gettext.rst (original) +++ python/branches/py3k/Doc/library/gettext.rst Thu Jul 17 20:15:35 2008 @@ -66,8 +66,8 @@ .. function:: lgettext(message) - Equivalent to :func:`gettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with + Equivalent to :func:`gettext`, but the translation is returned in the + preferred system encoding, if no other encoding was explicitly set with :func:`bind_textdomain_codeset`. @@ -78,8 +78,8 @@ .. function:: ldgettext(domain, message) - Equivalent to :func:`dgettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with + Equivalent to :func:`dgettext`, but the translation is returned in the + preferred system encoding, if no other encoding was explicitly set with :func:`bind_textdomain_codeset`. @@ -99,8 +99,8 @@ .. function:: lngettext(singular, plural, n) - Equivalent to :func:`ngettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with + Equivalent to :func:`ngettext`, but the translation is returned in the + preferred system encoding, if no other encoding was explicitly set with :func:`bind_textdomain_codeset`. @@ -169,13 +169,14 @@ .. function:: translation(domain[, localedir[, languages[, class_[, fallback[, codeset]]]]]) - Return a :class:`Translations` instance based on the *domain*, *localedir*, and - *languages*, which are first passed to :func:`find` to get a list of the + Return a :class:`Translations` instance based on the *domain*, *localedir*, + and *languages*, which are first passed to :func:`find` to get a list of the associated :file:`.mo` file paths. Instances with identical :file:`.mo` file - names are cached. The actual class instantiated is either *class_* if provided, - otherwise :class:`GNUTranslations`. The class's constructor must take a single - file object argument. If provided, *codeset* will change the charset used to - encode translated strings. + names are cached. The actual class instantiated is either *class_* if + provided, otherwise :class:`GNUTranslations`. The class's constructor must + take a single file object argument. If provided, *codeset* will change the + charset used to encode translated strings in the :meth:`lgettext` and + :meth:`lngettext` methods. If multiple files are found, later files are used as fallbacks for earlier ones. To allow setting the fallback, :func:`copy.copy` is used to clone each @@ -187,7 +188,7 @@ :class:`NullTranslations` instance if *fallback* is true. -.. function:: install(domain[, localedir [, codeset[, names]]]]) +.. function:: install(domain[, localedir[, codeset[, names]]]]) This installs the function :func:`_` in Python's builtin namespace, based on *domain*, *localedir*, and *codeset* which are passed to the function @@ -225,92 +226,92 @@ :meth:`add_fallback`. It then calls ``self._parse(fp)`` if *fp* is not ``None``. + .. method:: _parse(fp) - .. method:: NullTranslations._parse(fp) - - No-op'd in the base class, this method takes file object *fp*, and reads the - data from the file, initializing its message catalog. If you have an - unsupported message catalog file format, you should override this method to - parse your format. + No-op'd in the base class, this method takes file object *fp*, and reads + the data from the file, initializing its message catalog. If you have an + unsupported message catalog file format, you should override this method + to parse your format. - .. method:: NullTranslations.add_fallback(fallback) + .. method:: add_fallback(fallback) - Add *fallback* as the fallback object for the current translation object. A - translation object should consult the fallback if it cannot provide a - translation for a given message. + Add *fallback* as the fallback object for the current translation object. + A translation object should consult the fallback if it cannot provide a + translation for a given message. - .. method:: NullTranslations.gettext(message) + .. method:: gettext(message) - If a fallback has been set, forward :meth:`gettext` to the fallback. Otherwise, - return the translated message. Overridden in derived classes. + If a fallback has been set, forward :meth:`gettext` to the fallback. + Otherwise, return the translated message. Overridden in derived classes. - .. method:: NullTranslations.lgettext(message) + .. method:: lgettext(message) - If a fallback has been set, forward :meth:`lgettext` to the fallback. Otherwise, - return the translated message. Overridden in derived classes. + If a fallback has been set, forward :meth:`lgettext` to the fallback. + Otherwise, return the translated message. Overridden in derived classes. - .. method:: NullTranslations.ngettext(singular, plural, n) + .. method:: ngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. Otherwise, - return the translated message. Overridden in derived classes. + If a fallback has been set, forward :meth:`ngettext` to the fallback. + Otherwise, return the translated message. Overridden in derived classes. - .. method:: NullTranslations.lngettext(singular, plural, n) + .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. Otherwise, - return the translated message. Overridden in derived classes. + If a fallback has been set, forward :meth:`ngettext` to the fallback. + Otherwise, return the translated message. Overridden in derived classes. - .. method:: NullTranslations.info() + .. method:: info() - Return the "protected" :attr:`_info` variable. + Return the "protected" :attr:`_info` variable. - .. method:: NullTranslations.charset() + .. method:: charset() - Return the "protected" :attr:`_charset` variable. + Return the "protected" :attr:`_charset` variable, which is the encoding of + the message catalog file. - .. method:: NullTranslations.output_charset() + .. method:: output_charset() - Return the "protected" :attr:`_output_charset` variable, which defines the - encoding used to return translated messages. + Return the "protected" :attr:`_output_charset` variable, which defines the + encoding used to return translated messages in :meth:`lgettext` and + :meth:`lngettext`. - .. method:: NullTranslations.set_output_charset(charset) + .. method:: set_output_charset(charset) - Change the "protected" :attr:`_output_charset` variable, which defines the - encoding used to return translated messages. + Change the "protected" :attr:`_output_charset` variable, which defines the + encoding used to return translated messages. - .. method:: NullTranslations.install([names]) + .. method:: install([names]) - this method installs :meth:`self.gettext` into the built-in namespace, - binding it to ``_``. + This method installs :meth:`self.gettext` into the built-in namespace, + binding it to ``_``. - If the *names* parameter is given, it must be a sequence containing - the names of functions you want to install in the builtin namespace - in addition to :func:`_`. Supported names are ``'gettext'`` (bound - to :meth:`self.gettext`), ``'ngettext'`` (bound to - :meth:`self.ngettext`), ``'lgettext'`` and ``'lngettext'``. + If the *names* parameter is given, it must be a sequence containing the + names of functions you want to install in the builtin namespace in + addition to :func:`_`. Supported names are ``'gettext'`` (bound to + :meth:`self.gettext`), ``'ngettext'`` (bound to :meth:`self.ngettext`), + ``'lgettext'`` and ``'lngettext'``. - Note that this is only one way, albeit the most convenient way, to - make the :func:`_` function available to your application. Because - it affects the entire application globally, and specifically the - built-in namespace, localized modules should never install - :func:`_`. Instead, they should use this code to make :func:`_` - available to their module:: + Note that this is only one way, albeit the most convenient way, to make + the :func:`_` function available to your application. Because it affects + the entire application globally, and specifically the built-in namespace, + localized modules should never install :func:`_`. Instead, they should use + this code to make :func:`_` available to their module:: - import gettext - t = gettext.translation('mymodule', ...) - _ = t.gettext + import gettext + t = gettext.translation('mymodule', ...) + _ = t.gettext - This puts :func:`_` only in the module's global namespace and so only - affects calls within this module. + This puts :func:`_` only in the module's global namespace and so only + affects calls within this module. The :class:`GNUTranslations` class @@ -329,7 +330,10 @@ initialize the "protected" :attr:`_charset` instance variable, defaulting to ``None`` if not found. If the charset encoding is specified, then all message ids and message strings read from the catalog are converted to Unicode using -this encoding. +this encoding, else ASCII encoding is assumed. + +Since message ids are read as Unicode strings too, all :meth:`*gettext` methods +will assume message ids as Unicode strings, not byte strings. The entire set of key/value pairs are placed into a dictionary and set as the "protected" :attr:`_info` instance variable. @@ -344,25 +348,23 @@ .. method:: GNUTranslations.gettext(message) Look up the *message* id in the catalog and return the corresponding message - string, as a bytestring encoded with the catalog's charset encoding, if - known. If there is no entry in the catalog for the *message* id, and a fallback - has been set, the look up is forwarded to the fallback's :meth:`gettext` method. - Otherwise, the *message* id is returned. + string, as a Unicode string. If there is no entry in the catalog for the + *message* id, and a fallback has been set, the look up is forwarded to the + fallback's :meth:`gettext` method. Otherwise, the *message* id is returned. .. method:: GNUTranslations.lgettext(message) - Equivalent to :meth:`gettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with - :meth:`set_output_charset`. + Equivalent to :meth:`gettext`, but the translation is returned as a + bytestring encoded in the selected output charset, or in the preferred system + encoding if no encoding was explicitly set with :meth:`set_output_charset`. .. method:: GNUTranslations.ngettext(singular, plural, n) Do a plural-forms lookup of a message id. *singular* is used as the message id for purposes of lookup in the catalog, while *n* is used to determine which - plural form to use. The returned message string is a bytestring encoded with - the catalog's charset encoding, if known. + plural form to use. The returned message string is a Unicode string. If the message id is not found in the catalog, and a fallback is specified, the request is forwarded to the fallback's :meth:`ngettext` method. Otherwise, when @@ -380,9 +382,9 @@ .. method:: GNUTranslations.lngettext(singular, plural, n) - Equivalent to :meth:`gettext`, but the translation is returned in the preferred - system encoding, if no other encoding was explicitly set with - :meth:`set_output_charset`. + Equivalent to :meth:`gettext`, but the translation is returned as a + bytestring encoded in the selected output charset, or in the preferred system + encoding if no encoding was explicitly set with :meth:`set_output_charset`. Solaris message catalog support @@ -609,21 +611,6 @@ this through the use of command line switches. -:func:`gettext` vs. :func:`lgettext` -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -In Python 2.4 the :func:`lgettext` family of functions were introduced. The -intention of these functions is to provide an alternative which is more -compliant with the current implementation of GNU gettext. Unlike -:func:`gettext`, which returns strings encoded with the same codeset used in the -translation file, :func:`lgettext` will return strings encoded with the -preferred system encoding, as returned by :func:`locale.getpreferredencoding`. -Also notice that Python 2.4 introduces new functions to explicitly choose the -codeset used in translated strings. If a codeset is explicitly set, even -:func:`lgettext` will return translated strings in the requested codeset, as -would be expected in the GNU gettext implementation. - - Acknowledgements ---------------- Modified: python/branches/py3k/Lib/gettext.py ============================================================================== --- python/branches/py3k/Lib/gettext.py (original) +++ python/branches/py3k/Lib/gettext.py Thu Jul 17 20:15:35 2008 @@ -304,26 +304,16 @@ # cause no problems since us-ascii should always be a subset of # the charset encoding. We may want to fall back to 8-bit msgids # if the Unicode conversion fails. + charset = self._charset or 'ascii' if b'\x00' in msg: # Plural forms msgid1, msgid2 = msg.split(b'\x00') tmsg = tmsg.split(b'\x00') - if self._charset: - msgid1 = str(msgid1, self._charset) - tmsg = [str(x, self._charset) for x in tmsg] - else: - msgid1 = str(msgid1) - tmsg = [str(x) for x in tmsg] - for i in range(len(tmsg)): - catalog[(msgid1, i)] = tmsg[i] + msgid1 = str(msgid1, charset) + for i, x in enumerate(tmsg): + catalog[(msgid1, i)] = str(x, charset) else: - if self._charset: - msg = str(msg, self._charset) - tmsg = str(tmsg, self._charset) - else: - msg = str(msg) - tmsg = str(tmsg) - catalog[msg] = tmsg + catalog[str(msg, charset)] = str(tmsg, charset) # advance to next entry in the seek tables masteridx += 8 transidx += 8 @@ -359,7 +349,7 @@ if tmsg is missing: if self._fallback: return self._fallback.gettext(message) - return str(message) + return message return tmsg def ngettext(self, msgid1, msgid2, n): @@ -369,9 +359,9 @@ if self._fallback: return self._fallback.ngettext(msgid1, msgid2, n) if n == 1: - tmsg = str(msgid1) + tmsg = msgid1 else: - tmsg = str(msgid2) + tmsg = msgid2 return tmsg Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Thu Jul 17 20:15:35 2008 @@ -47,8 +47,8 @@ code of every single module of the standard library, including invalid files used in the test suite. -- All the u* variant functions and methods in gettext have been renamed to their - none u* siblings. +- The gettext library now consistently uses Unicode strings for message ids + and message strings, and ``ugettext()`` and the like don't exist anymore. - The traceback module has been expanded to handle chained exceptions. From python-3000-checkins at python.org Thu Jul 17 20:17:20 2008 From: python-3000-checkins at python.org (bill.janssen) Date: Thu, 17 Jul 2008 20:17:20 +0200 (CEST) Subject: [Python-3000-checkins] r65072 - python/branches/py3k/Lib/test/test_ssl.py Message-ID: <20080717181720.7E88A1E4005@bag.python.org> Author: bill.janssen Date: Thu Jul 17 20:17:20 2008 New Revision: 65072 Log: catch socket.error errors in badCertTest Modified: python/branches/py3k/Lib/test/test_ssl.py Modified: python/branches/py3k/Lib/test/test_ssl.py ============================================================================== --- python/branches/py3k/Lib/test/test_ssl.py (original) +++ python/branches/py3k/Lib/test/test_ssl.py Thu Jul 17 20:17:20 2008 @@ -601,6 +601,9 @@ except ssl.SSLError as x: if support.verbose: sys.stdout.write("\nSSLError is %s\n" % x) + except socket.error as x: + if support.verbose: + sys.stdout.write("\nsocket.error is %s\n" % x) else: raise support.TestFailed( "Use of invalid cert should have failed!") From python-3000-checkins at python.org Thu Jul 17 20:30:48 2008 From: python-3000-checkins at python.org (eric.smith) Date: Thu, 17 Jul 2008 20:30:48 +0200 (CEST) Subject: [Python-3000-checkins] r65073 - in python/branches/py3k: Doc/library/stdtypes.rst Doc/library/string.rst Lib/test/test_format.py Lib/test/test_types.py Misc/NEWS Objects/stringlib/formatter.h Objects/unicodeobject.c Message-ID: <20080717183048.A70E81E4004@bag.python.org> Author: eric.smith Date: Thu Jul 17 20:30:48 2008 New Revision: 65073 Log: Merged revisions 65069 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65069 | eric.smith | 2008-07-17 13:48:39 -0400 (Thu, 17 Jul 2008) | 1 line Issue 3382: Make '%F' and float.__format__('F') convert results to upper case. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/library/string.rst python/branches/py3k/Lib/test/test_format.py python/branches/py3k/Lib/test/test_types.py python/branches/py3k/Misc/NEWS python/branches/py3k/Objects/stringlib/formatter.h python/branches/py3k/Objects/unicodeobject.c Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Thu Jul 17 20:30:48 2008 @@ -1223,9 +1223,9 @@ +------------+-----------------------------------------------------+-------+ | ``'E'`` | Floating point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format. | \(3) | +| ``'f'`` | Floating point decimal format (lowercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format. | \(3) | +| ``'F'`` | Floating point decimal format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ | ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Thu Jul 17 20:30:48 2008 @@ -402,13 +402,14 @@ | ``'e'`` | Exponent notation. Prints the number in scientific | | | notation using the letter 'e' to indicate the exponent. | +---------+----------------------------------------------------------+ - | ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an | - | | upper case 'E' as the separator character. | + | ``'E'`` | Exponent notation. Same as ``'e'`` except it converts | + | | the number to upper case. | +---------+----------------------------------------------------------+ | ``'f'`` | Fixed point. Displays the number as a fixed-point | | | number. | +---------+----------------------------------------------------------+ - | ``'F'`` | Fixed point. Same as ``'f'``. | + | ``'F'`` | Fixed point. Same as ``'f'`` except it converts the | + | | number to upper case. | +---------+----------------------------------------------------------+ | ``'g'`` | General format. This prints the number as a fixed-point | | | number, unless the number is too large, in which case | Modified: python/branches/py3k/Lib/test/test_format.py ============================================================================== --- python/branches/py3k/Lib/test/test_format.py (original) +++ python/branches/py3k/Lib/test/test_format.py Thu Jul 17 20:30:48 2008 @@ -79,6 +79,17 @@ testformat("%#.*f", (110, -1.e+100/3.)) testformat("%#.*F", (110, -1.e+100/3.)) overflowrequired = 0 + # check for %f and %F + testformat("%f", (1.0,), "1.000000") + testformat("%F", (1.0,), "1.000000") + testformat("%f", (1e100,), "1e+100") + testformat("%F", (1e100,), "1E+100") + testformat("%f", (1e100,), "1e+100") + testformat("%F", (1e100,), "1E+100") + testformat("%f", (float('nan'),), "nan") + testformat("%F", (float('nan'),), "NAN") + testformat("%f", (float('inf'),), "inf") + testformat("%F", (float('inf'),), "INF") # Formatting of integers. Overflow is not ok overflowok = 0 testformat("%x", 10, "a") Modified: python/branches/py3k/Lib/test/test_types.py ============================================================================== --- python/branches/py3k/Lib/test/test_types.py (original) +++ python/branches/py3k/Lib/test/test_types.py Thu Jul 17 20:30:48 2008 @@ -514,9 +514,17 @@ test( 1.0, '+f', '+1.000000') test(-1.0, '+f', '-1.000000') test(1.1234e90, 'f', '1.1234e+90') - test(1.1234e90, 'F', '1.1234e+90') + test(1.1234e90, 'F', '1.1234E+90') test(1.1234e200, 'f', '1.1234e+200') - test(1.1234e200, 'F', '1.1234e+200') + test(1.1234e200, 'F', '1.1234E+200') + test(1e100, 'x<20f', '1e+100xxxxxxxxxxxxxx') + test(1e100, 'x<20F', '1E+100xxxxxxxxxxxxxx') + test(float('nan'), 'f', 'nan') + test(float('nan'), 'F', 'NAN') + test(float('inf'), 'f', 'inf') + test(float('inf'), 'F', 'INF') + test(float('-inf'), 'f', '-inf') + test(float('-inf'), 'F', '-INF') test( 1.0, 'e', '1.000000e+00') test(-1.0, 'e', '-1.000000e+00') Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Thu Jul 17 20:30:48 2008 @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Issue #3382: Make '%F' and float.__format__('F') convert results + to uppercase. + - Issue #3008: the float type has a new instance method 'float.hex' and a new class method 'float.fromhex' to convert floating-point numbers to and from hexadecimal strings, respectively. Modified: python/branches/py3k/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k/Objects/stringlib/formatter.h (original) +++ python/branches/py3k/Objects/stringlib/formatter.h Thu Jul 17 20:30:48 2008 @@ -741,10 +741,6 @@ /* first, do the conversion as 8-bit chars, using the platform's snprintf. then, if needed, convert to unicode. */ - /* 'F' is the same as 'f', per the PEP */ - if (type == 'F') - type = 'f'; - x = PyFloat_AsDouble(value); if (x == -1.0 && PyErr_Occurred()) @@ -758,8 +754,12 @@ if (precision < 0) precision = 6; - if (type == 'f' && (fabs(x) / 1e25) >= 1e25) - type = 'g'; + if ((type == 'f' || type == 'F') && (fabs(x) / 1e25) >= 1e25) { + if (type == 'f') + type = 'g'; + else + type = 'G'; + } /* cast "type", because if we're in unicode we need to pass a 8-bit char. this is safe, because we've restricted what "type" Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Thu Jul 17 20:30:48 2008 @@ -8588,8 +8588,12 @@ return -1; if (prec < 0) prec = 6; - if (type == 'f' && (fabs(x) / 1e25) >= 1e25) - type = 'g'; + if ((type == 'f' || type == 'F') && (fabs(x) / 1e25) >= 1e25) { + if (type == 'f') + type = 'g'; + else + type = 'G'; + } /* Worst case length calc to ensure no buffer overrun: 'g' formats: @@ -8608,7 +8612,8 @@ */ if (((type == 'g' || type == 'G') && buflen <= (size_t)10 + (size_t)prec) || - (type == 'f' && buflen <= (size_t)53 + (size_t)prec)) { + ((type == 'f' || type == 'F') && + buflen <= (size_t)53 + (size_t)prec)) { PyErr_SetString(PyExc_OverflowError, "formatted float is too long (precision too large?)"); return -1; @@ -9091,8 +9096,6 @@ case 'F': case 'g': case 'G': - if (c == 'F') - c = 'f'; pbuf = formatbuf; len = formatfloat(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), flags, prec, c, v); From python-3000-checkins at python.org Thu Jul 17 21:18:30 2008 From: python-3000-checkins at python.org (eric.smith) Date: Thu, 17 Jul 2008 21:18:30 +0200 (CEST) Subject: [Python-3000-checkins] r65074 - in python/branches/py3k: Doc/library/stdtypes.rst Doc/library/string.rst Lib/test/test_format.py Lib/test/test_types.py Misc/NEWS Objects/stringlib/formatter.h Objects/unicodeobject.c Message-ID: <20080717191830.2F8581E4004@bag.python.org> Author: eric.smith Date: Thu Jul 17 21:18:29 2008 New Revision: 65074 Log: Backed out r65073, pending fixing it in Windows. Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/stdtypes.rst python/branches/py3k/Doc/library/string.rst python/branches/py3k/Lib/test/test_format.py python/branches/py3k/Lib/test/test_types.py python/branches/py3k/Misc/NEWS python/branches/py3k/Objects/stringlib/formatter.h python/branches/py3k/Objects/unicodeobject.c Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Thu Jul 17 21:18:29 2008 @@ -1223,9 +1223,9 @@ +------------+-----------------------------------------------------+-------+ | ``'E'`` | Floating point exponential format (uppercase). | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'f'`` | Floating point decimal format (lowercase). | \(3) | +| ``'f'`` | Floating point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ -| ``'F'`` | Floating point decimal format (uppercase). | \(3) | +| ``'F'`` | Floating point decimal format. | \(3) | +------------+-----------------------------------------------------+-------+ | ``'g'`` | Floating point format. Uses lowercase exponential | \(4) | | | format if exponent is less than -4 or not less than | | Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Thu Jul 17 21:18:29 2008 @@ -402,14 +402,13 @@ | ``'e'`` | Exponent notation. Prints the number in scientific | | | notation using the letter 'e' to indicate the exponent. | +---------+----------------------------------------------------------+ - | ``'E'`` | Exponent notation. Same as ``'e'`` except it converts | - | | the number to upper case. | + | ``'E'`` | Exponent notation. Same as ``'e'`` except it uses an | + | | upper case 'E' as the separator character. | +---------+----------------------------------------------------------+ | ``'f'`` | Fixed point. Displays the number as a fixed-point | | | number. | +---------+----------------------------------------------------------+ - | ``'F'`` | Fixed point. Same as ``'f'`` except it converts the | - | | number to upper case. | + | ``'F'`` | Fixed point. Same as ``'f'``. | +---------+----------------------------------------------------------+ | ``'g'`` | General format. This prints the number as a fixed-point | | | number, unless the number is too large, in which case | Modified: python/branches/py3k/Lib/test/test_format.py ============================================================================== --- python/branches/py3k/Lib/test/test_format.py (original) +++ python/branches/py3k/Lib/test/test_format.py Thu Jul 17 21:18:29 2008 @@ -79,17 +79,6 @@ testformat("%#.*f", (110, -1.e+100/3.)) testformat("%#.*F", (110, -1.e+100/3.)) overflowrequired = 0 - # check for %f and %F - testformat("%f", (1.0,), "1.000000") - testformat("%F", (1.0,), "1.000000") - testformat("%f", (1e100,), "1e+100") - testformat("%F", (1e100,), "1E+100") - testformat("%f", (1e100,), "1e+100") - testformat("%F", (1e100,), "1E+100") - testformat("%f", (float('nan'),), "nan") - testformat("%F", (float('nan'),), "NAN") - testformat("%f", (float('inf'),), "inf") - testformat("%F", (float('inf'),), "INF") # Formatting of integers. Overflow is not ok overflowok = 0 testformat("%x", 10, "a") Modified: python/branches/py3k/Lib/test/test_types.py ============================================================================== --- python/branches/py3k/Lib/test/test_types.py (original) +++ python/branches/py3k/Lib/test/test_types.py Thu Jul 17 21:18:29 2008 @@ -514,17 +514,9 @@ test( 1.0, '+f', '+1.000000') test(-1.0, '+f', '-1.000000') test(1.1234e90, 'f', '1.1234e+90') - test(1.1234e90, 'F', '1.1234E+90') + test(1.1234e90, 'F', '1.1234e+90') test(1.1234e200, 'f', '1.1234e+200') - test(1.1234e200, 'F', '1.1234E+200') - test(1e100, 'x<20f', '1e+100xxxxxxxxxxxxxx') - test(1e100, 'x<20F', '1E+100xxxxxxxxxxxxxx') - test(float('nan'), 'f', 'nan') - test(float('nan'), 'F', 'NAN') - test(float('inf'), 'f', 'inf') - test(float('inf'), 'F', 'INF') - test(float('-inf'), 'f', '-inf') - test(float('-inf'), 'F', '-INF') + test(1.1234e200, 'F', '1.1234e+200') test( 1.0, 'e', '1.000000e+00') test(-1.0, 'e', '-1.000000e+00') Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Thu Jul 17 21:18:29 2008 @@ -12,9 +12,6 @@ Core and Builtins ----------------- -- Issue #3382: Make '%F' and float.__format__('F') convert results - to uppercase. - - Issue #3008: the float type has a new instance method 'float.hex' and a new class method 'float.fromhex' to convert floating-point numbers to and from hexadecimal strings, respectively. Modified: python/branches/py3k/Objects/stringlib/formatter.h ============================================================================== --- python/branches/py3k/Objects/stringlib/formatter.h (original) +++ python/branches/py3k/Objects/stringlib/formatter.h Thu Jul 17 21:18:29 2008 @@ -741,6 +741,10 @@ /* first, do the conversion as 8-bit chars, using the platform's snprintf. then, if needed, convert to unicode. */ + /* 'F' is the same as 'f', per the PEP */ + if (type == 'F') + type = 'f'; + x = PyFloat_AsDouble(value); if (x == -1.0 && PyErr_Occurred()) @@ -754,12 +758,8 @@ if (precision < 0) precision = 6; - if ((type == 'f' || type == 'F') && (fabs(x) / 1e25) >= 1e25) { - if (type == 'f') - type = 'g'; - else - type = 'G'; - } + if (type == 'f' && (fabs(x) / 1e25) >= 1e25) + type = 'g'; /* cast "type", because if we're in unicode we need to pass a 8-bit char. this is safe, because we've restricted what "type" Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Thu Jul 17 21:18:29 2008 @@ -8588,12 +8588,8 @@ return -1; if (prec < 0) prec = 6; - if ((type == 'f' || type == 'F') && (fabs(x) / 1e25) >= 1e25) { - if (type == 'f') - type = 'g'; - else - type = 'G'; - } + if (type == 'f' && (fabs(x) / 1e25) >= 1e25) + type = 'g'; /* Worst case length calc to ensure no buffer overrun: 'g' formats: @@ -8612,8 +8608,7 @@ */ if (((type == 'g' || type == 'G') && buflen <= (size_t)10 + (size_t)prec) || - ((type == 'f' || type == 'F') && - buflen <= (size_t)53 + (size_t)prec)) { + (type == 'f' && buflen <= (size_t)53 + (size_t)prec)) { PyErr_SetString(PyExc_OverflowError, "formatted float is too long (precision too large?)"); return -1; @@ -9096,6 +9091,8 @@ case 'F': case 'g': case 'G': + if (c == 'F') + c = 'f'; pbuf = formatbuf; len = formatfloat(pbuf, sizeof(formatbuf)/sizeof(Py_UNICODE), flags, prec, c, v); From python-3000-checkins at python.org Fri Jul 18 01:27:27 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Fri, 18 Jul 2008 01:27:27 +0200 (CEST) Subject: [Python-3000-checkins] r65078 - python/branches/py3k/Lib/test/test_fileio.py Message-ID: <20080717232727.287771E4013@bag.python.org> Author: benjamin.peterson Date: Fri Jul 18 01:27:26 2008 New Revision: 65078 Log: it seems that /dev/tty is seekable on Solaris, too Modified: python/branches/py3k/Lib/test/test_fileio.py Modified: python/branches/py3k/Lib/test/test_fileio.py ============================================================================== --- python/branches/py3k/Lib/test/test_fileio.py (original) +++ python/branches/py3k/Lib/test/test_fileio.py Fri Jul 18 01:27:26 2008 @@ -137,7 +137,8 @@ self.assertEquals(f.readable(), False) self.assertEquals(f.writable(), True) if sys.platform != "darwin" and \ - not sys.platform.startswith('freebsd'): + not sys.platform.startswith('freebsd') and \ + not sys.platform.startswith('sunos'): # Somehow /dev/tty appears seekable on some BSDs self.assertEquals(f.seekable(), False) self.assertEquals(f.isatty(), True) From python-3000-checkins at python.org Fri Jul 18 04:04:59 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Fri, 18 Jul 2008 04:04:59 +0200 (CEST) Subject: [Python-3000-checkins] r65079 - python/branches/py3k Message-ID: <20080718020459.62AA51E4005@bag.python.org> Author: benjamin.peterson Date: Fri Jul 18 04:04:59 2008 New Revision: 65079 Log: Blocked revisions 65070 via svnmerge ........ r65070 | bill.janssen | 2008-07-17 13:01:57 -0500 (Thu, 17 Jul 2008) | 1 line catch socket.error errors in badCertTest ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 18 04:28:44 2008 From: python-3000-checkins at python.org (barry.warsaw) Date: Fri, 18 Jul 2008 04:28:44 +0200 (CEST) Subject: [Python-3000-checkins] r65080 - in python/branches/py3k: Include/patchlevel.h Lib/distutils/__init__.py Lib/idlelib/idlever.py Misc/NEWS Misc/RPM/python-3.0.spec README RELNOTES Message-ID: <20080718022844.842911E400A@bag.python.org> Author: barry.warsaw Date: Fri Jul 18 04:28:44 2008 New Revision: 65080 Log: Bumping to 3.0b2 Modified: python/branches/py3k/Include/patchlevel.h python/branches/py3k/Lib/distutils/__init__.py python/branches/py3k/Lib/idlelib/idlever.py python/branches/py3k/Misc/NEWS python/branches/py3k/Misc/RPM/python-3.0.spec python/branches/py3k/README python/branches/py3k/RELNOTES Modified: python/branches/py3k/Include/patchlevel.h ============================================================================== --- python/branches/py3k/Include/patchlevel.h (original) +++ python/branches/py3k/Include/patchlevel.h Fri Jul 18 04:28:44 2008 @@ -20,10 +20,10 @@ #define PY_MINOR_VERSION 0 #define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_BETA -#define PY_RELEASE_SERIAL 1 +#define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.0b1+" +#define PY_VERSION "3.0b2" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ Modified: python/branches/py3k/Lib/distutils/__init__.py ============================================================================== --- python/branches/py3k/Lib/distutils/__init__.py (original) +++ python/branches/py3k/Lib/distutils/__init__.py Fri Jul 18 04:28:44 2008 @@ -20,5 +20,5 @@ # #--start constants-- -__version__ = "3.0b1" +__version__ = "3.0b2" #--end constants-- Modified: python/branches/py3k/Lib/idlelib/idlever.py ============================================================================== --- python/branches/py3k/Lib/idlelib/idlever.py (original) +++ python/branches/py3k/Lib/idlelib/idlever.py Fri Jul 18 04:28:44 2008 @@ -1 +1 @@ -IDLE_VERSION = "3.0b1" +IDLE_VERSION = "3.0b2" Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 18 04:28:44 2008 @@ -7,7 +7,7 @@ What's new in Python 3.0b2? =========================== -*Release date: XX-XXX-2008* +*Release date: 17-Jul-2008* Core and Builtins ----------------- Modified: python/branches/py3k/Misc/RPM/python-3.0.spec ============================================================================== --- python/branches/py3k/Misc/RPM/python-3.0.spec (original) +++ python/branches/py3k/Misc/RPM/python-3.0.spec Fri Jul 18 04:28:44 2008 @@ -34,7 +34,7 @@ %define name python #--start constants-- -%define version 3.0b1 +%define version 3.0b2 %define libver 3.0 #--end constants-- %define release 1pydotorg Modified: python/branches/py3k/README ============================================================================== --- python/branches/py3k/README (original) +++ python/branches/py3k/README Fri Jul 18 04:28:44 2008 @@ -1,4 +1,4 @@ -This is Python version 3.0 beta 1 +This is Python version 3.0 beta 2 ================================= For notes specific to this release, see RELNOTES in this directory. @@ -22,7 +22,7 @@ ---------------- The release plan is to have a series of alpha releases in 2007 and 2008, -beta releases in 2008, and a final release in September 2008. The alpha +beta releases in 2008, and a final release in October 2008. The alpha releases are primarily aimed at developers who want a sneak peek at the new langauge, especially those folks who plan to port their code to Python 3000. The hope is that by the time of the final release, many Modified: python/branches/py3k/RELNOTES ============================================================================== --- python/branches/py3k/RELNOTES (original) +++ python/branches/py3k/RELNOTES Fri Jul 18 04:28:44 2008 @@ -6,6 +6,19 @@ Please report bugs to http://bugs.python.org/. +Version 3.0b2 - Release Date 17-Jul-2008 +---------------------------------------- + +Please search the bug tracker for critical issues in Python 3.0. + +The bsddb3 library is known to be in bad shape. The Python 2.6 version needs +to be ported to Python 3.0, but so far, no one has done this. + +There are several known deferred blockers (issues that will block the next +release). These include, but are not limited to, problems with 2to3, +multiprocessing, and bytearrays. + + Version 3.0b1 - Release Date 18-Jun-2008 ---------------------------------------- From python-3000-checkins at python.org Fri Jul 18 05:37:04 2008 From: python-3000-checkins at python.org (barry.warsaw) Date: Fri, 18 Jul 2008 05:37:04 +0200 (CEST) Subject: [Python-3000-checkins] r65086 - python/branches/py3k/Include/patchlevel.h Message-ID: <20080718033704.056131E4005@bag.python.org> Author: barry.warsaw Date: Fri Jul 18 05:37:03 2008 New Revision: 65086 Log: Post release cleanup Modified: python/branches/py3k/Include/patchlevel.h Modified: python/branches/py3k/Include/patchlevel.h ============================================================================== --- python/branches/py3k/Include/patchlevel.h (original) +++ python/branches/py3k/Include/patchlevel.h Fri Jul 18 05:37:03 2008 @@ -23,7 +23,7 @@ #define PY_RELEASE_SERIAL 2 /* Version as a string */ -#define PY_VERSION "3.0b2" +#define PY_VERSION "3.0b2+" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ From python-3000-checkins at python.org Fri Jul 18 11:22:49 2008 From: python-3000-checkins at python.org (mark.summerfield) Date: Fri, 18 Jul 2008 11:22:49 +0200 (CEST) Subject: [Python-3000-checkins] r65096 - python/branches/py3k/Doc/library/string.rst Message-ID: <20080718092249.D93A81E4006@bag.python.org> Author: mark.summerfield Date: Fri Jul 18 11:22:49 2008 New Revision: 65096 Log: fixed tiny typo in new # format doc Modified: python/branches/py3k/Doc/library/string.rst Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Fri Jul 18 11:22:49 2008 @@ -349,7 +349,7 @@ +---------+----------------------------------------------------------+ The ``'#'`` option is only valid for integers, and only for binary, -octal, or decimal output. If present, it specifies that the output +octal, or hexadecimal output. If present, it specifies that the output will be prefixed by ``'0b'``, ``'0o'``, or ``'0x'``, respectively. *width* is a decimal integer defining the minimum field width. If not From python-3000-checkins at python.org Fri Jul 18 16:17:46 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Fri, 18 Jul 2008 16:17:46 +0200 (CEST) Subject: [Python-3000-checkins] r65103 - python/branches/py3k Message-ID: <20080718141746.0AB941E4013@bag.python.org> Author: benjamin.peterson Date: Fri Jul 18 16:17:45 2008 New Revision: 65103 Log: Blocked revisions 65102 via svnmerge ........ r65102 | benjamin.peterson | 2008-07-18 09:14:41 -0500 (Fri, 18 Jul 2008) | 1 line backport test_fileio ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 18 16:35:44 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Fri, 18 Jul 2008 16:35:44 +0200 (CEST) Subject: [Python-3000-checkins] r65106 - in python/branches/py3k: Lib/test/regrtest.py Lib/test/test_lib2to3.py Message-ID: <20080718143544.6DA831E4019@bag.python.org> Author: benjamin.peterson Date: Fri Jul 18 16:35:44 2008 New Revision: 65106 Log: Merged revisions 65104 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65104 | benjamin.peterson | 2008-07-18 09:26:35 -0500 (Fri, 18 Jul 2008) | 2 lines now that test_lib2to3 actually works and isn't extremely slow, we don't need the lib2to3 resource ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/regrtest.py python/branches/py3k/Lib/test/test_lib2to3.py Modified: python/branches/py3k/Lib/test/regrtest.py ============================================================================== --- python/branches/py3k/Lib/test/regrtest.py (original) +++ python/branches/py3k/Lib/test/regrtest.py Fri Jul 18 16:35:44 2008 @@ -175,8 +175,8 @@ from test import support -RESOURCE_NAMES = ('audio', 'curses', 'lib2to3', 'largefile', 'network', - 'bsddb', 'decimal', 'compiler', 'subprocess', 'urlfetch') +RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', + 'decimal', 'compiler', 'subprocess', 'urlfetch') def usage(msg): Modified: python/branches/py3k/Lib/test/test_lib2to3.py ============================================================================== --- python/branches/py3k/Lib/test/test_lib2to3.py (original) +++ python/branches/py3k/Lib/test/test_lib2to3.py Fri Jul 18 16:35:44 2008 @@ -2,11 +2,7 @@ # because of running from lib2to3.tests import test_fixers, test_pytree, test_util import unittest -from test.support import run_unittest, requires - -# Don't run lib2to3 tests by default since they take too long -if __name__ != '__main__': - requires('lib2to3') +from test.support import run_unittest def suite(): tests = unittest.TestSuite() From python-3000-checkins at python.org Fri Jul 18 21:31:10 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 18 Jul 2008 21:31:10 +0200 (CEST) Subject: [Python-3000-checkins] r65113 - python/branches/py3k Message-ID: <20080718193110.9BA541E4016@bag.python.org> Author: brett.cannon Date: Fri Jul 18 21:31:10 2008 New Revision: 65113 Log: Blocked revisions 65112 via svnmerge ........ r65112 | brett.cannon | 2008-07-18 12:30:22 -0700 (Fri, 18 Jul 2008) | 1 line Deprecate the sunaudio module for removal in Python 3.0. The sunau module can provide similar functionality. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 18 21:34:28 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Fri, 18 Jul 2008 21:34:28 +0200 (CEST) Subject: [Python-3000-checkins] r65115 - python/branches/py3k Message-ID: <20080718193428.492E41E4009@bag.python.org> Author: georg.brandl Date: Fri Jul 18 21:34:28 2008 New Revision: 65115 Log: Blocked revisions 65109,65111 via svnmerge ........ r65109 | georg.brandl | 2008-07-18 21:06:13 +0200 (Fri, 18 Jul 2008) | 2 lines Replace all map(None, a) with list(a). ........ r65111 | georg.brandl | 2008-07-18 21:30:10 +0200 (Fri, 18 Jul 2008) | 2 lines #3390: replace a remaining has_key(). ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Fri Jul 18 22:59:45 2008 From: python-3000-checkins at python.org (jeremy.hylton) Date: Fri, 18 Jul 2008 22:59:45 +0200 (CEST) Subject: [Python-3000-checkins] r65118 - in python/branches/py3k/Lib: test/test_robotparser.py urllib/robotparser.py Message-ID: <20080718205945.36A231E400A@bag.python.org> Author: jeremy.hylton Date: Fri Jul 18 22:59:44 2008 New Revision: 65118 Log: Bug 3347: robotparser failed because it didn't convert bytes to string. The solution is to convert bytes to text via utf-8. I'm not entirely sure if this is safe, but it looks like robots.txt is expected to be ascii. Modified: python/branches/py3k/Lib/test/test_robotparser.py python/branches/py3k/Lib/urllib/robotparser.py Modified: python/branches/py3k/Lib/test/test_robotparser.py ============================================================================== --- python/branches/py3k/Lib/test/test_robotparser.py (original) +++ python/branches/py3k/Lib/test/test_robotparser.py Fri Jul 18 22:59:44 2008 @@ -136,8 +136,9 @@ RobotTest(7, doc, good, bad) -class TestCase(unittest.TestCase): - def runTest(self): +class NetworkTestCase(unittest.TestCase): + + def testPasswordProtectedSite(self): support.requires('network') # whole site is password-protected. url = 'http://mueblesmoraleda.com' @@ -146,9 +147,17 @@ parser.read() self.assertEqual(parser.can_fetch("*", url+"/robots.txt"), False) + def testPythonOrg(self): + support.requires('network') + parser = urllib.robotparser.RobotFileParser( + "http://www.python.org/robots.txt") + parser.read() + self.assertTrue(parser.can_fetch("*", + "http://www.python.org/robots.txt")) + def test_main(): + support.run_unittest(NetworkTestCase) support.run_unittest(tests) - TestCase().run() if __name__=='__main__': support.Verbose = 1 Modified: python/branches/py3k/Lib/urllib/robotparser.py ============================================================================== --- python/branches/py3k/Lib/urllib/robotparser.py (original) +++ python/branches/py3k/Lib/urllib/robotparser.py Fri Jul 18 22:59:44 2008 @@ -60,7 +60,8 @@ elif err.code >= 400: self.allow_all = True else: - self.parse(f.read().splitlines()) + raw = f.read() + self.parse(raw.decode("utf-8").splitlines()) def _add_entry(self, entry): if "*" in entry.useragents: @@ -123,7 +124,10 @@ return True # search for given user agent matches # the first match counts - url = urllib.parse.quote(urllib.parse.urlparse(urllib.parse.unquote(url))[2]) or "/" + url = urllib.parse.quote( + urllib.parse.urlparse(urllib.parse.unquote(url))[2]) + if not url: + url = "/" for entry in self.entries: if entry.applies_to(useragent): return entry.allowance(url) From python-3000-checkins at python.org Fri Jul 18 23:09:41 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Fri, 18 Jul 2008 23:09:41 +0200 (CEST) Subject: [Python-3000-checkins] r65120 - python/branches/py3k/Doc/library/cgi.rst Message-ID: <20080718210941.1034E1E400A@bag.python.org> Author: georg.brandl Date: Fri Jul 18 23:09:40 2008 New Revision: 65120 Log: Fix urllib function reference. Modified: python/branches/py3k/Doc/library/cgi.rst Modified: python/branches/py3k/Doc/library/cgi.rst ============================================================================== --- python/branches/py3k/Doc/library/cgi.rst (original) +++ python/branches/py3k/Doc/library/cgi.rst Fri Jul 18 23:09:40 2008 @@ -277,7 +277,7 @@ parsing errors. If false (the default), errors are silently ignored. If true, errors raise a :exc:`ValueError` exception. - Use the :func:`urllib.urlencode` function to convert such dictionaries into + Use the :func:`urllib.parse.urlencode` function to convert such dictionaries into query strings. @@ -297,7 +297,7 @@ parsing errors. If false (the default), errors are silently ignored. If true, errors raise a :exc:`ValueError` exception. - Use the :func:`urllib.urlencode` function to convert such lists of pairs into + Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into query strings. From python-3000-checkins at python.org Sat Jul 19 02:33:23 2008 From: python-3000-checkins at python.org (eric.smith) Date: Sat, 19 Jul 2008 02:33:23 +0200 (CEST) Subject: [Python-3000-checkins] r65126 - in python/branches/py3k: Lib/test/test_types.py Python/pystrtod.c Message-ID: <20080719003323.853CD1E400A@bag.python.org> Author: eric.smith Date: Sat Jul 19 02:33:23 2008 New Revision: 65126 Log: Merged revisions 65125 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65125 | eric.smith | 2008-07-18 20:24:05 -0400 (Fri, 18 Jul 2008) | 1 line Fix issue 3411: default float format spec fails on negative numbers. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_types.py python/branches/py3k/Python/pystrtod.c Modified: python/branches/py3k/Lib/test/test_types.py ============================================================================== --- python/branches/py3k/Lib/test/test_types.py (original) +++ python/branches/py3k/Lib/test/test_types.py Sat Jul 19 02:33:23 2008 @@ -497,6 +497,12 @@ test(0.01, '', '0.01') test(0.01, 'g', '0.01') + # test for issue 3411 + test(1.23, '1', '1.23') + test(-1.23, '1', '-1.23') + test(1.23, '1g', '1.23') + test(-1.23, '1g', '-1.23') + test( 1.0, ' g', ' 1') test(-1.0, ' g', '-1') test( 1.0, '+g', '+1') Modified: python/branches/py3k/Python/pystrtod.c ============================================================================== --- python/branches/py3k/Python/pystrtod.c (original) +++ python/branches/py3k/Python/pystrtod.c Sat Jul 19 02:33:23 2008 @@ -302,6 +302,10 @@ /* search for the first non-digit character */ char *p = buffer; + if (*p == '-' || *p == '+') + /* Skip leading sign, if present. I think this could only + ever be '-', but it can't hurt to check for both. */ + ++p; while (*p && isdigit(Py_CHARMASK(*p))) ++p; From python-3000-checkins at python.org Sat Jul 19 04:56:43 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 19 Jul 2008 04:56:43 +0200 (CEST) Subject: [Python-3000-checkins] r65129 - python/branches/py3k/Mac/Makefile.in Message-ID: <20080719025643.B885E1E4013@bag.python.org> Author: benjamin.peterson Date: Sat Jul 19 04:56:43 2008 New Revision: 65129 Log: fix typo in Mac/Makefile.in Modified: python/branches/py3k/Mac/Makefile.in Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Sat Jul 19 04:56:43 2008 @@ -216,7 +216,7 @@ test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" cp -PR IDLE/IDLE.app "$(DESTDIR)$(PYTHONAPPSDIR)" - ln -sf $(INSTALLED_PYTHONAPP) "$(DESDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python" + ln -sf $(INSTALLED_PYTHONAPP) "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app/Contents/MacOS/Python" touch "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" $(INSTALLED_PYTHONAPP): install_Python From python-3000-checkins at python.org Sat Jul 19 11:58:13 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sat, 19 Jul 2008 11:58:13 +0200 (CEST) Subject: [Python-3000-checkins] r65130 - python/branches/py3k/Mac/Makefile.in Message-ID: <20080719095813.95D041E400A@bag.python.org> Author: georg.brandl Date: Sat Jul 19 11:58:13 2008 New Revision: 65130 Log: #3414: run install_Python when installing Python. Modified: python/branches/py3k/Mac/Makefile.in Modified: python/branches/py3k/Mac/Makefile.in ============================================================================== --- python/branches/py3k/Mac/Makefile.in (original) +++ python/branches/py3k/Mac/Makefile.in Sat Jul 19 11:58:13 2008 @@ -45,10 +45,11 @@ DOCINDEX=$(DOCDIR)/"Documentation idx" compileall=$(srcdir)/../Lib/compileall.py -installapps: install_PythonLauncher install_IDLE checkapplepython install_pythonw \ - install_versionedtools +installapps: install_Python install_PythonLauncher install_IDLE \ + checkapplepython install_pythonw install_versionedtools -installapps4way: install_Python4way install_BuildApplet install_PythonLauncher install_IDLE install_pythonw4way install_versionedtools +installapps4way: install_Python4way install_PythonLauncher \ + install_IDLE install_pythonw4way install_versionedtools install_pythonw: pythonw From python-3000-checkins at python.org Sat Jul 19 12:13:16 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sat, 19 Jul 2008 12:13:16 +0200 (CEST) Subject: [Python-3000-checkins] r65132 - python/branches/py3k/Python/import.c Message-ID: <20080719101316.3B7201E4010@bag.python.org> Author: georg.brandl Date: Sat Jul 19 12:13:15 2008 New Revision: 65132 Log: #3368: free string allocated by "es" ParseTuple format. Modified: python/branches/py3k/Python/import.c Modified: python/branches/py3k/Python/import.c ============================================================================== --- python/branches/py3k/Python/import.c (original) +++ python/branches/py3k/Python/import.c Sat Jul 19 12:13:15 2008 @@ -3187,6 +3187,7 @@ pathlen = strlen(path); if (pathlen == 0) { + PyMem_Free(path); PyErr_SetString(PyExc_ImportError, "empty pathname"); return -1; } else { @@ -3208,6 +3209,7 @@ rv = stat(mangled, &statbuf); } #endif + PyMem_Free(path); if (rv == 0) { /* it exists */ if (S_ISDIR(statbuf.st_mode)) { From python-3000-checkins at python.org Sat Jul 19 15:53:58 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sat, 19 Jul 2008 15:53:58 +0200 (CEST) Subject: [Python-3000-checkins] r65140 - python/branches/py3k/Lib/idlelib/EditorWindow.py Message-ID: <20080719135358.6D2471E400F@bag.python.org> Author: georg.brandl Date: Sat Jul 19 15:53:58 2008 New Revision: 65140 Log: xrange -> range. Modified: python/branches/py3k/Lib/idlelib/EditorWindow.py Modified: python/branches/py3k/Lib/idlelib/EditorWindow.py ============================================================================== --- python/branches/py3k/Lib/idlelib/EditorWindow.py (original) +++ python/branches/py3k/Lib/idlelib/EditorWindow.py Sat Jul 19 15:53:58 2008 @@ -289,7 +289,7 @@ insertpt = int(self.text.index("iomark").split(".")[1]) else: line = self.text.get("insert linestart", "insert lineend") - for insertpt in xrange(len(line)): + for insertpt in range(len(line)): if line[insertpt] not in (' ','\t'): break else: From python-3000-checkins at python.org Sat Jul 19 16:19:28 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 19 Jul 2008 16:19:28 +0200 (CEST) Subject: [Python-3000-checkins] r65142 - in python/branches/py3k: Lib/lib2to3 Lib/lib2to3/fixes/fix_import.py Lib/lib2to3/tests/test_fixers.py Message-ID: <20080719141928.8E8CA1E400A@bag.python.org> Author: benjamin.peterson Date: Sat Jul 19 16:19:28 2008 New Revision: 65142 Log: Merged revisions 65141 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ................ r65141 | benjamin.peterson | 2008-07-19 09:14:06 -0500 (Sat, 19 Jul 2008) | 9 lines Merged revisions 65137 via svnmerge from svn+ssh://pythondev at svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r65137 | georg.brandl | 2008-07-19 08:32:57 -0500 (Sat, 19 Jul 2008) | 2 lines #3334: correctly set prefix of imports. ........ ................ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/lib2to3/ (props changed) python/branches/py3k/Lib/lib2to3/fixes/fix_import.py python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Modified: python/branches/py3k/Lib/lib2to3/fixes/fix_import.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/fixes/fix_import.py (original) +++ python/branches/py3k/Lib/lib2to3/fixes/fix_import.py Sat Jul 19 16:19:28 2008 @@ -45,7 +45,7 @@ node.changed() else: new = FromImport('.', getattr(imp, 'content', None) or [imp]) - new.prefix = node.get_prefix() + new.set_prefix(node.get_prefix()) node = new return node Modified: python/branches/py3k/Lib/lib2to3/tests/test_fixers.py ============================================================================== --- python/branches/py3k/Lib/lib2to3/tests/test_fixers.py (original) +++ python/branches/py3k/Lib/lib2to3/tests/test_fixers.py Sat Jul 19 16:19:28 2008 @@ -3319,6 +3319,17 @@ a = "from . import foo.bar as bang" self.check_both(b, a) + def test_prefix(self): + b = """ + # prefix + import foo.bar + """ + a = """ + # prefix + from . import foo.bar + """ + self.check_both(b, a) + if __name__ == "__main__": import __main__ From python-3000-checkins at python.org Sat Jul 19 17:51:08 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sat, 19 Jul 2008 17:51:08 +0200 (CEST) Subject: [Python-3000-checkins] r65144 - in python/branches/py3k/Doc: library/traceback.rst reference/executionmodel.rst reference/simple_stmts.rst Message-ID: <20080719155108.0951A1E400A@bag.python.org> Author: georg.brandl Date: Sat Jul 19 17:51:07 2008 New Revision: 65144 Log: #3113: document exception chaining. Modified: python/branches/py3k/Doc/library/traceback.rst python/branches/py3k/Doc/reference/executionmodel.rst python/branches/py3k/Doc/reference/simple_stmts.rst Modified: python/branches/py3k/Doc/library/traceback.rst ============================================================================== --- python/branches/py3k/Doc/library/traceback.rst (original) +++ python/branches/py3k/Doc/library/traceback.rst Sat Jul 19 17:51:07 2008 @@ -1,4 +1,3 @@ - :mod:`traceback` --- Print or retrieve a stack traceback ======================================================== @@ -29,29 +28,31 @@ object to receive the output. -.. function:: print_exception(type, value, traceback[, limit[, file]]) +.. function:: print_exception(type, value, traceback[, limit[, file[, chain]]]) Print exception information and up to *limit* stack trace entries from - *traceback* to *file*. This differs from :func:`print_tb` in the following ways: - (1) if *traceback* is not ``None``, it prints a header ``Traceback (most recent - call last):``; (2) it prints the exception *type* and *value* after the stack - trace; (3) if *type* is :exc:`SyntaxError` and *value* has the appropriate - format, it prints the line where the syntax error occurred with a caret - indicating the approximate position of the error. - - -.. function:: print_exc([limit[, file]]) + *traceback* to *file*. This differs from :func:`print_tb` in the following + ways: - This is a shorthand for ``print_exception(*sys.exc_info())``. + * if *traceback* is not ``None``, it prints a header ``Traceback (most recent + call last):`` + * it prints the exception *type* and *value* after the stack trace + * if *type* is :exc:`SyntaxError` and *value* has the appropriate format, it + prints the line where the syntax error occurred with a caret indicating the + approximate position of the error. + + If *chain* is true (the default), then chained exceptions (the + :attr:`__cause__` or :attr:`__context__` attributes of the exception) will be + printed as well, like the interpreter itself does when printing an unhandled + exception. -.. function:: format_exc([limit]) +.. function:: print_exc([limit[, file[, chain]]]) - This is like ``print_exc(limit)`` but returns a string instead of printing to a - file. + This is a shorthand for ``print_exception(*sys.exc_info())``. -.. function:: print_last([limit[, file]]) +.. function:: print_last([limit[, file[, chain]]]) This is a shorthand for ``print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)``. @@ -103,7 +104,7 @@ occurred is the always last string in the list. -.. function:: format_exception(type, value, tb[, limit]) +.. function:: format_exception(type, value, tb[, limit[, chain]]) Format a stack trace and the exception information. The arguments have the same meaning as the corresponding arguments to :func:`print_exception`. The @@ -112,6 +113,12 @@ same text is printed as does :func:`print_exception`. +.. function:: format_exc([limit[, chain]]) + + This is like ``print_exc(limit)`` but returns a string instead of printing to a + file. + + .. function:: format_tb(tb[, limit]) A shorthand for ``format_list(extract_tb(tb, limit))``. Modified: python/branches/py3k/Doc/reference/executionmodel.rst ============================================================================== --- python/branches/py3k/Doc/reference/executionmodel.rst (original) +++ python/branches/py3k/Doc/reference/executionmodel.rst Sat Jul 19 17:51:07 2008 @@ -230,6 +230,7 @@ See also the description of the :keyword:`try` statement in section :ref:`try` and :keyword:`raise` statement in section :ref:`raise`. + .. rubric:: Footnotes .. [#] This limitation occurs because the code that is executed by these operations Modified: python/branches/py3k/Doc/reference/simple_stmts.rst ============================================================================== --- python/branches/py3k/Doc/reference/simple_stmts.rst (original) +++ python/branches/py3k/Doc/reference/simple_stmts.rst Sat Jul 19 17:51:07 2008 @@ -476,6 +476,7 @@ statement: raise single: exception pair: raising; exception + single: __traceback__ (exception attribute) .. productionlist:: raise_stmt: "raise" [`expression` ["from" `expression`]] @@ -503,9 +504,49 @@ raise RuntimeError("foo occurred").with_traceback(tracebackobj) -.. XXX document exception chaining - -The "from" clause is used for exception chaining, which is not documented yet. +.. index:: pair: exception; chaining + __cause__ (exception attribute) + __context__ (exception attribute) + +The ``from`` clause is used for exception chaining: if given, the second +*expression* must be another exception class or instance, which will then be +attached to the raised exception as the :attr:`__cause__` attribute (which is +writable). If the raised exception is not handled, both exceptions will be +printed:: + + >>> try: + ... print(1 / 0) + ... except Exception as exc: + ... raise RuntimeError("Something bad happened") from exc + ... + Traceback (most recent call last): + File "", line 2, in + ZeroDivisionError: int division or modulo by zero + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "", line 4, in + RuntimeError: Something bad happened + +A similar mechanism works implicitly if an exception is raised inside an +exception handler: the previous exception is then attached as the new +exception's :attr:`__context__` attribute:: + + >>> try: + ... print(1 / 0) + ... except: + ... raise RuntimeError("Something bad happened") + ... + Traceback (most recent call last): + File "", line 2, in + ZeroDivisionError: int division or modulo by zero + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "", line 4, in + RuntimeError: Something bad happened Additional information on exceptions can be found in section :ref:`exceptions`, and information about handling exceptions is in section :ref:`try`. From python-3000-checkins at python.org Sun Jul 20 00:26:35 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2008 00:26:35 +0200 (CEST) Subject: [Python-3000-checkins] r65148 - in python/branches/py3k: Modules/_json.c Message-ID: <20080719222635.AF58D1E400A@bag.python.org> Author: benjamin.peterson Date: Sun Jul 20 00:26:35 2008 New Revision: 65148 Log: Merged revisions 65147 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65147 | bob.ippolito | 2008-07-19 16:59:50 -0500 (Sat, 19 Jul 2008) | 1 line #3322: bounds checking for _json.scanstring ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Modules/_json.c Modified: python/branches/py3k/Modules/_json.c ============================================================================== --- python/branches/py3k/Modules/_json.c (original) +++ python/branches/py3k/Modules/_json.c Sun Jul 20 00:26:35 2008 @@ -236,6 +236,10 @@ if (chunks == NULL) { goto bail; } + if (end < 0 || len <= end) { + PyErr_SetString(PyExc_ValueError, "end is out of bounds"); + goto bail; + } while (1) { /* Find the end of the string or the next escape */ Py_UNICODE c = 0; @@ -246,7 +250,7 @@ break; } else if (strict && c <= 0x1f) { - raise_errmsg("Invalid control character at", pystr, begin); + raise_errmsg("Invalid control character at", pystr, next); goto bail; } } @@ -401,6 +405,10 @@ if (chunks == NULL) { goto bail; } + if (end < 0 || len <= end) { + PyErr_SetString(PyExc_ValueError, "end is out of bounds"); + goto bail; + } while (1) { /* Find the end of the string or the next escape */ Py_UNICODE c = 0; @@ -411,7 +419,7 @@ break; } else if (strict && c <= 0x1f) { - raise_errmsg("Invalid control character at", pystr, begin); + raise_errmsg("Invalid control character at", pystr, next); goto bail; } } From python-3000-checkins at python.org Sun Jul 20 09:31:31 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sun, 20 Jul 2008 09:31:31 +0200 (CEST) Subject: [Python-3000-checkins] r65153 - in python/branches/py3k: Lib/asyncore.py Message-ID: <20080720073131.3536C1E400A@bag.python.org> Author: georg.brandl Date: Sun Jul 20 09:31:30 2008 New Revision: 65153 Log: Merged revisions 65152 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65152 | georg.brandl | 2008-07-20 09:29:58 +0200 (Sun, 20 Jul 2008) | 2 lines Remove exception indexing in asyncore. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/asyncore.py Modified: python/branches/py3k/Lib/asyncore.py ============================================================================== --- python/branches/py3k/Lib/asyncore.py (original) +++ python/branches/py3k/Lib/asyncore.py Sun Jul 20 09:31:30 2008 @@ -128,7 +128,7 @@ try: r, w, e = select.select(r, w, e, timeout) except select.error as err: - if err[0] != EINTR: + if err.args[0] != EINTR: raise else: return @@ -174,7 +174,7 @@ try: r = pollster.poll(timeout) except select.error as err: - if err[0] != EINTR: + if err.args[0] != EINTR: raise r = [] for fd, flags in r: @@ -230,7 +230,7 @@ try: self.addr = sock.getpeername() except socket.error as err: - if err[0] == ENOTCONN: + if err.args[0] == ENOTCONN: # To handle the case where we got an unconnected # socket. self.connected = False @@ -338,7 +338,7 @@ conn, addr = self.socket.accept() return conn, addr except socket.error as why: - if why[0] == EWOULDBLOCK: + if why.args[0] == EWOULDBLOCK: pass else: raise @@ -348,9 +348,9 @@ result = self.socket.send(data) return result except socket.error as why: - if why[0] == EWOULDBLOCK: + if why.args[0] == EWOULDBLOCK: return 0 - elif why[0] in (ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED): + elif why.args[0] in (ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED): self.handle_close() return 0 else: @@ -368,7 +368,7 @@ return data except socket.error as why: # winsock sometimes throws ENOTCONN - if why[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED]: + if why.args[0] in [ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED]: self.handle_close() return b'' else: @@ -381,7 +381,7 @@ try: self.socket.close() except socket.error as why: - if why[0] not in (ENOTCONN, EBADF): + if why.args[0] not in (ENOTCONN, EBADF): raise # cheap inheritance, used to pass all other attribute @@ -548,7 +548,7 @@ try: x.close() except OSError as x: - if x[0] == EBADF: + if x.args[0] == EBADF: pass elif not ignore_all: raise From python-3000-checkins at python.org Sun Jul 20 23:38:50 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sun, 20 Jul 2008 23:38:50 +0200 (CEST) Subject: [Python-3000-checkins] r65160 - python/branches/py3k/Lib/opcode.py Message-ID: <20080720213850.4FA411E400C@bag.python.org> Author: georg.brandl Date: Sun Jul 20 23:38:50 2008 New Revision: 65160 Log: Remove MAKE_BYTES which is a leftover from the mutable byte literal time. Modified: python/branches/py3k/Lib/opcode.py Modified: python/branches/py3k/Lib/opcode.py ============================================================================== --- python/branches/py3k/Lib/opcode.py (original) +++ python/branches/py3k/Lib/opcode.py Sun Jul 20 23:38:50 2008 @@ -101,7 +101,7 @@ def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) -def_op('MAKE_BYTES', 85) + def_op('YIELD_VALUE', 86) def_op('POP_BLOCK', 87) def_op('END_FINALLY', 88) From python-3000-checkins at python.org Sun Jul 20 23:39:03 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Sun, 20 Jul 2008 23:39:03 +0200 (CEST) Subject: [Python-3000-checkins] r65161 - python/branches/py3k/Doc/library/dis.rst Message-ID: <20080720213903.B82ED1E400C@bag.python.org> Author: georg.brandl Date: Sun Jul 20 23:39:03 2008 New Revision: 65161 Log: #3400: document new 3.0 opcodes. Modified: python/branches/py3k/Doc/library/dis.rst Modified: python/branches/py3k/Doc/library/dis.rst ============================================================================== --- python/branches/py3k/Doc/library/dis.rst (original) +++ python/branches/py3k/Doc/library/dis.rst Sun Jul 20 23:39:03 2008 @@ -414,8 +414,8 @@ .. opcode:: LOAD_BUILD_CLASS () - Pushes builtins.__build_class__ onto the stack. It is later called by - ```CALL_FUNCTION`` to construct a class. + Pushes :func:`builtins.__build_class__` onto the stack. It is later called + by :opcode:`CALL_FUNCTION` to construct a class. .. opcode:: WITH_CLEANUP () @@ -440,6 +440,12 @@ .. XXX explain the WHY stuff! +.. opcode:: STORE_LOCALS + + Pops TOS from the stack and stores it as the current frame's ``f_locals``. + This is used in class construction. + + All of the following opcodes expect arguments. An argument is two bytes, with the more significant byte last. @@ -462,6 +468,18 @@ right-to-left. +.. opcode:: UNPACK_EX (counts) + + Implements assignment with a starred target: Unpacks an iterable in TOS into + individual values, where the total number of values can be smaller than the + number of items in the iterable: one the new values will be a list of all + leftover items. + + The low byte of *counts* is the number of values before the list value, the + high byte of *counts* the number of values after it. The resulting values + are put onto the stack right-to-left. + + .. opcode:: DUP_TOPX (count) Duplicate *count* items, keeping them in the same order. Due to implementation From python-3000-checkins at python.org Mon Jul 21 00:02:26 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Mon, 21 Jul 2008 00:02:26 +0200 (CEST) Subject: [Python-3000-checkins] r65162 - python/branches/py3k/Doc/library/dis.rst Message-ID: <20080720220226.8EB7F1E400C@bag.python.org> Author: benjamin.peterson Date: Mon Jul 21 00:02:26 2008 New Revision: 65162 Log: fix markup Modified: python/branches/py3k/Doc/library/dis.rst Modified: python/branches/py3k/Doc/library/dis.rst ============================================================================== --- python/branches/py3k/Doc/library/dis.rst (original) +++ python/branches/py3k/Doc/library/dis.rst Mon Jul 21 00:02:26 2008 @@ -415,7 +415,7 @@ .. opcode:: LOAD_BUILD_CLASS () Pushes :func:`builtins.__build_class__` onto the stack. It is later called - by :opcode:`CALL_FUNCTION` to construct a class. + by ``CALL_FUNCTION`` to construct a class. .. opcode:: WITH_CLEANUP () From python-3000-checkins at python.org Mon Jul 21 01:21:58 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Mon, 21 Jul 2008 01:21:58 +0200 (CEST) Subject: [Python-3000-checkins] r65164 - in python/branches/py3k: Lib/test/test_importhooks.py Message-ID: <20080720232158.2905F1E400D@bag.python.org> Author: georg.brandl Date: Mon Jul 21 01:21:49 2008 New Revision: 65164 Log: Merged revisions 65163 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65163 | georg.brandl | 2008-07-21 01:18:55 +0200 (Mon, 21 Jul 2008) | 4 lines Save the whole of sys.modules instead of using an import tracker. This, when merged to py3k, will fix the spurious buildbot failure in test_urllib2 (""). ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_importhooks.py Modified: python/branches/py3k/Lib/test/test_importhooks.py ============================================================================== --- python/branches/py3k/Lib/test/test_importhooks.py (original) +++ python/branches/py3k/Lib/test/test_importhooks.py Mon Jul 21 01:21:49 2008 @@ -33,15 +33,6 @@ test_path = "!!!_test_!!!" -class ImportTracker: - """Importer that only tracks attempted imports.""" - def __init__(self): - self.imports = [] - def find_module(self, fullname, path=None): - self.imports.append(fullname) - return None - - class TestImporter: modules = { @@ -152,17 +143,15 @@ self.meta_path = sys.meta_path[:] self.path_hooks = sys.path_hooks[:] sys.path_importer_cache.clear() - self.tracker = ImportTracker() - sys.meta_path.insert(0, self.tracker) + self.modules_before = sys.modules.copy() def tearDown(self): sys.path[:] = self.path sys.meta_path[:] = self.meta_path sys.path_hooks[:] = self.path_hooks sys.path_importer_cache.clear() - for fullname in self.tracker.imports: - if fullname in sys.modules: - del sys.modules[fullname] + sys.modules.clear() + sys.modules.update(self.modules_before) class ImportHooksTestCase(ImportHooksBaseTestCase): @@ -256,13 +245,7 @@ for mname in mnames: m = __import__(mname, globals(), locals(), ["__dummy__"]) m.__loader__ # to make sure we actually handled the import -## # Delete urllib from modules because urlparse was imported above. -## # Without this hack, test_socket_ssl fails if run in this order: -## # regrtest.py test_codecmaps_tw test_importhooks test_socket_ssl -## try: -## del sys.modules['urllib'] -## except KeyError: -## pass + def test_main(): support.run_unittest(ImportHooksTestCase) From python-3000-checkins at python.org Mon Jul 21 18:32:11 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Mon, 21 Jul 2008 18:32:11 +0200 (CEST) Subject: [Python-3000-checkins] r65171 - in python/branches/py3k: Lib/rlcompleter.py Message-ID: <20080721163211.011711E401A@bag.python.org> Author: benjamin.peterson Date: Mon Jul 21 18:32:10 2008 New Revision: 65171 Log: Merged revisions 65168 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65168 | facundo.batista | 2008-07-21 09:28:17 -0500 (Mon, 21 Jul 2008) | 5 lines Issue 3396. Fixed the autocompletion of 'int.', and worked a little that part of the code, fixing a detail and enhancing a bit others. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/rlcompleter.py Modified: python/branches/py3k/Lib/rlcompleter.py ============================================================================== --- python/branches/py3k/Lib/rlcompleter.py (original) +++ python/branches/py3k/Lib/rlcompleter.py Mon Jul 21 18:32:10 2008 @@ -128,18 +128,23 @@ return [] expr, attr = m.group(1, 3) try: - object = eval(expr, self.namespace) + thisobject = eval(expr, self.namespace) except Exception: return [] - words = dir(object) - if hasattr(object,'__class__'): + + # get the content of the object, except __builtins__ + words = dir(thisobject) + if "__builtins__" in words: + words.remove("__builtins__") + + if hasattr(thisobject, '__class__'): words.append('__class__') - words = words + get_class_members(object.__class__) + words.extend(get_class_members(thisobject.__class__)) matches = [] n = len(attr) for word in words: - if word[:n] == attr and word != "__builtins__": - val = getattr(object, word) + if word[:n] == attr and hasattr(thisobject, word): + val = getattr(thisobject, word) word = self._callable_postfix(val, "%s.%s" % (expr, word)) matches.append(word) return matches From python-3000-checkins at python.org Mon Jul 21 20:26:48 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Mon, 21 Jul 2008 20:26:48 +0200 (CEST) Subject: [Python-3000-checkins] r65173 - python/branches/py3k Message-ID: <20080721182648.97A691E4008@bag.python.org> Author: georg.brandl Date: Mon Jul 21 20:26:48 2008 New Revision: 65173 Log: Blocked revisions 65172 via svnmerge ........ r65172 | georg.brandl | 2008-07-21 20:26:21 +0200 (Mon, 21 Jul 2008) | 2 lines nonlocal is not in 2.6. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Mon Jul 21 23:13:14 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Mon, 21 Jul 2008 23:13:14 +0200 (CEST) Subject: [Python-3000-checkins] r65175 - in python/branches/py3k: Modules/posixmodule.c Message-ID: <20080721211314.F0BB01E4015@bag.python.org> Author: amaury.forgeotdarc Date: Mon Jul 21 23:13:14 2008 New Revision: 65175 Log: Merged revisions 65174 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65174 | amaury.forgeotdarc | 2008-07-21 23:06:46 +0200 (lun., 21 juil. 2008) | 3 lines On Windows, silence a Purify warning and initialize the memory passed to CryptGenRandom. Since python doesn't provide any particular random data, it seems more reasonable anyway. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Modules/posixmodule.c Modified: python/branches/py3k/Modules/posixmodule.c ============================================================================== --- python/branches/py3k/Modules/posixmodule.c (original) +++ python/branches/py3k/Modules/posixmodule.c Mon Jul 21 23:13:14 2008 @@ -6690,6 +6690,7 @@ result = PyBytes_FromStringAndSize(NULL, howMany); if (result != NULL) { /* Get random data */ + memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */ if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) PyBytes_AS_STRING(result))) { Py_DECREF(result); From python-3000-checkins at python.org Tue Jul 22 00:49:36 2008 From: python-3000-checkins at python.org (mark.dickinson) Date: Tue, 22 Jul 2008 00:49:36 +0200 (CEST) Subject: [Python-3000-checkins] r65179 - python/branches/py3k/Objects/floatobject.c Message-ID: <20080721224936.79D151E400C@bag.python.org> Author: mark.dickinson Date: Tue Jul 22 00:49:36 2008 New Revision: 65179 Log: Issue #3369: fix memory leak in floatobject.c. Thanks Kristj?n J?nsson for the report and fix. Modified: python/branches/py3k/Objects/floatobject.c Modified: python/branches/py3k/Objects/floatobject.c ============================================================================== --- python/branches/py3k/Objects/floatobject.c (original) +++ python/branches/py3k/Objects/floatobject.c Tue Jul 22 00:49:36 2008 @@ -223,13 +223,19 @@ p++; } if (PyOS_strnicmp(p, "inf", 4) == 0) { + if (s_buffer != NULL) + PyMem_FREE(s_buffer); Py_RETURN_INF(sign); } if (PyOS_strnicmp(p, "infinity", 9) == 0) { + if (s_buffer != NULL) + PyMem_FREE(s_buffer); Py_RETURN_INF(sign); } #ifdef Py_NAN if(PyOS_strnicmp(p, "nan", 4) == 0) { + if (s_buffer != NULL) + PyMem_FREE(s_buffer); Py_RETURN_NAN; } #endif From python-3000-checkins at python.org Tue Jul 22 19:53:23 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Tue, 22 Jul 2008 19:53:23 +0200 (CEST) Subject: [Python-3000-checkins] r65185 - in python/branches/py3k/Lib: sre_parse.py test/re_tests.py test/test_re.py Message-ID: <20080722175323.1B9BF1E400C@bag.python.org> Author: antoine.pitrou Date: Tue Jul 22 19:53:22 2008 New Revision: 65185 Log: #3231: re.compile fails with some bytes patterns Modified: python/branches/py3k/Lib/sre_parse.py python/branches/py3k/Lib/test/re_tests.py python/branches/py3k/Lib/test/test_re.py Modified: python/branches/py3k/Lib/sre_parse.py ============================================================================== --- python/branches/py3k/Lib/sre_parse.py (original) +++ python/branches/py3k/Lib/sre_parse.py Tue Jul 22 19:53:22 2008 @@ -200,7 +200,7 @@ except IndexError: raise error("bogus escape (end of line)") if isinstance(self.string, bytes): - char = chr(c) + c = chr(c) char = char + c self.index = self.index + len(char) self.next = char Modified: python/branches/py3k/Lib/test/re_tests.py ============================================================================== --- python/branches/py3k/Lib/test/re_tests.py (original) +++ python/branches/py3k/Lib/test/re_tests.py Tue Jul 22 19:53:22 2008 @@ -661,12 +661,8 @@ ('^([ab]*?)(? Author: antoine.pitrou Date: Tue Jul 22 20:03:03 2008 New Revision: 65186 Log: #3092: fix unicode size detection in pybench Modified: python/branches/py3k/Tools/pybench/pybench.py Modified: python/branches/py3k/Tools/pybench/pybench.py ============================================================================== --- python/branches/py3k/Tools/pybench/pybench.py (original) +++ python/branches/py3k/Tools/pybench/pybench.py Tue Jul 22 20:03:03 2008 @@ -106,9 +106,7 @@ print('Getting machine details...') buildno, builddate = platform.python_build() python = platform.python_version() - try: - chr(100000) - except ValueError: + if sys.maxunicode == 65535: # UCS2 build (standard) unitype = 'UCS2' else: From python-3000-checkins at python.org Tue Jul 22 21:27:12 2008 From: python-3000-checkins at python.org (raymond.hettinger) Date: Tue, 22 Jul 2008 21:27:12 +0200 (CEST) Subject: [Python-3000-checkins] r65191 - python/branches/py3k/Doc/whatsnew/3.0.rst Message-ID: <20080722192712.993AE1E4003@bag.python.org> Author: raymond.hettinger Date: Tue Jul 22 21:27:12 2008 New Revision: 65191 Log: Fix spelling. Modified: python/branches/py3k/Doc/whatsnew/3.0.rst Modified: python/branches/py3k/Doc/whatsnew/3.0.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/3.0.rst (original) +++ python/branches/py3k/Doc/whatsnew/3.0.rst Tue Jul 22 21:27:12 2008 @@ -118,7 +118,7 @@ ``print(x)`` instead! * When using the ``2to3`` source-to-source conversion tool, all - ``print`` statements are autmatically converted to :func:`print` + ``print`` statements are automatically converted to :func:`print` function calls, so this is mostly a non-issue for larger projects. * Python 3.0 uses strings and bytes instead of the Unicode strings and @@ -159,7 +159,7 @@ implementation are like :class:`unicode` in 2.x. * The :class:`basestring` superclass has been removed. The ``2to3`` tool - replaces every occurence of :class:`basestring` with :class:`str`. + replaces every occurrence of :class:`basestring` with :class:`str`. * PEP 3137: There is a new type, :class:`bytes`, to represent binary data (and encoded text, which is treated as binary data until you decide to decode it). From python-3000-checkins at python.org Wed Jul 23 15:47:41 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 23 Jul 2008 15:47:41 +0200 (CEST) Subject: [Python-3000-checkins] r65195 - python/branches/py3k Message-ID: <20080723134741.C448B1E4004@bag.python.org> Author: benjamin.peterson Date: Wed Jul 23 15:47:41 2008 New Revision: 65195 Log: Blocked revisions 64578,64580,65082,65085 via svnmerge ........ r64578 | bill.janssen | 2008-06-28 17:19:33 -0500 (Sat, 28 Jun 2008) | 1 line various SSL fixes; issues 1251, 3162, 3212 ........ r64580 | bill.janssen | 2008-06-28 18:00:39 -0500 (Sat, 28 Jun 2008) | 1 line make sure we close the active channels when eof is received on them ........ r65082 | barry.warsaw | 2008-07-17 22:20:07 -0500 (Thu, 17 Jul 2008) | 1 line Bumping to 2.6b2 ........ r65085 | barry.warsaw | 2008-07-17 22:36:18 -0500 (Thu, 17 Jul 2008) | 1 line Post release cleanup ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 23 17:07:12 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 17:07:12 +0200 (CEST) Subject: [Python-3000-checkins] r65197 - in python/branches/py3k: Doc/library/parser.rst Misc/NEWS Modules/parsermodule.c Message-ID: <20080723150713.0053A1E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 17:07:12 2008 New Revision: 65197 Log: Remove "ast" aliases from the parser module. Modified: python/branches/py3k/Doc/library/parser.rst python/branches/py3k/Misc/NEWS python/branches/py3k/Modules/parsermodule.c Modified: python/branches/py3k/Doc/library/parser.rst ============================================================================== --- python/branches/py3k/Doc/library/parser.rst (original) +++ python/branches/py3k/Doc/library/parser.rst Wed Jul 23 17:07:12 2008 @@ -30,11 +30,6 @@ Syntax Tree (AST) generation and compilation stage, using the :mod:`ast` module. - The :mod:`parser` module exports the names documented here also with "st" - replaced by "ast"; this is a legacy from the time when there was no other - AST and has nothing to do with the AST found in Python 2.5. This is also the - reason for the functions' keyword arguments being called *ast*, not *st*. - There are a few things to note about this module which are important to making use of the data structures created. This is not a tutorial on editing the parse trees for Python code, but some examples of using the :mod:`parser` module are @@ -170,9 +165,9 @@ numbering information. -.. function:: st2list(ast[, line_info]) +.. function:: st2list(st[, line_info]) - This function accepts an ST object from the caller in *ast* and returns a + This function accepts an ST object from the caller in *st* and returns a Python list representing the equivalent parse tree. The resulting list representation can be used for inspection or the creation of a new parse tree in list form. This function does not fail so long as memory is available to build @@ -188,9 +183,9 @@ This information is omitted if the flag is false or omitted. -.. function:: st2tuple(ast[, line_info]) +.. function:: st2tuple(st[, line_info]) - This function accepts an ST object from the caller in *ast* and returns a + This function accepts an ST object from the caller in *st* and returns a Python tuple representing the equivalent parse tree. Other than returning a tuple instead of a list, this function is identical to :func:`st2list`. @@ -199,7 +194,7 @@ information is omitted if the flag is false or omitted. -.. function:: compilest(ast[, filename='']) +.. function:: compilest(st[, filename='']) .. index:: builtin: exec @@ -208,7 +203,7 @@ The Python byte compiler can be invoked on an ST object to produce code objects which can be used as part of a call to the built-in :func:`exec` or :func:`eval` functions. This function provides the interface to the compiler, passing the - internal parse tree from *ast* to the parser, using the source file name + internal parse tree from *st* to the parser, using the source file name specified by the *filename* parameter. The default value supplied for *filename* indicates that the source was an ST object. @@ -233,22 +228,22 @@ :func:`suite` or from a parse tree via :func:`sequence2st`. -.. function:: isexpr(ast) +.. function:: isexpr(st) .. index:: builtin: compile - When *ast* represents an ``'eval'`` form, this function returns true, otherwise + When *st* represents an ``'eval'`` form, this function returns true, otherwise it returns false. This is useful, since code objects normally cannot be queried for this information using existing built-in functions. Note that the code objects created by :func:`compilest` cannot be queried like this either, and are identical to those created by the built-in :func:`compile` function. -.. function:: issuite(ast) +.. function:: issuite(st) This function mirrors :func:`isexpr` in that it reports whether an ST object represents an ``'exec'`` form, commonly known as a "suite." It is not safe to - assume that this function is equivalent to ``not isexpr(ast)``, as additional + assume that this function is equivalent to ``not isexpr(st)``, as additional syntactic fragments may be supported in the future. Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Wed Jul 23 17:07:12 2008 @@ -34,6 +34,8 @@ Library ------- +- Removed "ast" function aliases from the parser module. + - Issue #3313: Fixed a crash when a failed dlopen() call does not set a valid dlerror() message. Modified: python/branches/py3k/Modules/parsermodule.c ============================================================================== --- python/branches/py3k/Modules/parsermodule.c (original) +++ python/branches/py3k/Modules/parsermodule.c Wed Jul 23 17:07:12 2008 @@ -322,7 +322,7 @@ PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", "col_info", NULL}; + static char *keywords[] = {"st", "line_info", "col_info", NULL}; if (self == NULL || PyModule_Check(self)) { ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2tuple", keywords, @@ -366,7 +366,7 @@ PyObject *res = 0; int ok; - static char *keywords[] = {"ast", "line_info", "col_info", NULL}; + static char *keywords[] = {"st", "line_info", "col_info", NULL}; if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2list", keywords, @@ -408,7 +408,7 @@ char* str = ""; int ok; - static char *keywords[] = {"ast", "filename", NULL}; + static char *keywords[] = {"st", "filename", NULL}; if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|s:compilest", keywords, @@ -437,7 +437,7 @@ PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static char *keywords[] = {"st", NULL}; if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:isexpr", keywords, @@ -460,7 +460,7 @@ PyObject* res = 0; int ok; - static char *keywords[] = {"ast", NULL}; + static char *keywords[] = {"st", NULL}; if (self == NULL || PyModule_Check(self)) ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:issuite", keywords, @@ -3011,12 +3011,6 @@ * inheritance. */ static PyMethodDef parser_functions[] = { - {"ast2tuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a tuple-tree representation of an ST.")}, - {"ast2list", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates a list-tree representation of an ST.")}, - {"compileast", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, - PyDoc_STR("Compiles an ST object into a code object.")}, {"compilest", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, PyDoc_STR("Compiles an ST object into a code object.")}, {"expr", (PyCFunction)parser_expr, PUBLIC_METHOD_TYPE, @@ -3027,16 +3021,12 @@ PyDoc_STR("Determines if an ST object was created from a suite.")}, {"suite", (PyCFunction)parser_suite, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a suite.")}, - {"sequence2ast", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates an ST object from a tree representation.")}, {"sequence2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a tree representation.")}, {"st2tuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates a tuple-tree representation of an ST.")}, {"st2list", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates a list-tree representation of an ST.")}, - {"tuple2ast", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, - PyDoc_STR("Creates an ST object from a tree representation.")}, {"tuple2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, PyDoc_STR("Creates an ST object from a tree representation.")}, @@ -3090,8 +3080,6 @@ return NULL; Py_INCREF(&PyST_Type); - PyModule_AddObject(module, "ASTType", (PyObject*)&PyST_Type); - Py_INCREF(&PyST_Type); PyModule_AddObject(module, "STType", (PyObject*)&PyST_Type); PyModule_AddStringConstant(module, "__copyright__", From python-3000-checkins at python.org Wed Jul 23 17:18:33 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 17:18:33 +0200 (CEST) Subject: [Python-3000-checkins] r65201 - python/branches/py3k Message-ID: <20080723151833.092101E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 17:18:32 2008 New Revision: 65201 Log: Blocked revisions 65198 via svnmerge ........ r65198 | georg.brandl | 2008-07-23 17:16:45 +0200 (Wed, 23 Jul 2008) | 2 lines 3k-warn about parser's "ast" aliases. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 23 17:19:11 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 17:19:11 +0200 (CEST) Subject: [Python-3000-checkins] r65202 - in python/branches/py3k: Doc/tools/sphinxext/pyspecific.py Message-ID: <20080723151911.959001E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 17:19:11 2008 New Revision: 65202 Log: Merged revisions 65199 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65199 | georg.brandl | 2008-07-23 17:17:09 +0200 (Wed, 23 Jul 2008) | 2 lines Move opcode handling to Python's extension. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/tools/sphinxext/pyspecific.py Modified: python/branches/py3k/Doc/tools/sphinxext/pyspecific.py ============================================================================== --- python/branches/py3k/Doc/tools/sphinxext/pyspecific.py (original) +++ python/branches/py3k/Doc/tools/sphinxext/pyspecific.py Wed Jul 23 17:19:11 2008 @@ -83,6 +83,28 @@ f.close() +# Support for documenting Opcodes + +import re +from sphinx import addnodes + +opcode_sig_re = re.compile(r'(\w+(?:\+\d)?)\s*\((.*)\)') + +def parse_opcode_signature(env, sig, signode): + """Transform an opcode signature into RST nodes.""" + m = opcode_sig_re.match(sig) + if m is None: + raise ValueError + opname, arglist = m.groups() + signode += addnodes.desc_name(opname, opname) + paramlist = addnodes.desc_parameterlist() + signode += paramlist + paramlist += addnodes.desc_parameter(arglist, arglist) + return opname.strip() + + def setup(app): app.add_role('issue', issue_role) app.add_builder(PydocTopicsBuilder) + app.add_description_unit('opcode', 'opcode', '%s (opcode)', + parse_opcode_signature) From python-3000-checkins at python.org Wed Jul 23 17:22:04 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 17:22:04 +0200 (CEST) Subject: [Python-3000-checkins] r65203 - python/branches/py3k Message-ID: <20080723152204.A62AB1E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 17:22:04 2008 New Revision: 65203 Log: Blocked revisions 65069,65075 via svnmerge ........ r65069 | eric.smith | 2008-07-17 19:48:39 +0200 (Thu, 17 Jul 2008) | 1 line Issue 3382: Make '%F' and float.__format__('F') convert results to upper case. ........ r65075 | eric.smith | 2008-07-17 21:49:47 +0200 (Thu, 17 Jul 2008) | 1 line Backed out r65069, pending fixing it in Windows. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 23 17:42:45 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 17:42:45 +0200 (CEST) Subject: [Python-3000-checkins] r65204 - python/branches/py3k Message-ID: <20080723154245.E8A2F1E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 17:42:45 2008 New Revision: 65204 Log: Blocked revisions 65032 via svnmerge ........ r65032 | jesse.noller | 2008-07-16 22:03:47 +0200 (Wed, 16 Jul 2008) | 2 lines Apply patch for 874900: threading module can deadlock after fork ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 23 18:10:55 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 18:10:55 +0200 (CEST) Subject: [Python-3000-checkins] r65206 - in python/branches/py3k: Doc/glossary.rst Doc/library/itertools.rst Doc/library/logging.rst Doc/library/re.rst Doc/library/string.rst Doc/reference/compound_stmts.rst Doc/reference/datamodel.rst Doc/tutorial/inputoutput.rst Doc/whatsnew/2.6.rst Lib/distutils/unixccompiler.py Lib/imghdr.py Lib/logging/config.py Lib/pydoc.py Lib/sqlite3/test/regression.py Lib/test/pystone.py Lib/test/test_audioop.py Lib/test/test_itertools.py Lib/test/test_locale.py Lib/test/test_logging.py Lib/test/test_multibytecodec.py Lib/test/test_multiprocessing.py Lib/test/test_random.py Lib/test/test_robotparser.py Lib/test/test_scope.py Modules/_localemodule.c Modules/_sqlite/connection.c Modules/_sqlite/module.c Modules/cjkcodecs/multibytecodec.c Modules/posixmodule.c Objects/bytearrayobject.c Objects/frameobject.c PC/_subprocess.c Python/pythonrun.c configure configure.in Message-ID: <20080723161055.DBBE21E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 18:10:53 2008 New Revision: 65206 Log: Merged revisions 65012,65035,65037-65040,65048,65057,65077,65091-65095,65097-65099,65127-65128,65131,65133-65136,65139,65149-65151,65155,65158-65159,65176-65178,65183-65184,65187-65190,65192,65194 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65012 | jesse.noller | 2008-07-16 15:24:06 +0200 (Wed, 16 Jul 2008) | 2 lines Apply patch for issue 3090: ARCHFLAGS parsing incorrect ........ r65035 | georg.brandl | 2008-07-16 23:19:28 +0200 (Wed, 16 Jul 2008) | 2 lines #3045: fix pydoc behavior for TEMP path with spaces. ........ r65037 | georg.brandl | 2008-07-16 23:31:41 +0200 (Wed, 16 Jul 2008) | 2 lines #1608818: errno can get set by every call to readdir(). ........ r65038 | georg.brandl | 2008-07-17 00:04:20 +0200 (Thu, 17 Jul 2008) | 2 lines #3305: self->stream can be NULL. ........ r65039 | georg.brandl | 2008-07-17 00:09:17 +0200 (Thu, 17 Jul 2008) | 2 lines #3345: fix docstring. ........ r65040 | georg.brandl | 2008-07-17 00:33:18 +0200 (Thu, 17 Jul 2008) | 2 lines #3312: fix two sqlite3 crashes. ........ r65048 | georg.brandl | 2008-07-17 01:35:54 +0200 (Thu, 17 Jul 2008) | 2 lines #3388: add a paragraph about using "with" for file objects. ........ r65057 | gregory.p.smith | 2008-07-17 05:13:05 +0200 (Thu, 17 Jul 2008) | 2 lines news note for r63052 ........ r65077 | jesse.noller | 2008-07-17 23:01:05 +0200 (Thu, 17 Jul 2008) | 3 lines Fix issue 3395, update _debugInfo to be _debug_info ........ r65091 | ronald.oussoren | 2008-07-18 07:48:03 +0200 (Fri, 18 Jul 2008) | 2 lines Last bit of a fix for issue3381 (addon for my patch in r65061) ........ r65092 | vinay.sajip | 2008-07-18 10:59:06 +0200 (Fri, 18 Jul 2008) | 1 line Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch. ........ r65093 | vinay.sajip | 2008-07-18 11:00:00 +0200 (Fri, 18 Jul 2008) | 1 line Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch. ........ r65094 | vinay.sajip | 2008-07-18 11:00:35 +0200 (Fri, 18 Jul 2008) | 1 line Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch. ........ r65095 | vinay.sajip | 2008-07-18 11:01:10 +0200 (Fri, 18 Jul 2008) | 1 line Issue #3389: Allow resolving dotted names for handlers in logging configuration files. Thanks to Philip Jenvey for the patch. ........ r65097 | georg.brandl | 2008-07-18 12:20:59 +0200 (Fri, 18 Jul 2008) | 2 lines Remove duplicate entry in __all__. ........ r65098 | georg.brandl | 2008-07-18 12:29:30 +0200 (Fri, 18 Jul 2008) | 2 lines Correct attribute name. ........ r65099 | georg.brandl | 2008-07-18 13:15:06 +0200 (Fri, 18 Jul 2008) | 3 lines Document the different meaning of precision for {:f} and {:g}. Also document how inf and nan are formatted. #3404. ........ r65127 | raymond.hettinger | 2008-07-19 02:42:03 +0200 (Sat, 19 Jul 2008) | 1 line Improve accuracy of gamma test function ........ r65128 | raymond.hettinger | 2008-07-19 02:43:00 +0200 (Sat, 19 Jul 2008) | 1 line Add recipe to the itertools docs. ........ r65131 | georg.brandl | 2008-07-19 12:08:55 +0200 (Sat, 19 Jul 2008) | 2 lines #3378: in case of no memory, don't leak even more memory. :) ........ r65133 | georg.brandl | 2008-07-19 14:39:10 +0200 (Sat, 19 Jul 2008) | 3 lines #3302: fix segfaults when passing None for arguments that can't be NULL for the C functions. ........ r65134 | georg.brandl | 2008-07-19 14:46:12 +0200 (Sat, 19 Jul 2008) | 2 lines #3303: fix crash with invalid Py_DECREF in strcoll(). ........ r65135 | georg.brandl | 2008-07-19 15:00:22 +0200 (Sat, 19 Jul 2008) | 3 lines #3319: don't raise ZeroDivisionError if number of rounds is so low that benchtime is zero. ........ r65136 | georg.brandl | 2008-07-19 15:09:42 +0200 (Sat, 19 Jul 2008) | 3 lines #3323: mention that if inheriting from a class without __slots__, the subclass will have a __dict__ available too. ........ r65139 | georg.brandl | 2008-07-19 15:48:44 +0200 (Sat, 19 Jul 2008) | 2 lines Add ordering info for findall and finditer. ........ r65149 | raymond.hettinger | 2008-07-20 01:21:57 +0200 (Sun, 20 Jul 2008) | 1 line Fix compress() recipe in docs to use itertools. ........ r65150 | raymond.hettinger | 2008-07-20 01:58:47 +0200 (Sun, 20 Jul 2008) | 1 line Clean-up itertools docs and recipes. ........ r65151 | gregory.p.smith | 2008-07-20 02:22:08 +0200 (Sun, 20 Jul 2008) | 9 lines fix issue3120 - don't truncate handles on 64-bit Windows. This is still messy, realistically PC/_subprocess.c should never cast pointers to python numbers and back at all. I don't have a 64-bit windows build environment because microsoft apparently thinks that should cost money. Time to watch the buildbots. It builds and passes tests on 32-bit windows. ........ r65155 | georg.brandl | 2008-07-20 13:50:29 +0200 (Sun, 20 Jul 2008) | 2 lines #926501: add info where to put the docstring. ........ r65158 | neal.norwitz | 2008-07-20 21:35:23 +0200 (Sun, 20 Jul 2008) | 1 line Fix a couple of names in error messages that were wrong ........ r65159 | neal.norwitz | 2008-07-20 22:39:36 +0200 (Sun, 20 Jul 2008) | 1 line Fix misspeeld method name (negative) ........ r65176 | amaury.forgeotdarc | 2008-07-21 23:36:24 +0200 (Mon, 21 Jul 2008) | 4 lines Increment version number in NEWS file, and move items that were added after 2.6b2. (I thought there was a script to automate this kind of updates) ........ r65177 | amaury.forgeotdarc | 2008-07-22 00:00:38 +0200 (Tue, 22 Jul 2008) | 5 lines Issue2378: pdb would delete free variables when stepping into a class statement. The problem was introduced by r53954, the correction is to restore the symmetry between PyFrame_FastToLocals and PyFrame_LocalsToFast ........ r65178 | benjamin.peterson | 2008-07-22 00:05:34 +0200 (Tue, 22 Jul 2008) | 1 line don't use assert statement ........ r65183 | ronald.oussoren | 2008-07-22 09:06:00 +0200 (Tue, 22 Jul 2008) | 2 lines Fix buglet in fix for issue3381 ........ r65184 | ronald.oussoren | 2008-07-22 09:06:33 +0200 (Tue, 22 Jul 2008) | 2 lines Fix build issue on OSX 10.4, somehow this wasn't committed before. ........ r65187 | raymond.hettinger | 2008-07-22 20:54:02 +0200 (Tue, 22 Jul 2008) | 1 line Remove out-of-date section on Exact/Inexact. ........ r65188 | raymond.hettinger | 2008-07-22 21:00:47 +0200 (Tue, 22 Jul 2008) | 1 line Tuples now have both count() and index(). ........ r65189 | raymond.hettinger | 2008-07-22 21:03:05 +0200 (Tue, 22 Jul 2008) | 1 line Fix credits for math.sum() ........ r65190 | raymond.hettinger | 2008-07-22 21:18:50 +0200 (Tue, 22 Jul 2008) | 1 line One more attribution. ........ r65192 | benjamin.peterson | 2008-07-23 01:44:37 +0200 (Wed, 23 Jul 2008) | 1 line remove unneeded import ........ r65194 | benjamin.peterson | 2008-07-23 15:25:06 +0200 (Wed, 23 Jul 2008) | 1 line use isinstance ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/glossary.rst python/branches/py3k/Doc/library/itertools.rst python/branches/py3k/Doc/library/logging.rst python/branches/py3k/Doc/library/re.rst python/branches/py3k/Doc/library/string.rst python/branches/py3k/Doc/reference/compound_stmts.rst python/branches/py3k/Doc/reference/datamodel.rst python/branches/py3k/Doc/tutorial/inputoutput.rst python/branches/py3k/Doc/whatsnew/2.6.rst python/branches/py3k/Lib/distutils/unixccompiler.py python/branches/py3k/Lib/imghdr.py python/branches/py3k/Lib/logging/config.py python/branches/py3k/Lib/pydoc.py python/branches/py3k/Lib/sqlite3/test/regression.py python/branches/py3k/Lib/test/pystone.py python/branches/py3k/Lib/test/test_audioop.py python/branches/py3k/Lib/test/test_itertools.py python/branches/py3k/Lib/test/test_locale.py python/branches/py3k/Lib/test/test_logging.py python/branches/py3k/Lib/test/test_multibytecodec.py python/branches/py3k/Lib/test/test_multiprocessing.py python/branches/py3k/Lib/test/test_random.py python/branches/py3k/Lib/test/test_robotparser.py python/branches/py3k/Lib/test/test_scope.py python/branches/py3k/Modules/_localemodule.c python/branches/py3k/Modules/_sqlite/connection.c python/branches/py3k/Modules/_sqlite/module.c python/branches/py3k/Modules/cjkcodecs/multibytecodec.c python/branches/py3k/Modules/posixmodule.c python/branches/py3k/Objects/bytearrayobject.c python/branches/py3k/Objects/frameobject.c python/branches/py3k/PC/_subprocess.c python/branches/py3k/Python/pythonrun.c python/branches/py3k/configure python/branches/py3k/configure.in Modified: python/branches/py3k/Doc/glossary.rst ============================================================================== --- python/branches/py3k/Doc/glossary.rst (original) +++ python/branches/py3k/Doc/glossary.rst Wed Jul 23 18:10:53 2008 @@ -100,6 +100,14 @@ of :class:`dict` much resembles that for :class:`list`, but the keys can be any object with a :meth:`__hash__` function, not just integers starting from zero. Called a hash in Perl. + + docstring + A docstring ("documentation string") is a string literal that appears as + the first thing in a class or function suite. While ignored when the + suite is executed, it is recognized by the compiler and put into the + :attr:`__doc__` attribute of the class or function. Since it is available + via introspection, it is the canonical place for documentation of the + object. duck-typing Pythonic programming style that determines an object's type by inspection Modified: python/branches/py3k/Doc/library/itertools.rst ============================================================================== --- python/branches/py3k/Doc/library/itertools.rst (original) +++ python/branches/py3k/Doc/library/itertools.rst Wed Jul 23 18:10:53 2008 @@ -33,18 +33,11 @@ Likewise, the functional tools are designed to work well with the high-speed functions provided by the :mod:`operator` module. -The module author welcomes suggestions for other basic building blocks to be -added to future versions of the module. - Whether cast in pure python form or compiled code, tools that use iterators are -more memory efficient (and faster) than their list based counterparts. Adopting +more memory efficient (and often faster) than their list based counterparts. Adopting the principles of just-in-time manufacturing, they create data when and where needed instead of consuming memory with the computer equivalent of "inventory". -The performance advantage of iterators becomes more acute as the number of -elements increases -- at some point, lists grow large enough to severely impact -memory cache performance and start running slowly. - .. seealso:: @@ -517,55 +510,35 @@ .. testcode:: - def take(n, seq): - return list(islice(seq, n)) + def take(n, iterable): + "Return first n items of the iterable as a list" + return list(islice(iterable, n)) - def enumerate(iterable): - return zip(count(), iterable) + def enumerate(iterable, start=0): + return zip(count(start), iterable) - def tabulate(function): + def tabulate(function, start=0): "Return function(0), function(1), ..." - return map(function, count()) - - def items(mapping): - return zip(mapping.keys(), mapping.values()) + return map(function, count(start)) def nth(iterable, n): - "Returns the nth item or raise StopIteration" - return next(islice(iterable, n, None)) + "Returns the nth item or empty list" + return list(islice(iterable, n, n+1)) - def all(seq, pred=None): - "Returns True if pred(x) is true for every element in the iterable" - for elem in filterfalse(pred, seq): - return False - return True - - def any(seq, pred=None): - "Returns True if pred(x) is true for at least one element in the iterable" - for elem in filter(pred, seq): - return True - return False - - def no(seq, pred=None): - "Returns True if pred(x) is false for every element in the iterable" - for elem in filter(pred, seq): - return False - return True - - def quantify(seq, pred=None): - "Count how many times the predicate is true in the sequence" - return sum(map(pred, seq)) + def quantify(iterable, pred=bool): + "Count how many times the predicate is true" + return sum(map(pred, iterable)) - def padnone(seq): + def padnone(iterable): """Returns the sequence elements and then returns None indefinitely. Useful for emulating the behavior of the built-in map() function. """ - return chain(seq, repeat(None)) + return chain(iterable, repeat(None)) - def ncycles(seq, n): + def ncycles(iterable, n): "Returns the sequence elements n times" - return chain.from_iterable(repeat(seq, n)) + return chain.from_iterable(repeat(iterable, n)) def dotproduct(vec1, vec2): return sum(map(operator.mul, vec1, vec2)) @@ -616,7 +589,21 @@ def compress(data, selectors): "compress('abcdef', [1,0,1,0,1,1]) --> a c e f" - for d, s in zip(data, selectors): - if s: - yield d - + decorated = zip(data, selectors) + filtered = filter(operator.itemgetter(1), decorated) + return map(operator.itemgetter(0), filtered) + + def combinations_with_replacement(iterable, r): + "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" + pool = tuple(iterable) + n = len(pool) + indices = [0] * r + yield tuple(pool[i] for i in indices) + while True: + for i in reversed(range(r)): + if indices[i] != n - 1: + break + else: + return + indices[i:] = [indices[i] + 1] * (r - i) + yield tuple(pool[i] for i in indices) Modified: python/branches/py3k/Doc/library/logging.rst ============================================================================== --- python/branches/py3k/Doc/library/logging.rst (original) +++ python/branches/py3k/Doc/library/logging.rst Wed Jul 23 18:10:53 2008 @@ -1647,7 +1647,7 @@ The system will save old log files by appending extensions to the filename. The extensions are date-and-time based, using the strftime format ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the - rollover interval. + rollover interval. If the *utc* argument is true, times in UTC will be used; otherwise local time is used. @@ -2315,6 +2315,10 @@ in the ``logging`` package's namespace). The ``level`` is interpreted as for loggers, and ``NOTSET`` is taken to mean "log everything". +.. versionchanged:: 2.6 + Added support for resolving the handler's class as a dotted module and class + name. + The ``formatter`` entry indicates the key name of the formatter for this handler. If blank, a default formatter (``logging._defaultFormatter``) is used. If a name is specified, it must appear in the ``[formatters]`` section and have Modified: python/branches/py3k/Doc/library/re.rst ============================================================================== --- python/branches/py3k/Doc/library/re.rst (original) +++ python/branches/py3k/Doc/library/re.rst Wed Jul 23 18:10:53 2008 @@ -571,17 +571,20 @@ .. function:: findall(pattern, string[, flags]) Return all non-overlapping matches of *pattern* in *string*, as a list of - strings. If one or more groups are present in the pattern, return a list of - groups; this will be a list of tuples if the pattern has more than one group. - Empty matches are included in the result unless they touch the beginning of - another match. + strings. The *string* is scanned left-to-right, and matches are returned in + the order found. If one or more groups are present in the pattern, return a + list of groups; this will be a list of tuples if the pattern has more than + one group. Empty matches are included in the result unless they touch the + beginning of another match. .. function:: finditer(pattern, string[, flags]) Return an :term:`iterator` yielding :class:`MatchObject` instances over all - non-overlapping matches for the RE *pattern* in *string*. Empty matches are - included in the result unless they touch the beginning of another match. + non-overlapping matches for the RE *pattern* in *string*. The *string* is + scanned left-to-right, and matches are returned in the order found. Empty + matches are included in the result unless they touch the beginning of another + match. .. function:: sub(pattern, repl, string[, count]) Modified: python/branches/py3k/Doc/library/string.rst ============================================================================== --- python/branches/py3k/Doc/library/string.rst (original) +++ python/branches/py3k/Doc/library/string.rst Wed Jul 23 18:10:53 2008 @@ -360,10 +360,11 @@ character of ``'0'``. The *precision* is a decimal number indicating how many digits should be -displayed after the decimal point for a floating point value. For non-number -types the field indicates the maximum field size - in other words, how many -characters will be used from the field content. The *precision* is ignored for -integer values. +displayed after the decimal point for a floating point value formatted with +``'f'`` and ``'F'``, or before and after the decimal point for a floating point +value formatted with ``'g'`` or ``'G'``. For non-number types the field +indicates the maximum field size - in other words, how many characters will be +used from the field content. The *precision* is ignored for integer values. Finally, the *type* determines how the data should be presented. @@ -391,7 +392,7 @@ | | the current locale setting to insert the appropriate | | | number separator characters. | +---------+----------------------------------------------------------+ - | None | the same as ``'d'`` | + | None | The same as ``'d'``. | +---------+----------------------------------------------------------+ The available presentation types for floating point and decimal values are: @@ -412,10 +413,13 @@ +---------+----------------------------------------------------------+ | ``'g'`` | General format. This prints the number as a fixed-point | | | number, unless the number is too large, in which case | - | | it switches to ``'e'`` exponent notation. | + | | it switches to ``'e'`` exponent notation. Infinity and | + | | NaN values are formatted as ``inf``, ``-inf`` and | + | | ``nan``, respectively. | +---------+----------------------------------------------------------+ | ``'G'`` | General format. Same as ``'g'`` except switches to | - | | ``'E'`` if the number gets to large. | + | | ``'E'`` if the number gets to large. The representations | + | | of infinity and NaN are uppercased, too. | +---------+----------------------------------------------------------+ | ``'n'`` | Number. This is the same as ``'g'``, except that it uses | | | the current locale setting to insert the appropriate | @@ -424,7 +428,7 @@ | ``'%'`` | Percentage. Multiplies the number by 100 and displays | | | in fixed (``'f'``) format, followed by a percent sign. | +---------+----------------------------------------------------------+ - | None | the same as ``'g'`` | + | None | The same as ``'g'``. | +---------+----------------------------------------------------------+ Modified: python/branches/py3k/Doc/reference/compound_stmts.rst ============================================================================== --- python/branches/py3k/Doc/reference/compound_stmts.rst (original) +++ python/branches/py3k/Doc/reference/compound_stmts.rst Wed Jul 23 18:10:53 2008 @@ -433,7 +433,7 @@ when the function is called. The function definition does not execute the function body; this gets executed -only when the function is called. +only when the function is called. [#]_ .. index:: statement: @ @@ -535,6 +535,7 @@ pair: name; binding pair: execution; frame single: inheritance + single: docstring A class definition defines a class object (see section :ref:`types`): @@ -552,10 +553,10 @@ then executed in a new execution frame (see section :ref:`naming`), using a newly created local namespace and the original global namespace. (Usually, the suite contains only function definitions.) When the class's suite finishes -execution, its execution frame is discarded but its local namespace is saved. A -class object is then created using the inheritance list for the base classes and -the saved local namespace for the attribute dictionary. The class name is bound -to this class object in the original local namespace. +execution, its execution frame is discarded but its local namespace is +saved. [#]_ A class object is then created using the inheritance list for the +base classes and the saved local namespace for the attribute dictionary. The +class name is bound to this class object in the original local namespace. Classes can also be decorated; as with functions, :: @@ -597,3 +598,11 @@ .. [#] Currently, control "flows off the end" except in the case of an exception or the execution of a :keyword:`return`, :keyword:`continue`, or :keyword:`break` statement. + +.. [#] A string literal appearing as the first statement in the function body is + transformed into the function's ``__doc__`` attribute and therefore the + function's :term:`docstring`. + +.. [#] A string literal appearing as the first statement in the class body is + transformed into the namespace's ``__doc__`` item and therefore the class's + :term:`docstring`. Modified: python/branches/py3k/Doc/reference/datamodel.rst ============================================================================== --- python/branches/py3k/Doc/reference/datamodel.rst (original) +++ python/branches/py3k/Doc/reference/datamodel.rst Wed Jul 23 18:10:53 2008 @@ -1435,6 +1435,10 @@ Notes on using *__slots__* """""""""""""""""""""""""" +* When inheriting from a class without *__slots__*, the *__dict__* attribute of + that class will always be accessible, so a *__slots__* definition in the + subclass is meaningless. + * Without a *__dict__* variable, instances cannot be assigned new variables not listed in the *__slots__* definition. Attempts to assign to an unlisted variable name raises :exc:`AttributeError`. If dynamic assignment of new Modified: python/branches/py3k/Doc/tutorial/inputoutput.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/inputoutput.rst (original) +++ python/branches/py3k/Doc/tutorial/inputoutput.rst Wed Jul 23 18:10:53 2008 @@ -355,6 +355,16 @@ File "", line 1, in ? ValueError: I/O operation on closed file +It is good practice to use the :keyword:`with` keyword when dealing with file +objects. This has the advantage that the file is properly closed after its +suite finishes, even if an exception is raised on the way. It is also much +shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: + + >>> with open('/tmp/workfile', 'r') as f: + ... read_data = f.read() + >>> f.closed + True + File objects have some additional methods, such as :meth:`isatty` and :meth:`truncate` which are less frequently used; consult the Library Reference for a complete guide to file objects. Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Wed Jul 23 18:10:53 2008 @@ -1324,14 +1324,6 @@ all, and only exists to allow checking if an object is a number by doing ``isinstance(obj, Number)``. -Numbers are further divided into :class:`Exact` and :class:`Inexact`. -Exact numbers can represent values precisely and operations never -round off the results or introduce tiny errors that may break the -commutativity and associativity properties; inexact numbers may -perform such rounding or introduce small errors. Integers, long -integers, and rational numbers are exact, while floating-point -and complex numbers are inexact. - :class:`Complex` is a subclass of :class:`Number`. Complex numbers can undergo the basic operations of addition, subtraction, multiplication, division, and exponentiation, and you can retrieve the @@ -1449,13 +1441,15 @@ it will be returned if *iterator* has been exhausted; otherwise, the :exc:`StopIteration` exception will be raised. (:issue:`2719`) -* Tuples now have an :meth:`index` method matching the list type's - :meth:`index` method:: +* Tuples now have :meth:`index` and :meth:`count` methods matching the + list type's :meth:`index` and :meth:`count` methods:: >>> t = (0,1,2,3,4) >>> t.index(3) 3 + (Contributed by Raymond Hettinger) + * The built-in types now have improved support for extended slicing syntax, where various combinations of ``(start, stop, step)`` are supplied. Previously, the support was partial and certain corner cases wouldn't work. @@ -1545,7 +1539,8 @@ * :func:`~math.sum` adds up the stream of numbers from an iterable, and is careful to avoid loss of precision by calculating partial sums. - (Contributed by Jean Brouwers; :issue:`2819`.) + (Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson; + :issue:`2819`.) * The inverse hyperbolic functions :func:`~math.acosh`, :func:`~math.asinh` and :func:`~math.atanh`. @@ -1596,8 +1591,8 @@ * The string :meth:`translate` method now accepts ``None`` as the translation table parameter, which is treated as the identity transformation. This makes it easier to carry out operations - that only delete characters. (Contributed by Bengt Richter; - :issue:`1193128`.) + that only delete characters. (Contributed by Bengt Richter and + implemented by Raymond Hettinger; :issue:`1193128`.) * The built-in :func:`dir` function now checks for a :meth:`__dir__` method on the objects it receives. This method must return a list Modified: python/branches/py3k/Lib/distutils/unixccompiler.py ============================================================================== --- python/branches/py3k/Lib/distutils/unixccompiler.py (original) +++ python/branches/py3k/Lib/distutils/unixccompiler.py Wed Jul 23 18:10:53 2008 @@ -75,8 +75,7 @@ if 'ARCHFLAGS' in os.environ and not stripArch: # User specified different -arch flags in the environ, # see also distutils.sysconfig - compiler_so = compiler_so + ' ' + os.environ['ARCHFLAGS'] - + compiler_so = compiler_so + os.environ['ARCHFLAGS'].split() if stripSysroot: try: Modified: python/branches/py3k/Lib/imghdr.py ============================================================================== --- python/branches/py3k/Lib/imghdr.py (original) +++ python/branches/py3k/Lib/imghdr.py Wed Jul 23 18:10:53 2008 @@ -8,7 +8,7 @@ def what(file, h=None): if h is None: - if type(file) == type(''): + if isinstance(file, str): f = open(file, 'rb') h = f.read(32) else: Modified: python/branches/py3k/Lib/logging/config.py ============================================================================== --- python/branches/py3k/Lib/logging/config.py (original) +++ python/branches/py3k/Lib/logging/config.py Wed Jul 23 18:10:53 2008 @@ -143,7 +143,10 @@ fmt = cp.get(sectname, "formatter") else: fmt = "" - klass = eval(klass, vars(logging)) + try: + klass = eval(klass, vars(logging)) + except (AttributeError, NameError): + klass = _resolve(klass) args = cp.get(sectname, "args") args = eval(args, vars(logging)) h = klass(*args) Modified: python/branches/py3k/Lib/pydoc.py ============================================================================== --- python/branches/py3k/Lib/pydoc.py (original) +++ python/branches/py3k/Lib/pydoc.py Wed Jul 23 18:10:53 2008 @@ -1342,7 +1342,7 @@ (fd, filename) = tempfile.mkstemp() os.close(fd) try: - if hasattr(os, 'system') and os.system('more %s' % filename) == 0: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: return lambda text: pipepager(text, 'more') else: return ttypager @@ -1370,7 +1370,7 @@ file.write(text) file.close() try: - os.system(cmd + ' ' + filename) + os.system(cmd + ' "' + filename + '"') finally: os.unlink(filename) Modified: python/branches/py3k/Lib/sqlite3/test/regression.py ============================================================================== --- python/branches/py3k/Lib/sqlite3/test/regression.py (original) +++ python/branches/py3k/Lib/sqlite3/test/regression.py Wed Jul 23 18:10:53 2008 @@ -146,7 +146,8 @@ # decoding errors disappeared. This verifies they're back again. failure = None try: - self.con.execute("select 'xxx' || ? || 'yyy' colname", (bytes(bytearray([250])),)).fetchone() + self.con.execute("select 'xxx' || ? || 'yyy' colname", + (bytes(bytearray([250])),)).fetchone() failure = "should have raised an OperationalError with detailed description" except sqlite.OperationalError as e: msg = e.args[0] @@ -155,6 +156,20 @@ if failure: self.fail(failure) + def CheckRegisterAdapter(self): + """ + See issue 3312. + """ + self.assertRaises(TypeError, sqlite.register_adapter, {}, None) + + def CheckSetIsolationLevel(self): + """ + See issue 3312. + """ + con = sqlite.connect(":memory:") + setattr(con, "isolation_level", "\xe9") + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") return unittest.TestSuite((regression_suite,)) Modified: python/branches/py3k/Lib/test/pystone.py ============================================================================== --- python/branches/py3k/Lib/test/pystone.py (original) +++ python/branches/py3k/Lib/test/pystone.py Wed Jul 23 18:10:53 2008 @@ -128,7 +128,11 @@ IntLoc1 = Proc2(IntLoc1) benchtime = clock() - starttime - nulltime - return benchtime, (loops / benchtime) + if benchtime == 0.0: + loopsPerBenchtime = 0.0 + else: + loopsPerBenchtime = (loops / benchtime) + return benchtime, loopsPerBenchtime def Proc1(PtrParIn): PtrParIn.PtrComp = NextRecord = PtrGlb.copy() Modified: python/branches/py3k/Lib/test/test_audioop.py ============================================================================== --- python/branches/py3k/Lib/test/test_audioop.py (original) +++ python/branches/py3k/Lib/test/test_audioop.py Wed Jul 23 18:10:53 2008 @@ -163,7 +163,7 @@ self.assertEqual(audioop.getsample(data[1], 2, i), i) self.assertEqual(audioop.getsample(data[2], 4, i), i) - def test_negavitelen(self): + def test_negativelen(self): # from issue 3306, previously it segfaulted self.assertRaises(audioop.error, audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392) Modified: python/branches/py3k/Lib/test/test_itertools.py ============================================================================== --- python/branches/py3k/Lib/test/test_itertools.py (original) +++ python/branches/py3k/Lib/test/test_itertools.py Wed Jul 23 18:10:53 2008 @@ -1204,52 +1204,32 @@ [22] [25, 26, 27, 28] ->>> def take(n, seq): -... return list(islice(seq, n)) +>>> def take(n, iterable): +... "Return first n items of the iterable as a list" +... return list(islice(iterable, n)) ->>> def enumerate(iterable): -... return zip(count(), iterable) +>>> def enumerate(iterable, start=0): +... return zip(count(start), iterable) ->>> def tabulate(function): +>>> def tabulate(function, start=0): ... "Return function(0), function(1), ..." -... return map(function, count()) - ->>> def iteritems(mapping): -... return zip(mapping.keys(), mapping.values()) +... return map(function, count(start)) >>> def nth(iterable, n): -... "Returns the nth item" +... "Returns the nth item or empty list" ... return list(islice(iterable, n, n+1)) ->>> def all(seq, pred=None): -... "Returns True if pred(x) is true for every element in the iterable" -... for elem in filterfalse(pred, seq): -... return False -... return True - ->>> def any(seq, pred=None): -... "Returns True if pred(x) is true for at least one element in the iterable" -... for elem in filter(pred, seq): -... return True -... return False - ->>> def no(seq, pred=None): -... "Returns True if pred(x) is false for every element in the iterable" -... for elem in filter(pred, seq): -... return False -... return True - ->>> def quantify(seq, pred=None): -... "Count how many times the predicate is true in the sequence" -... return sum(map(pred, seq)) +>>> def quantify(iterable, pred=bool): +... "Count how many times the predicate is true" +... return sum(map(pred, iterable)) ->>> def padnone(seq): +>>> def padnone(iterable): ... "Returns the sequence elements and then returns None indefinitely" -... return chain(seq, repeat(None)) +... return chain(iterable, repeat(None)) ->>> def ncycles(seq, n): -... "Returns the sequence elements n times" -... return chain(*repeat(seq, n)) +>>> def ncycles(iterable, n): +... "Returns the seqeuence elements n times" +... return chain(*repeat(iterable, n)) >>> def dotproduct(vec1, vec2): ... return sum(map(operator.mul, vec1, vec2)) @@ -1302,9 +1282,24 @@ >>> def compress(data, selectors): ... "compress('abcdef', [1,0,1,0,1,1]) --> a c e f" -... for d, s in zip(data, selectors): -... if s: -... yield d +... decorated = zip(data, selectors) +... filtered = filter(operator.itemgetter(1), decorated) +... return map(operator.itemgetter(0), filtered) + +>>> def combinations_with_replacement(iterable, r): +... "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" +... pool = tuple(iterable) +... n = len(pool) +... indices = [0] * r +... yield tuple(pool[i] for i in indices) +... while 1: +... for i in reversed(range(r)): +... if indices[i] != n - 1: +... break +... else: +... return +... indices[i:] = [indices[i] + 1] * (r - i) +... yield tuple(pool[i] for i in indices) This is not part of the examples but it tests to make sure the definitions perform as purported. @@ -1321,24 +1316,6 @@ >>> nth('abcde', 3) ['d'] ->>> all([2, 4, 6, 8], lambda x: x%2==0) -True - ->>> all([2, 3, 6, 8], lambda x: x%2==0) -False - ->>> any([2, 4, 6, 8], lambda x: x%2==0) -True - ->>> any([1, 3, 5, 9], lambda x: x%2==0,) -False - ->>> no([1, 3, 5, 9], lambda x: x%2==0) -True - ->>> no([1, 2, 5, 9], lambda x: x%2==0) -False - >>> quantify(range(99), lambda x: x%2==0) 50 @@ -1383,6 +1360,9 @@ >>> list(compress('abcdef', [1,0,1,0,1,1])) ['a', 'c', 'e', 'f'] +>>> list(combinations_with_replacement('abc', 2)) +[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')] + """ __test__ = {'libreftest' : libreftest} Modified: python/branches/py3k/Lib/test/test_locale.py ============================================================================== --- python/branches/py3k/Lib/test/test_locale.py (original) +++ python/branches/py3k/Lib/test/test_locale.py Wed Jul 23 18:10:53 2008 @@ -1,4 +1,4 @@ -from test.support import verbose, TestSkipped +from test.support import verbose, TestSkipped, TestFailed import locale import sys @@ -78,3 +78,12 @@ finally: locale.setlocale(locale.LC_NUMERIC, oldlocale) + +if hasattr(locale, "strcoll"): + # test crasher from bug #3303 + try: + locale.strcoll("a", None) + except TypeError: + pass + else: + raise TestFailed("TypeError not raised") Modified: python/branches/py3k/Lib/test/test_logging.py ============================================================================== --- python/branches/py3k/Lib/test/test_logging.py (original) +++ python/branches/py3k/Lib/test/test_logging.py Wed Jul 23 18:10:53 2008 @@ -584,6 +584,9 @@ datefmt= """ + # config5 specifies a custom handler class to be loaded + config5 = config1.replace('class=StreamHandler', 'class=logging.StreamHandler') + def apply_config(self, conf): try: fn = tempfile.mktemp(".ini") @@ -609,10 +612,10 @@ # Original logger output is empty. self.assert_log_lines([]) - def test_config1_ok(self): + def test_config1_ok(self, config=config1): # A config file defining a sub-parser as well. with captured_stdout() as output: - self.apply_config(self.config1) + self.apply_config(config) logger = logging.getLogger("compiler.parser") # Both will output a message logger.info(self.next_message()) @@ -647,6 +650,8 @@ # Original logger output is empty self.assert_log_lines([]) + def test_config5_ok(self): + self.test_config1_ok(config=self.config5) class LogRecordStreamHandler(StreamRequestHandler): Modified: python/branches/py3k/Lib/test/test_multibytecodec.py ============================================================================== --- python/branches/py3k/Lib/test/test_multibytecodec.py (original) +++ python/branches/py3k/Lib/test/test_multibytecodec.py Wed Jul 23 18:10:53 2008 @@ -8,6 +8,7 @@ from test import test_multibytecodec_support from test.support import TESTFN import unittest, io, codecs, sys, os +import _multibytecodec ALL_CJKENCODINGS = [ # _codecs_cn @@ -53,6 +54,14 @@ finally: support.unlink(TESTFN) + def test_init_segfault(self): + # bug #3305: this used to segfault + self.assertRaises(AttributeError, + _multibytecodec.MultibyteStreamReader, None) + self.assertRaises(AttributeError, + _multibytecodec.MultibyteStreamWriter, None) + + class Test_IncrementalEncoder(unittest.TestCase): def test_stateless(self): Modified: python/branches/py3k/Lib/test/test_multiprocessing.py ============================================================================== --- python/branches/py3k/Lib/test/test_multiprocessing.py (original) +++ python/branches/py3k/Lib/test/test_multiprocessing.py Wed Jul 23 18:10:53 2008 @@ -1038,7 +1038,7 @@ gc.collect() # do garbage collection refs = self.manager._number_of_objects() if refs != EXPECTED_NUMBER: - print(self.manager._debugInfo()) + print(self.manager._debug_info()) self.assertEqual(refs, EXPECTED_NUMBER) Modified: python/branches/py3k/Lib/test/test_random.py ============================================================================== --- python/branches/py3k/Lib/test/test_random.py (original) +++ python/branches/py3k/Lib/test/test_random.py Wed Jul 23 18:10:53 2008 @@ -5,7 +5,7 @@ import time import pickle import warnings -from math import log, exp, sqrt, pi +from math import log, exp, sqrt, pi, sum as msum from test import support class TestBasicOps(unittest.TestCase): @@ -389,11 +389,9 @@ def gamma(z, cof=_gammacoeff, g=7): z -= 1.0 - sum = cof[0] - for i in range(1,len(cof)): - sum += cof[i] / (z+i) + s = msum([cof[0]] + [cof[i] / (z+i) for i in range(1,len(cof))]) z += 0.5 - return (z+g)**z / exp(z+g) * sqrt(2*pi) * sum + return (z+g)**z / exp(z+g) * sqrt(2.0*pi) * s class TestDistributions(unittest.TestCase): def test_zeroinputs(self): Modified: python/branches/py3k/Lib/test/test_robotparser.py ============================================================================== --- python/branches/py3k/Lib/test/test_robotparser.py (original) +++ python/branches/py3k/Lib/test/test_robotparser.py Wed Jul 23 18:10:53 2008 @@ -139,7 +139,8 @@ class NetworkTestCase(unittest.TestCase): def testPasswordProtectedSite(self): - support.requires('network') + if not support.is_resource_enabled('network'): + return # whole site is password-protected. url = 'http://mueblesmoraleda.com' parser = urllib.robotparser.RobotFileParser() @@ -148,7 +149,8 @@ self.assertEqual(parser.can_fetch("*", url+"/robots.txt"), False) def testPythonOrg(self): - support.requires('network') + if not support.is_resource_enabled('network'): + return parser = urllib.robotparser.RobotFileParser( "http://www.python.org/robots.txt") parser.read() @@ -160,5 +162,5 @@ support.run_unittest(tests) if __name__=='__main__': - support.Verbose = 1 + support.verbose = 1 test_main() Modified: python/branches/py3k/Lib/test/test_scope.py ============================================================================== --- python/branches/py3k/Lib/test/test_scope.py (original) +++ python/branches/py3k/Lib/test/test_scope.py Wed Jul 23 18:10:53 2008 @@ -495,6 +495,24 @@ self.assert_("x" not in varnames) self.assert_("y" in varnames) + def testLocalsClass_WithTrace(self): + # Issue23728: after the trace function returns, the locals() + # dictionary is used to update all variables, this used to + # include free variables. But in class statements, free + # variables are not inserted... + import sys + sys.settrace(lambda a,b,c:None) + try: + x = 12 + + class C: + def f(self): + return x + + self.assertEquals(x, 12) # Used to raise UnboundLocalError + finally: + sys.settrace(None) + def testBoundAndFree(self): # var is bound and free in class Modified: python/branches/py3k/Modules/_localemodule.c ============================================================================== --- python/branches/py3k/Modules/_localemodule.c (original) +++ python/branches/py3k/Modules/_localemodule.c Wed Jul 23 18:10:53 2008 @@ -530,7 +530,7 @@ PyIntl_gettext(PyObject* self, PyObject *args) { char *in; - if (!PyArg_ParseTuple(args, "z", &in)) + if (!PyArg_ParseTuple(args, "s", &in)) return 0; return str2uni(gettext(in)); } @@ -543,7 +543,7 @@ PyIntl_dgettext(PyObject* self, PyObject *args) { char *domain, *in; - if (!PyArg_ParseTuple(args, "zz", &domain, &in)) + if (!PyArg_ParseTuple(args, "zs", &domain, &in)) return 0; return str2uni(dgettext(domain, in)); } @@ -557,7 +557,7 @@ { char *domain, *msgid; int category; - if (!PyArg_ParseTuple(args, "zzi", &domain, &msgid, &category)) + if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category)) return 0; return str2uni(dcgettext(domain,msgid,category)); } @@ -587,9 +587,13 @@ static PyObject* PyIntl_bindtextdomain(PyObject* self,PyObject*args) { - char *domain,*dirname; - if (!PyArg_ParseTuple(args, "zz", &domain, &dirname)) + char *domain, *dirname; + if (!PyArg_ParseTuple(args, "sz", &domain, &dirname)) return 0; + if (!strlen(domain)) { + PyErr_SetString(Error, "domain must be a non-empty string"); + return 0; + } dirname = bindtextdomain(domain, dirname); if (!dirname) { PyErr_SetFromErrno(PyExc_OSError); Modified: python/branches/py3k/Modules/_sqlite/connection.c ============================================================================== --- python/branches/py3k/Modules/_sqlite/connection.c (original) +++ python/branches/py3k/Modules/_sqlite/connection.c Wed Jul 23 18:10:53 2008 @@ -902,8 +902,13 @@ } statement = PyUnicode_AsStringAndSize(begin_statement, &size); + if (!statement) { + Py_DECREF(statement); + return -1; + } self->begin_statement = PyMem_Malloc(size + 2); if (!self->begin_statement) { + Py_DECREF(begin_statement); return -1; } Modified: python/branches/py3k/Modules/_sqlite/module.c ============================================================================== --- python/branches/py3k/Modules/_sqlite/module.c (original) +++ python/branches/py3k/Modules/_sqlite/module.c Wed Jul 23 18:10:53 2008 @@ -147,6 +147,7 @@ { PyTypeObject* type; PyObject* caster; + int rc; if (!PyArg_ParseTuple(args, "OO", &type, &caster)) { return NULL; @@ -159,7 +160,9 @@ pysqlite_BaseTypeAdapted = 1; } - microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster); + rc = microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster); + if (rc == -1) + return NULL; Py_INCREF(Py_None); return Py_None; Modified: python/branches/py3k/Modules/cjkcodecs/multibytecodec.c ============================================================================== --- python/branches/py3k/Modules/cjkcodecs/multibytecodec.c (original) +++ python/branches/py3k/Modules/cjkcodecs/multibytecodec.c Wed Jul 23 18:10:53 2008 @@ -1502,7 +1502,7 @@ { PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); - Py_DECREF(self->stream); + Py_XDECREF(self->stream); Py_TYPE(self)->tp_free(self); } @@ -1705,7 +1705,7 @@ { PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); - Py_DECREF(self->stream); + Py_XDECREF(self->stream); Py_TYPE(self)->tp_free(self); } Modified: python/branches/py3k/Modules/posixmodule.c ============================================================================== --- python/branches/py3k/Modules/posixmodule.c (original) +++ python/branches/py3k/Modules/posixmodule.c Wed Jul 23 18:10:53 2008 @@ -2350,11 +2350,19 @@ return NULL; } for (;;) { + errno = 0; Py_BEGIN_ALLOW_THREADS ep = readdir(dirp); Py_END_ALLOW_THREADS - if (ep == NULL) - break; + if (ep == NULL) { + if (errno == 0) { + break; + } else { + closedir(dirp); + Py_DECREF(d); + return posix_error_with_allocated_filename(name); + } + } if (ep->d_name[0] == '.' && (NAMLEN(ep) == 1 || (ep->d_name[1] == '.' && NAMLEN(ep) == 2))) @@ -2389,12 +2397,6 @@ } Py_DECREF(v); } - if (errno != 0 && d != NULL) { - /* readdir() returned NULL and set errno */ - closedir(dirp); - Py_DECREF(d); - return posix_error_with_allocated_filename(name); - } closedir(dirp); PyMem_Free(name); Modified: python/branches/py3k/Objects/bytearrayobject.c ============================================================================== --- python/branches/py3k/Objects/bytearrayobject.c (original) +++ python/branches/py3k/Objects/bytearrayobject.c Wed Jul 23 18:10:53 2008 @@ -447,7 +447,7 @@ else { if (_getbuffer(values, &vbytes) < 0) { PyErr_Format(PyExc_TypeError, - "can't set bytes slice from %.100s", + "can't set bytearray slice from %.100s", Py_TYPE(values)->tp_name); return -1; } @@ -699,7 +699,7 @@ } /* Parse arguments */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytes", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oss:bytearray", kwlist, &arg, &encoding, &errors)) return -1; Modified: python/branches/py3k/Objects/frameobject.c ============================================================================== --- python/branches/py3k/Objects/frameobject.c (original) +++ python/branches/py3k/Objects/frameobject.c Wed Jul 23 18:10:53 2008 @@ -909,9 +909,12 @@ if (ncells || nfreevars) { dict_to_map(co->co_cellvars, ncells, locals, fast + co->co_nlocals, 1, clear); - dict_to_map(co->co_freevars, nfreevars, - locals, fast + co->co_nlocals + ncells, 1, - clear); + /* Same test as in PyFrame_FastToLocals() above. */ + if (co->co_flags & CO_OPTIMIZED) { + dict_to_map(co->co_freevars, nfreevars, + locals, fast + co->co_nlocals + ncells, 1, + clear); + } } PyErr_Restore(error_type, error_value, error_traceback); } Modified: python/branches/py3k/PC/_subprocess.c ============================================================================== --- python/branches/py3k/PC/_subprocess.c (original) +++ python/branches/py3k/PC/_subprocess.c Wed Jul 23 18:10:53 2008 @@ -66,6 +66,14 @@ return (PyObject*) self; } +#if defined(MS_WIN32) && !defined(MS_WIN64) +#define HANDLE_TO_PYNUM(handle) PyLong_FromLong((long) handle) +#define PY_HANDLE_PARAM "l" +#else +#define HANDLE_TO_PYNUM(handle) PyLong_FromLongLong((long long) handle) +#define PY_HANDLE_PARAM "L" +#endif + static PyObject* sp_handle_detach(sp_handle_object* self, PyObject* args) { @@ -79,7 +87,7 @@ self->handle = NULL; /* note: return the current handle, as an integer */ - return PyLong_FromLong((long) handle); + return HANDLE_TO_PYNUM(handle); } static PyObject* @@ -113,7 +121,7 @@ static PyObject* sp_handle_as_int(sp_handle_object* self) { - return PyLong_FromLong((long) self->handle); + return HANDLE_TO_PYNUM(self->handle); } static PyNumberMethods sp_handle_as_number; @@ -172,7 +180,7 @@ } /* note: returns integer, not handle object */ - return PyLong_FromLong((long) handle); + return HANDLE_TO_PYNUM(handle); } static PyObject * @@ -190,14 +198,16 @@ HANDLE target_handle; BOOL result; - long source_process_handle; - long source_handle; - long target_process_handle; + HANDLE source_process_handle; + HANDLE source_handle; + HANDLE target_process_handle; int desired_access; int inherit_handle; int options = 0; - if (! PyArg_ParseTuple(args, "lllii|i:DuplicateHandle", + if (! PyArg_ParseTuple(args, + PY_HANDLE_PARAM PY_HANDLE_PARAM PY_HANDLE_PARAM + "ii|i:DuplicateHandle", &source_process_handle, &source_handle, &target_process_handle, @@ -208,9 +218,9 @@ Py_BEGIN_ALLOW_THREADS result = DuplicateHandle( - (HANDLE) source_process_handle, - (HANDLE) source_handle, - (HANDLE) target_process_handle, + source_process_handle, + source_handle, + target_process_handle, &target_handle, desired_access, inherit_handle, @@ -440,13 +450,13 @@ { BOOL result; - long process; + HANDLE process; int exit_code; - if (! PyArg_ParseTuple(args, "li:TerminateProcess", &process, - &exit_code)) + if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:TerminateProcess", + &process, &exit_code)) return NULL; - result = TerminateProcess((HANDLE) process, exit_code); + result = TerminateProcess(process, exit_code); if (! result) return PyErr_SetFromWindowsErr(GetLastError()); @@ -461,11 +471,11 @@ DWORD exit_code; BOOL result; - long process; - if (! PyArg_ParseTuple(args, "l:GetExitCodeProcess", &process)) + HANDLE process; + if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetExitCodeProcess", &process)) return NULL; - result = GetExitCodeProcess((HANDLE) process, &exit_code); + result = GetExitCodeProcess(process, &exit_code); if (! result) return PyErr_SetFromWindowsErr(GetLastError()); @@ -478,15 +488,15 @@ { DWORD result; - long handle; + HANDLE handle; int milliseconds; - if (! PyArg_ParseTuple(args, "li:WaitForSingleObject", + if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM "i:WaitForSingleObject", &handle, &milliseconds)) return NULL; Py_BEGIN_ALLOW_THREADS - result = WaitForSingleObject((HANDLE) handle, (DWORD) milliseconds); + result = WaitForSingleObject(handle, (DWORD) milliseconds); Py_END_ALLOW_THREADS if (result == WAIT_FAILED) @@ -508,13 +518,14 @@ sp_GetModuleFileName(PyObject* self, PyObject* args) { BOOL result; - long module; + HMODULE module; WCHAR filename[MAX_PATH]; - if (! PyArg_ParseTuple(args, "l:GetModuleFileName", &module)) + if (! PyArg_ParseTuple(args, PY_HANDLE_PARAM ":GetModuleFileName", + &module)) return NULL; - result = GetModuleFileNameW((HMODULE)module, filename, MAX_PATH); + result = GetModuleFileNameW(module, filename, MAX_PATH); filename[MAX_PATH-1] = '\0'; if (! result) Modified: python/branches/py3k/Python/pythonrun.c ============================================================================== --- python/branches/py3k/Python/pythonrun.c (original) +++ python/branches/py3k/Python/pythonrun.c Wed Jul 23 18:10:53 2008 @@ -1778,10 +1778,10 @@ case E_INTR: if (!PyErr_Occurred()) PyErr_SetNone(PyExc_KeyboardInterrupt); - return; + goto cleanup; case E_NOMEM: PyErr_NoMemory(); - return; + goto cleanup; case E_EOF: msg = "unexpected EOF while parsing"; break; @@ -1839,10 +1839,6 @@ } v = Py_BuildValue("(ziiN)", err->filename, err->lineno, err->offset, errtext); - if (err->text != NULL) { - PyObject_FREE(err->text); - err->text = NULL; - } w = NULL; if (v != NULL) w = Py_BuildValue("(sO)", msg, v); @@ -1850,6 +1846,11 @@ Py_XDECREF(v); PyErr_SetObject(errtype, w); Py_XDECREF(w); +cleanup: + if (err->text != NULL) { + PyObject_FREE(err->text); + err->text = NULL; + } } /* Print fatal error message and abort */ Modified: python/branches/py3k/configure ============================================================================== --- python/branches/py3k/configure (original) +++ python/branches/py3k/configure Wed Jul 23 18:10:53 2008 @@ -4612,7 +4612,7 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" - tgt=`sw_vers -productVersion | sed 's/\(10\.0-9*\).*/\1/'` + tgt=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` if test "${UNIVERSALSDK}" != "/" -a "${tgt}" '>' '10.4' ; then CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" fi Modified: python/branches/py3k/configure.in ============================================================================== --- python/branches/py3k/configure.in (original) +++ python/branches/py3k/configure.in Wed Jul 23 18:10:53 2008 @@ -880,7 +880,7 @@ BASECFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" - tgt=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` + tgt=`sw_vers -productVersion | sed 's/\(10\.[[0-9]]*\).*/\1/'` if test "${UNIVERSALSDK}" != "/" -a "${tgt}" '>' '10.4' ; then CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" fi From python-3000-checkins at python.org Wed Jul 23 18:11:43 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 18:11:43 +0200 (CEST) Subject: [Python-3000-checkins] r65207 - python/branches/py3k Message-ID: <20080723161143.0589F1E4005@bag.python.org> Author: georg.brandl Date: Wed Jul 23 18:11:42 2008 New Revision: 65207 Log: Blocked revisions 65205 via svnmerge ........ r65205 | georg.brandl | 2008-07-23 18:00:44 +0200 (Wed, 23 Jul 2008) | 2 lines Use correct indentation. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 23 18:13:07 2008 From: python-3000-checkins at python.org (georg.brandl) Date: Wed, 23 Jul 2008 18:13:07 +0200 (CEST) Subject: [Python-3000-checkins] r65208 - in python/branches/py3k: Doc/c-api/memory.rst Include/pymem.h Modules/arraymodule.c Modules/selectmodule.c Objects/obmalloc.c Message-ID: <20080723161307.CAEFA1E4007@bag.python.org> Author: georg.brandl Date: Wed Jul 23 18:13:07 2008 New Revision: 65208 Log: Merged revisions 65182 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65182 | gregory.p.smith | 2008-07-22 06:46:32 +0200 (Tue, 22 Jul 2008) | 7 lines Issue #2620: Overflow checking when allocating or reallocating memory was not always being done properly in some python types and extension modules. PyMem_MALLOC, PyMem_REALLOC, PyMem_NEW and PyMem_RESIZE have all been updated to perform better checks and places in the code that would previously leak memory on the error path when such an allocation failed have been fixed. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/c-api/memory.rst python/branches/py3k/Include/pymem.h python/branches/py3k/Modules/arraymodule.c python/branches/py3k/Modules/selectmodule.c python/branches/py3k/Objects/obmalloc.c Modified: python/branches/py3k/Doc/c-api/memory.rst ============================================================================== --- python/branches/py3k/Doc/c-api/memory.rst (original) +++ python/branches/py3k/Doc/c-api/memory.rst Wed Jul 23 18:13:07 2008 @@ -136,7 +136,9 @@ Same as :cfunc:`PyMem_Realloc`, but the memory block is resized to ``(n * sizeof(TYPE))`` bytes. Returns a pointer cast to :ctype:`TYPE\*`. On return, - *p* will be a pointer to the new memory area, or *NULL* in the event of failure. + *p* will be a pointer to the new memory area, or *NULL* in the event of + failure. This is a C preprocessor macro; p is always reassigned. Save + the original value of p to avoid losing memory when handling errors. .. cfunction:: void PyMem_Del(void *p) Modified: python/branches/py3k/Include/pymem.h ============================================================================== --- python/branches/py3k/Include/pymem.h (original) +++ python/branches/py3k/Include/pymem.h Wed Jul 23 18:13:07 2008 @@ -69,8 +69,12 @@ for malloc(0), which would be treated as an error. Some platforms would return a pointer with no memory behind it, which would break pymalloc. To solve these problems, allocate an extra byte. */ -#define PyMem_MALLOC(n) malloc((n) ? (n) : 1) -#define PyMem_REALLOC(p, n) realloc((p), (n) ? (n) : 1) +/* Returns NULL to indicate error if a negative size or size larger than + Py_ssize_t can represent is supplied. Helps prevents security holes. */ +#define PyMem_MALLOC(n) (((n) < 0 || (n) > PY_SSIZE_T_MAX) ? NULL \ + : malloc((n) ? (n) : 1)) +#define PyMem_REALLOC(p, n) (((n) < 0 || (n) > PY_SSIZE_T_MAX) ? NULL \ + : realloc((p), (n) ? (n) : 1)) #define PyMem_FREE free #endif /* PYMALLOC_DEBUG */ @@ -79,24 +83,31 @@ * Type-oriented memory interface * ============================== * - * These are carried along for historical reasons. There's rarely a good - * reason to use them anymore (you can just as easily do the multiply and - * cast yourself). + * Allocate memory for n objects of the given type. Returns a new pointer + * or NULL if the request was too large or memory allocation failed. Use + * these macros rather than doing the multiplication yourself so that proper + * overflow checking is always done. */ #define PyMem_New(type, n) \ - ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( ((n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) #define PyMem_NEW(type, n) \ - ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ + ( ((n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) +/* + * The value of (p) is always clobbered by this macro regardless of success. + * The caller MUST check if (p) is NULL afterwards and deal with the memory + * error if so. This means the original value of (p) MUST be saved for the + * caller's memory error handler to not lose track of it. + */ #define PyMem_Resize(p, type, n) \ - ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ - ( (p) = (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) ) + ( (p) = ((n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) #define PyMem_RESIZE(p, type, n) \ - ( assert((n) <= PY_SIZE_MAX / sizeof(type)) , \ - ( (p) = (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) ) + ( (p) = ((n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ + (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) /* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. Modified: python/branches/py3k/Modules/arraymodule.c ============================================================================== --- python/branches/py3k/Modules/arraymodule.c (original) +++ python/branches/py3k/Modules/arraymodule.c Wed Jul 23 18:13:07 2008 @@ -805,6 +805,7 @@ array_do_extend(arrayobject *self, PyObject *bb) { Py_ssize_t size; + char *old_item; if (!array_Check(bb)) return array_iter_extend(self, bb); @@ -820,8 +821,10 @@ return -1; } size = Py_SIZE(self) + Py_SIZE(b); + old_item = self->ob_item; PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize); if (self->ob_item == NULL) { + self->ob_item = old_item; PyErr_NoMemory(); return -1; } @@ -874,7 +877,7 @@ if (size > PY_SSIZE_T_MAX / n) { return PyErr_NoMemory(); } - PyMem_Resize(items, char, n * size); + PyMem_RESIZE(items, char, n * size); if (items == NULL) return PyErr_NoMemory(); p = items; Modified: python/branches/py3k/Modules/selectmodule.c ============================================================================== --- python/branches/py3k/Modules/selectmodule.c (original) +++ python/branches/py3k/Modules/selectmodule.c Wed Jul 23 18:13:07 2008 @@ -346,10 +346,12 @@ { Py_ssize_t i, pos; PyObject *key, *value; + struct pollfd *old_ufds = self->ufds; self->ufd_len = PyDict_Size(self->dict); - PyMem_Resize(self->ufds, struct pollfd, self->ufd_len); + PyMem_RESIZE(self->ufds, struct pollfd, self->ufd_len); if (self->ufds == NULL) { + self->ufds = old_ufds; PyErr_NoMemory(); return 0; } Modified: python/branches/py3k/Objects/obmalloc.c ============================================================================== --- python/branches/py3k/Objects/obmalloc.c (original) +++ python/branches/py3k/Objects/obmalloc.c Wed Jul 23 18:13:07 2008 @@ -727,6 +727,15 @@ uint size; /* + * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes. + * Most python internals blindly use a signed Py_ssize_t to track + * things without checking for overflows or negatives. + * As size_t is unsigned, checking for nbytes < 0 is not required. + */ + if (nbytes > PY_SSIZE_T_MAX) + return NULL; + + /* * This implicitly redirects malloc(0). */ if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) { @@ -1130,6 +1139,15 @@ if (p == NULL) return PyObject_Malloc(nbytes); + /* + * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes. + * Most python internals blindly use a signed Py_ssize_t to track + * things without checking for overflows or negatives. + * As size_t is unsigned, checking for nbytes < 0 is not required. + */ + if (nbytes > PY_SSIZE_T_MAX) + return NULL; + pool = POOL_ADDR(p); if (Py_ADDRESS_IN_RANGE(p, pool)) { /* We're in charge of this block */ From python-3000-checkins at python.org Thu Jul 24 13:23:40 2008 From: python-3000-checkins at python.org (thomas.heller) Date: Thu, 24 Jul 2008 13:23:40 +0200 (CEST) Subject: [Python-3000-checkins] r65218 - python/branches/py3k Message-ID: <20080724112340.184861E4005@bag.python.org> Author: thomas.heller Date: Thu Jul 24 13:23:39 2008 New Revision: 65218 Log: Blocked revisions 65217 via svnmerge ........ r65217 | thomas.heller | 2008-07-24 13:16:45 +0200 (Do, 24 Jul 2008) | 1 line Make ctypes compatible with Python 2.3, 2.4, and 2.5 again. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 24 20:57:11 2008 From: python-3000-checkins at python.org (facundo.batista) Date: Thu, 24 Jul 2008 20:57:11 +0200 (CEST) Subject: [Python-3000-checkins] r65220 - in python/branches/py3k: Lib/test/test_long.py Objects/longobject.c Message-ID: <20080724185711.804A51E4011@bag.python.org> Author: facundo.batista Date: Thu Jul 24 20:57:11 2008 New Revision: 65220 Log: Optimization to stop creating new small longs and use the one previously stored. Issue 2417. Modified: python/branches/py3k/Lib/test/test_long.py python/branches/py3k/Objects/longobject.c Modified: python/branches/py3k/Lib/test/test_long.py ============================================================================== --- python/branches/py3k/Lib/test/test_long.py (original) +++ python/branches/py3k/Lib/test/test_long.py Thu Jul 24 20:57:11 2008 @@ -805,6 +805,24 @@ self.assertRaises(ZeroDivisionError, eval, zero, namespace) + def test_small_ints(self): + for i in range(-5, 257): + self.assertTrue(i is i + 0) + self.assertTrue(i is i * 1) + self.assertTrue(i is i - 0) + self.assertTrue(i is i // 1) + self.assertTrue(i is i & -1) + self.assertTrue(i is i | 0) + self.assertTrue(i is i ^ 0) + self.assertTrue(i is ~~i) + self.assertTrue(i is i**1) + self.assertTrue(i is int(str(i))) + self.assertTrue(i is i<<2>>2, str(i)) + # corner cases + i = 1 << 70 + self.assertTrue(i - i is 0) + self.assertTrue(0 * i is 0) + def test_main(): support.run_unittest(LongTest) Modified: python/branches/py3k/Objects/longobject.c ============================================================================== --- python/branches/py3k/Objects/longobject.c (original) +++ python/branches/py3k/Objects/longobject.c Thu Jul 24 20:57:11 2008 @@ -13,6 +13,11 @@ #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif + +#define MEDIUM_VALUE(x) (Py_SIZE(x) < 0 ? -(x)->ob_digit[0] : \ + (Py_SIZE(x) == 0 ? 0 : (x)->ob_digit[0])) +#define ABS(x) ((x) < 0 ? -(x) : (x)) + #if NSMALLNEGINTS + NSMALLPOSINTS > 0 /* Small integers are preallocated in this array so that they can be shared. @@ -42,11 +47,23 @@ return get_small_int(ival); \ } while(0) +static PyLongObject * +maybe_small_long(PyLongObject *v) +{ + if (v && ABS(Py_SIZE(v)) <= 1) { + int ival = MEDIUM_VALUE(v); + if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { + Py_DECREF(v); + return (PyLongObject *)get_small_int(ival); + } + } + return v; +} #else #define CHECK_SMALL_INT(ival) +#define maybe_small_long(val) (val) #endif -#define MEDIUM_VALUE(x) (Py_SIZE(x) < 0 ? -(x)->ob_digit[0] : (Py_SIZE(x) == 0 ? 0 : (x)->ob_digit[0])) /* If a freshly-allocated long is already shared, it must be a small integer, so negating it must go to PyLong_FromLong */ #define NEGATE(x) \ @@ -68,8 +85,6 @@ */ #define FIVEARY_CUTOFF 8 -#define ABS(x) ((x) < 0 ? -(x) : (x)) - #undef MIN #undef MAX #define MAX(x, y) ((x) < (y) ? (y) : (x)) @@ -1982,14 +1997,7 @@ if (pend) *pend = str; long_normalize(z); - if (ABS(Py_SIZE(z)) <= 1) { - long res = MEDIUM_VALUE(z); - if (-NSMALLPOSINTS <= res && res <= NSMALLPOSINTS) { - Py_DECREF(z); - return PyLong_FromLong(res); - } - } - return (PyObject *) z; + return (PyObject *) maybe_small_long(z); onError: Py_XDECREF(z); @@ -2078,7 +2086,7 @@ NEGATE(z); if (Py_SIZE(a) < 0 && Py_SIZE(*prem) != 0) NEGATE(*prem); - *pdiv = z; + *pdiv = maybe_small_long(z); return 0; } @@ -2335,7 +2343,7 @@ while (--i >= 0 && a->ob_digit[i] == b->ob_digit[i]) ; if (i < 0) - return _PyLong_New(0); + return (PyLongObject *)PyLong_FromLong(0); if (a->ob_digit[i] < b->ob_digit[i]) { sign = -1; { PyLongObject *temp = a; a = b; b = temp; } @@ -2588,7 +2596,7 @@ i = a == b ? KARATSUBA_SQUARE_CUTOFF : KARATSUBA_CUTOFF; if (asize <= i) { if (asize == 0) - return _PyLong_New(0); + return (PyLongObject *)PyLong_FromLong(0); else return x_mul(a, b); } @@ -3199,7 +3207,7 @@ if (x == NULL) return NULL; Py_SIZE(x) = -(Py_SIZE(x)); - return (PyObject *)x; + return (PyObject *)maybe_small_long(x); } static PyObject * @@ -3264,10 +3272,8 @@ } wordshift = shiftby / PyLong_SHIFT; newsize = ABS(Py_SIZE(a)) - wordshift; - if (newsize <= 0) { - z = _PyLong_New(0); - return (PyObject *)z; - } + if (newsize <= 0) + return PyLong_FromLong(0); loshift = shiftby % PyLong_SHIFT; hishift = PyLong_SHIFT - loshift; lomask = ((digit)1 << hishift) - 1; @@ -3286,7 +3292,7 @@ z = long_normalize(z); } rshift_error: - return (PyObject *) z; + return (PyObject *) maybe_small_long(z); } @@ -3342,7 +3348,7 @@ assert(!accum); z = long_normalize(z); lshift_error: - return (PyObject *) z; + return (PyObject *) maybe_small_long(z); } @@ -3448,7 +3454,7 @@ Py_DECREF(b); z = long_normalize(z); if (negz == 0) - return (PyObject *) z; + return (PyObject *) maybe_small_long(z); v = long_invert(z); Py_DECREF(z); return v; From python-3000-checkins at python.org Thu Jul 24 21:38:46 2008 From: python-3000-checkins at python.org (raymond.hettinger) Date: Thu, 24 Jul 2008 21:38:46 +0200 (CEST) Subject: [Python-3000-checkins] r65221 - python/branches/py3k/Objects/enumobject.c Message-ID: <20080724193846.513AD1E4005@bag.python.org> Author: raymond.hettinger Date: Thu Jul 24 21:38:45 2008 New Revision: 65221 Log: Merge 65215: convert uses of int to Py_Ssize_t. Modified: python/branches/py3k/Objects/enumobject.c Modified: python/branches/py3k/Objects/enumobject.c ============================================================================== --- python/branches/py3k/Objects/enumobject.c (original) +++ python/branches/py3k/Objects/enumobject.c Thu Jul 24 21:38:45 2008 @@ -4,10 +4,10 @@ typedef struct { PyObject_HEAD - long en_index; /* current index of enumeration */ + Py_ssize_t en_index; /* current index of enumeration */ PyObject* en_sit; /* secondary iterator of enumeration */ PyObject* en_result; /* result tuple */ - PyObject* en_longindex; /* index for sequences >= LONG_MAX */ + PyObject* en_longindex; /* index for sequences >= PY_SSIZE_T_MAX */ } enumobject; static PyObject * @@ -25,14 +25,21 @@ en = (enumobject *)type->tp_alloc(type, 0); if (en == NULL) return NULL; - if (start) { + if (start != NULL) { start = PyNumber_Index(start); if (start == NULL) { Py_DECREF(en); return NULL; } - en->en_index = LONG_MAX; - en->en_longindex = start; + en->en_index = PyLong_AsSsize_t(start); + if (en->en_index == -1 && PyErr_Occurred()) { + PyErr_Clear(); + en->en_index = PY_SSIZE_T_MAX; + en->en_longindex = start; + } else { + en->en_longindex = NULL; + Py_DECREF(start); + } } else { en->en_index = 0; en->en_longindex = NULL; @@ -78,7 +85,7 @@ PyObject *stepped_up; if (en->en_longindex == NULL) { - en->en_longindex = PyLong_FromLong(LONG_MAX); + en->en_longindex = PyLong_FromSsize_t(PY_SSIZE_T_MAX); if (en->en_longindex == NULL) return NULL; } @@ -123,10 +130,10 @@ if (next_item == NULL) return NULL; - if (en->en_index == LONG_MAX) + if (en->en_index == PY_SSIZE_T_MAX) return enum_next_long(en, next_item); - next_index = PyLong_FromLong(en->en_index); + next_index = PyLong_FromSsize_t(en->en_index); if (next_index == NULL) { Py_DECREF(next_item); return NULL; From python-3000-checkins at python.org Fri Jul 25 19:56:47 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 25 Jul 2008 19:56:47 +0200 (CEST) Subject: [Python-3000-checkins] r65228 - python/branches/py3k/Lib/test/test_ossaudiodev.py Message-ID: <20080725175647.ADD6E1E400B@bag.python.org> Author: brett.cannon Date: Fri Jul 25 19:56:47 2008 New Revision: 65228 Log: Forward-port r65112 so that test_ossaudiodev uses sunau. Modified: python/branches/py3k/Lib/test/test_ossaudiodev.py Modified: python/branches/py3k/Lib/test/test_ossaudiodev.py ============================================================================== --- python/branches/py3k/Lib/test/test_ossaudiodev.py (original) +++ python/branches/py3k/Lib/test/test_ossaudiodev.py Fri Jul 25 19:56:47 2008 @@ -6,7 +6,7 @@ import errno import ossaudiodev import sys -import sunaudio +import sunau import time import audioop import unittest @@ -22,15 +22,16 @@ AFMT_S16_NE = ossaudiodev.AFMT_S16_BE -SND_FORMAT_MULAW_8 = 1 - def read_sound_file(path): - fp = open(path, 'rb') - size, enc, rate, nchannels, extra = sunaudio.gethdr(fp) - data = fp.read() - fp.close() + with open(path, 'rb') as fp: + au = sunau.open(fp) + rate = au.getframerate() + nchannels = au.getnchannels() + encoding = au._encoding + fp.seek(0) + data = fp.read() - if enc != SND_FORMAT_MULAW_8: + if encoding != sunau.AUDIO_FILE_ENCODING_MULAW_8: raise RuntimeError("Expect .au file with 8-bit mu-law samples") # Convert the data to 16-bit signed. From python-3000-checkins at python.org Fri Jul 25 20:05:26 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Fri, 25 Jul 2008 20:05:26 +0200 (CEST) Subject: [Python-3000-checkins] r65230 - in python/branches/py3k: Lib/test/test_unicode.py Objects/unicodeobject.c Message-ID: <20080725180526.1C0421E400B@bag.python.org> Author: antoine.pitrou Date: Fri Jul 25 20:05:24 2008 New Revision: 65230 Log: Merged revisions 65227 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65227 | antoine.pitrou | 2008-07-25 19:45:59 +0200 (ven., 25 juil. 2008) | 3 lines #2242: utf7 decoding crashes on bogus input on some Windows/MSVC versions ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_unicode.py python/branches/py3k/Objects/unicodeobject.c Modified: python/branches/py3k/Lib/test/test_unicode.py ============================================================================== --- python/branches/py3k/Lib/test/test_unicode.py (original) +++ python/branches/py3k/Lib/test/test_unicode.py Fri Jul 25 20:05:24 2008 @@ -847,6 +847,9 @@ self.assertEqual(str(b'+3ADYAA-', 'utf-7', 'replace'), '\ufffd') + # Issue #2242: crash on some Windows/MSVC versions + self.assertRaises(UnicodeDecodeError, b'+\xc1'.decode, 'utf-7') + def test_codecs_utf8(self): self.assertEqual(''.encode('utf-8'), b'') self.assertEqual('\u20ac'.encode('utf-8'), b'\xe2\x82\xac') Modified: python/branches/py3k/Objects/unicodeobject.c ============================================================================== --- python/branches/py3k/Objects/unicodeobject.c (original) +++ python/branches/py3k/Objects/unicodeobject.c Fri Jul 25 20:05:24 2008 @@ -1727,7 +1727,7 @@ while (s < e) { Py_UNICODE ch; restart: - ch = *s; + ch = (unsigned char) *s; if (inShift) { if ((ch == '-') || !B64CHAR(ch)) { From python-3000-checkins at python.org Fri Jul 25 20:19:20 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Fri, 25 Jul 2008 20:19:20 +0200 (CEST) Subject: [Python-3000-checkins] r65231 - in python/branches/py3k: Doc/library/undoc.rst Lib/sunaudio.py Lib/test/test_sundry.py Misc/NEWS Message-ID: <20080725181920.C6C171E400B@bag.python.org> Author: brett.cannon Date: Fri Jul 25 20:19:20 2008 New Revision: 65231 Log: Remove the sunaudio module. Removed: python/branches/py3k/Lib/sunaudio.py Modified: python/branches/py3k/Doc/library/undoc.rst python/branches/py3k/Lib/test/test_sundry.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Doc/library/undoc.rst ============================================================================== --- python/branches/py3k/Doc/library/undoc.rst (original) +++ python/branches/py3k/Doc/library/undoc.rst Fri Jul 25 20:19:20 2008 @@ -26,9 +26,3 @@ :mod:`posixpath` --- Implementation of :mod:`os.path` on POSIX. - -Multimedia -========== - -:mod:`sunaudio` - --- Interpret Sun audio headers (may become obsolete or a tool/demo). Deleted: python/branches/py3k/Lib/sunaudio.py ============================================================================== --- python/branches/py3k/Lib/sunaudio.py Fri Jul 25 20:19:20 2008 +++ (empty file) @@ -1,48 +0,0 @@ -"""Interpret sun audio headers.""" - -MAGIC = b'.snd' - -class error(Exception): - pass - - -def get_long_be(s): - """Convert a 4-byte value to integer.""" - return (s[0]<<24) | (s[1]<<16) | (s[2]<<8) | s[3] - - -def gethdr(fp): - """Read a sound header from an open file.""" - if fp.read(4) != MAGIC: - raise error('gethdr: bad magic word') - hdr_size = get_long_be(fp.read(4)) - data_size = get_long_be(fp.read(4)) - encoding = get_long_be(fp.read(4)) - sample_rate = get_long_be(fp.read(4)) - channels = get_long_be(fp.read(4)) - excess = hdr_size - 24 - if excess < 0: - raise error('gethdr: bad hdr_size') - if excess > 0: - info = fp.read(excess) - else: - info = b'' - return (data_size, encoding, sample_rate, channels, info) - - -def printhdr(file): - """Read and print the sound header of a named file.""" - f = open(file, 'rb') - try: - hdr = gethdr(f) - finally: - f.close() - data_size, encoding, sample_rate, channels, info = hdr - while info.endswith(b'\0'): - info = info[:-1] - print('File name: ', file) - print('Data size: ', data_size) - print('Encoding: ', encoding) - print('Sample rate:', sample_rate) - print('Channels: ', channels) - print('Info: ', repr(info)) Modified: python/branches/py3k/Lib/test/test_sundry.py ============================================================================== --- python/branches/py3k/Lib/test/test_sundry.py (original) +++ python/branches/py3k/Lib/test/test_sundry.py Fri Jul 25 20:19:20 2008 @@ -64,7 +64,6 @@ import sched import sndhdr import sunau - import sunaudio import symbol import tabnanny import timeit Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 25 20:19:20 2008 @@ -34,6 +34,8 @@ Library ------- +- Removed the sunaudio module. Use sunau instead. + - Removed "ast" function aliases from the parser module. - Issue #3313: Fixed a crash when a failed dlopen() call does not set From python-3000-checkins at python.org Fri Jul 25 21:58:19 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Fri, 25 Jul 2008 21:58:19 +0200 (CEST) Subject: [Python-3000-checkins] r65236 - in python/branches/py3k: Lib/test/test_zipfile.py Lib/zipfile.py Misc/NEWS Message-ID: <20080725195819.3E4761E400B@bag.python.org> Author: antoine.pitrou Date: Fri Jul 25 21:58:18 2008 New Revision: 65236 Log: Merged revisions 65235 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65235 | antoine.pitrou | 2008-07-25 21:42:26 +0200 (ven., 25 juil. 2008) | 3 lines #3394: zipfile.writestr doesn't set external attributes, so files are extracted mode 000 on Unix ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_zipfile.py python/branches/py3k/Lib/zipfile.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Lib/test/test_zipfile.py ============================================================================== --- python/branches/py3k/Lib/test/test_zipfile.py (original) +++ python/branches/py3k/Lib/test/test_zipfile.py Fri Jul 25 21:58:18 2008 @@ -365,6 +365,19 @@ # remove the test file subdirectories shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) + def zip_test_writestr_permissions(self, f, compression): + # Make sure that writestr creates files with mode 0600, + # when it is passed a name rather than a ZipInfo instance. + + self.makeTestArchive(f, compression) + zipfp = zipfile.ZipFile(f, "r") + zinfo = zipfp.getinfo('strfile') + self.assertEqual(zinfo.external_attr, 0o600 << 16) + + def test_writestr_permissions(self): + for f in (TESTFN2, TemporaryFile(), io.BytesIO()): + self.zip_test_writestr_permissions(f, zipfile.ZIP_STORED) + def tearDown(self): os.remove(TESTFN) os.remove(TESTFN2) Modified: python/branches/py3k/Lib/zipfile.py ============================================================================== --- python/branches/py3k/Lib/zipfile.py (original) +++ python/branches/py3k/Lib/zipfile.py Fri Jul 25 21:58:18 2008 @@ -1075,6 +1075,7 @@ zinfo = ZipInfo(filename=zinfo_or_arcname, date_time=time.localtime(time.time())[:6]) zinfo.compress_type = self.compression + zinfo.external_attr = 0o600 << 16 else: zinfo = zinfo_or_arcname Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Fri Jul 25 21:58:18 2008 @@ -4,6 +4,19 @@ (editors: check NEWS.help for information about editing NEWS using ReST.) +What's new in Python 3.0b3? +=========================== + +*Release date: XX-XXX-2008* + +Library +------- + +- Issue #3394: zipfile.writestr sets external attributes when passed a + file name rather than a ZipInfo instance, so files are extracted with + mode 0600 rather than 000 under Unix. + + What's new in Python 3.0b2? =========================== @@ -191,7 +204,7 @@ - The ``xmlrpc`` package was created; it contains the old ``xmlrpclib`` module as ``xmlrpc.client`` and the content of the old ``SimpleXMLRPCServer`` and ``DocXMLRPCServer`` modules - as ``xmlrpc.server``. + as ``xmlrpc.server``. - The ``dbm`` package was created, containing the old modules ``anydbm`` and ``whichdb`` in its ``__init__.py``, and having @@ -562,7 +575,7 @@ - Fixed `imp.find_module()` to obey the -*- coding: -*- header. - Changed `__file__` and `co_filename` to unicode. The path names are decoded - with `Py_FileSystemDefaultEncoding` and a new API method + with `Py_FileSystemDefaultEncoding` and a new API method `PyUnicode_DecodeFSDefault(char*)` was added. - io.open() and _fileio.FileIO have grown a new argument closefd. A From python-3000-checkins at python.org Fri Jul 25 23:45:09 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Fri, 25 Jul 2008 23:45:09 +0200 (CEST) Subject: [Python-3000-checkins] r65238 - in python/branches/py3k: Lib/locale.py Lib/test/test_locale.py Message-ID: <20080725214509.4C37C1E400B@bag.python.org> Author: antoine.pitrou Date: Fri Jul 25 23:45:08 2008 New Revision: 65238 Log: Merged revisions 65237 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65237 | antoine.pitrou | 2008-07-25 22:40:19 +0200 (ven., 25 juil. 2008) | 3 lines convert test_locale to unittest, and add a mechanism to override localconv() results for further testing (#1864, #1222) ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/locale.py python/branches/py3k/Lib/test/test_locale.py Modified: python/branches/py3k/Lib/locale.py ============================================================================== --- python/branches/py3k/Lib/locale.py (original) +++ python/branches/py3k/Lib/locale.py Fri Jul 25 23:45:08 2008 @@ -13,6 +13,7 @@ import sys, encodings, encodings.aliases from builtins import str as _builtin_str +import functools # Try importing the _locale module. # @@ -94,6 +95,21 @@ if 'strcoll' not in globals(): strcoll = _strcoll + +_localeconv = localeconv + +# With this dict, you can override some items of localeconv's return value. +# This is useful for testing purposes. +_override_localeconv = {} + + at functools.wraps(_localeconv) +def localeconv(): + d = _localeconv() + if _override_localeconv: + d.update(_override_localeconv) + return d + + ### Number formatting APIs # Author: Martin von Loewis Modified: python/branches/py3k/Lib/test/test_locale.py ============================================================================== --- python/branches/py3k/Lib/test/test_locale.py (original) +++ python/branches/py3k/Lib/test/test_locale.py Fri Jul 25 23:45:08 2008 @@ -1,89 +1,229 @@ -from test.support import verbose, TestSkipped, TestFailed +from test.support import run_unittest, TestSkipped, verbose +import unittest import locale import sys +import codecs -if sys.platform == 'darwin': - raise TestSkipped( - "Locale support on MacOSX is minimal and cannot be tested") -oldlocale = locale.setlocale(locale.LC_NUMERIC) - -if sys.platform.startswith("win"): - tlocs = ("En", "English") -else: - tlocs = ("en_US.UTF-8", "en_US.US-ASCII", "en_US") - -for tloc in tlocs: - try: - locale.setlocale(locale.LC_NUMERIC, tloc) - break - except locale.Error: - continue -else: - raise ImportError( - "test locale not supported (tried %s)" % (', '.join(tlocs))) - -def testformat(formatstr, value, grouping = 0, output=None, func=locale.format): - if verbose: - if output: - print("%s %% %s =? %s ..." % - (repr(formatstr), repr(value), repr(output)), end=' ') - else: - print("%s %% %s works? ..." % (repr(formatstr), repr(value)), - end=' ') - result = func(formatstr, value, grouping = grouping) - if output and result != output: - if verbose: - print('no') - print("%s %% %s == %s != %s" % - (repr(formatstr), repr(value), repr(result), repr(output))) +class BaseLocalizedTest(unittest.TestCase): + # + # Base class for tests using a real locale + # + + if sys.platform.startswith("win"): + tlocs = ("En", "English") else: + tlocs = ("en_US.UTF-8", "en_US.US-ASCII", "en_US") + + def setUp(self): + if sys.platform == 'darwin': + raise TestSkipped( + "Locale support on MacOSX is minimal and cannot be tested") + self.oldlocale = locale.setlocale(self.locale_type) + for tloc in self.tlocs: + try: + locale.setlocale(self.locale_type, tloc) + except locale.Error: + continue + break + else: + raise TestSkipped( + "Test locale not supported (tried %s)" % (', '.join(self.tlocs))) if verbose: - print("yes") + print("testing with \"%s\"..." % tloc, end=' ') -try: - # On Solaris 10, the thousands_sep is the empty string - sep = locale.localeconv()['thousands_sep'] - testformat("%f", 1024, grouping=1, output='1%s024.000000' % sep) - testformat("%f", 102, grouping=1, output='102.000000') - testformat("%f", -42, grouping=1, output='-42.000000') - testformat("%+f", -42, grouping=1, output='-42.000000') - testformat("%20.f", -42, grouping=1, output=' -42') - testformat("%+10.f", -4200, grouping=1, output=' -4%s200' % sep) - testformat("%-10.f", 4200, grouping=1, output='4%s200 ' % sep) - # Invoke getpreferredencoding to make sure it does not cause exceptions, - locale.getpreferredencoding() - - # === Test format() with more complex formatting strings - # test if grouping is independent from other characters in formatting string - testformat("One million is %i", 1000000, grouping=1, - output='One million is 1%s000%s000' % (sep, sep), - func=locale.format_string) - testformat("One million is %i", 1000000, grouping=1, - output='One million is 1%s000%s000' % (sep, sep), - func=locale.format_string) - # test dots in formatting string - testformat(".%f.", 1000.0, output='.1000.000000.', func=locale.format_string) - # test floats - testformat("--> %10.2f", 1000.0, grouping=1, output='--> 1%s000.00' % sep, - func=locale.format_string) - # test asterisk formats - testformat("%10.*f", (2, 1000.0), grouping=0, output=' 1000.00', - func=locale.format_string) - testformat("%*.*f", (10, 2, 1000.0), grouping=1, output=' 1%s000.00' % sep, - func=locale.format_string) - # test more-in-one - testformat("int %i float %.2f str %s", (1000, 1000.0, 'str'), grouping=1, - output='int 1%s000 float 1%s000.00 str str' % (sep, sep), - func=locale.format_string) - -finally: - locale.setlocale(locale.LC_NUMERIC, oldlocale) - -if hasattr(locale, "strcoll"): - # test crasher from bug #3303 - try: - locale.strcoll("a", None) - except TypeError: - pass - else: - raise TestFailed("TypeError not raised") + def tearDown(self): + locale.setlocale(self.locale_type, self.oldlocale) + + +class BaseCookedTest(unittest.TestCase): + # + # Base class for tests using cooked localeconv() values + # + + def setUp(self): + locale._override_localeconv = self.cooked_values + + def tearDown(self): + locale._override_localeconv = {} + +class CCookedTest(BaseCookedTest): + # A cooked "C" locale + + cooked_values = { + 'currency_symbol': '', + 'decimal_point': '.', + 'frac_digits': 127, + 'grouping': [], + 'int_curr_symbol': '', + 'int_frac_digits': 127, + 'mon_decimal_point': '', + 'mon_grouping': [], + 'mon_thousands_sep': '', + 'n_cs_precedes': 127, + 'n_sep_by_space': 127, + 'n_sign_posn': 127, + 'negative_sign': '', + 'p_cs_precedes': 127, + 'p_sep_by_space': 127, + 'p_sign_posn': 127, + 'positive_sign': '', + 'thousands_sep': '' + } + +class EnUSCookedTest(BaseCookedTest): + # A cooked "en_US" locale + + cooked_values = { + 'currency_symbol': '$', + 'decimal_point': '.', + 'frac_digits': 2, + 'grouping': [3, 3, 0], + 'int_curr_symbol': 'USD ', + 'int_frac_digits': 2, + 'mon_decimal_point': '.', + 'mon_grouping': [3, 3, 0], + 'mon_thousands_sep': ',', + 'n_cs_precedes': 1, + 'n_sep_by_space': 0, + 'n_sign_posn': 1, + 'negative_sign': '-', + 'p_cs_precedes': 1, + 'p_sep_by_space': 0, + 'p_sign_posn': 1, + 'positive_sign': '', + 'thousands_sep': ',' + } + + +class BaseFormattingTest(object): + # + # Utility functions for formatting tests + # + + def _test_formatfunc(self, format, value, out, func, **format_opts): + self.assertEqual( + func(format, value, **format_opts), out) + + def _test_format(self, format, value, out, **format_opts): + self._test_formatfunc(format, value, out, + func=locale.format, **format_opts) + + def _test_format_string(self, format, value, out, **format_opts): + self._test_formatfunc(format, value, out, + func=locale.format_string, **format_opts) + + def _test_currency(self, value, out, **format_opts): + self.assertEqual(locale.currency(value, **format_opts), out) + + +class EnUSNumberFormatting(BaseFormattingTest): + + def setUp(self): + # NOTE: On Solaris 10, the thousands_sep is the empty string + self.sep = locale.localeconv()['thousands_sep'] + + def test_grouping(self): + self._test_format("%f", 1024, grouping=1, out='1%s024.000000' % self.sep) + self._test_format("%f", 102, grouping=1, out='102.000000') + self._test_format("%f", -42, grouping=1, out='-42.000000') + self._test_format("%+f", -42, grouping=1, out='-42.000000') + + def test_grouping_and_padding(self): + self._test_format("%20.f", -42, grouping=1, out='-42'.rjust(20)) + self._test_format("%+10.f", -4200, grouping=1, + out=('-4%s200' % self.sep).rjust(10)) + self._test_format("%-10.f", -4200, grouping=1, + out=('-4%s200' % self.sep).ljust(10)) + + def test_integer_grouping(self): + self._test_format("%d", 4200, grouping=True, out='4%s200' % self.sep) + self._test_format("%+d", 4200, grouping=True, out='+4%s200' % self.sep) + self._test_format("%+d", -4200, grouping=True, out='-4%s200' % self.sep) + + def test_simple(self): + self._test_format("%f", 1024, grouping=0, out='1024.000000') + self._test_format("%f", 102, grouping=0, out='102.000000') + self._test_format("%f", -42, grouping=0, out='-42.000000') + self._test_format("%+f", -42, grouping=0, out='-42.000000') + + def test_padding(self): + self._test_format("%20.f", -42, grouping=0, out='-42'.rjust(20)) + self._test_format("%+10.f", -4200, grouping=0, out='-4200'.rjust(10)) + self._test_format("%-10.f", 4200, grouping=0, out='4200'.ljust(10)) + + def test_complex_formatting(self): + # Spaces in formatting string + self._test_format_string("One million is %i", 1000000, grouping=1, + out='One million is 1%s000%s000' % (self.sep, self.sep)) + self._test_format_string("One million is %i", 1000000, grouping=1, + out='One million is 1%s000%s000' % (self.sep, self.sep)) + # Dots in formatting string + self._test_format_string(".%f.", 1000.0, out='.1000.000000.') + # Padding + self._test_format_string("--> %10.2f", 4200, grouping=1, + out='--> ' + ('4%s200.00' % self.sep).rjust(10)) + # Asterisk formats + self._test_format_string("%10.*f", (2, 1000), grouping=0, + out='1000.00'.rjust(10)) + self._test_format_string("%*.*f", (10, 2, 1000), grouping=1, + out=('1%s000.00' % self.sep).rjust(10)) + # Test more-in-one + self._test_format_string("int %i float %.2f str %s", + (1000, 1000.0, 'str'), grouping=1, + out='int 1%s000 float 1%s000.00 str str' % (self.sep, self.sep)) + + +class TestNumberFormatting(BaseLocalizedTest, EnUSNumberFormatting): + # Test number formatting with a real English locale. + + locale_type = locale.LC_NUMERIC + + def setUp(self): + BaseLocalizedTest.setUp(self) + EnUSNumberFormatting.setUp(self) + + +class TestEnUSNumberFormatting(EnUSCookedTest, EnUSNumberFormatting): + # Test number formatting with a cooked "en_US" locale. + + def setUp(self): + EnUSCookedTest.setUp(self) + EnUSNumberFormatting.setUp(self) + + def test_currency(self): + self._test_currency(50000, "$50000.00") + self._test_currency(50000, "$50,000.00", grouping=True) + self._test_currency(50000, "USD 50,000.00", + grouping=True, international=True) + + +class TestCNumberFormatting(CCookedTest, BaseFormattingTest): + # Test number formatting with a cooked "C" locale. + + def test_grouping(self): + self._test_format("%.2f", 12345.67, grouping=True, out='12345.67') + + def test_grouping_and_padding(self): + self._test_format("%9.2f", 12345.67, grouping=True, out=' 12345.67') + + +class TestMiscellaneous(unittest.TestCase): + def test_getpreferredencoding(self): + # Invoke getpreferredencoding to make sure it does not cause exceptions. + enc = locale.getpreferredencoding() + if enc: + # If encoding non-empty, make sure it is valid + codecs.lookup(enc) + + if hasattr(locale, "strcoll"): + def test_strcoll_3303(self): + # test crasher from bug #3303 + self.assertRaises(TypeError, locale.strcoll, "a", None) + self.assertRaises(TypeError, locale.strcoll, b"a", None) + + +def test_main(): + run_unittest(__name__) + +if __name__ == '__main__': + test_main() From python-3000-checkins at python.org Sat Jul 26 00:39:39 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Sat, 26 Jul 2008 00:39:39 +0200 (CEST) Subject: [Python-3000-checkins] r65243 - in python/branches/py3k: Misc/NEWS Python/ceval.c Tools/pybench/Calls.py Message-ID: <20080725223939.D81B81E400B@bag.python.org> Author: antoine.pitrou Date: Sat Jul 26 00:39:39 2008 New Revision: 65243 Log: Merged revisions 65240-65242 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65240 | antoine.pitrou | 2008-07-26 00:02:07 +0200 (sam., 26 juil. 2008) | 3 lines add a pybench test for complex function calls (part of #1819) ........ r65241 | antoine.pitrou | 2008-07-26 00:13:52 +0200 (sam., 26 juil. 2008) | 4 lines Raymond's patch for #1819: speedup function calls with named parameters (35% faster according to pybench) ........ r65242 | antoine.pitrou | 2008-07-26 00:22:08 +0200 (sam., 26 juil. 2008) | 3 lines add a NEWS entry ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Misc/NEWS python/branches/py3k/Python/ceval.c python/branches/py3k/Tools/pybench/Calls.py Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Sat Jul 26 00:39:39 2008 @@ -9,6 +9,12 @@ *Release date: XX-XXX-2008* +Core and Builtins +----------------- + +- Issue #1819: function calls with several named parameters are now on + average 35% faster (as measured by pybench). + Library ------- Modified: python/branches/py3k/Python/ceval.c ============================================================================== --- python/branches/py3k/Python/ceval.c (original) +++ python/branches/py3k/Python/ceval.c Sat Jul 26 00:39:39 2008 @@ -642,9 +642,9 @@ processor's own internal branch predication has a high likelihood of success, resulting in a nearly zero-overhead transition to the next opcode. A successful prediction saves a trip through the eval-loop - including its two unpredictable branches, the HAS_ARG test and the + including its two unpredictable branches, the HAS_ARG test and the switch-case. Combined with the processor's internal branch prediction, - a successful PREDICT has the effect of making the two opcodes run as if + a successful PREDICT has the effect of making the two opcodes run as if they were a single new opcode with the bodies combined. If collecting opcode statistics, your choices are to either keep the @@ -796,7 +796,7 @@ an argument which depends on the situation. The global trace function is also called whenever an exception is detected. */ - if (call_trace_protected(tstate->c_tracefunc, + if (call_trace_protected(tstate->c_tracefunc, tstate->c_traceobj, f, PyTrace_CALL, Py_None)) { /* Trace function raised an error */ @@ -828,10 +828,10 @@ this wasn't always true before 2.3! PyFrame_New now sets f->f_lasti to -1 (i.e. the index *before* the first instruction) and YIELD_VALUE doesn't fiddle with f_lasti any more. So this - does work. Promise. + does work. Promise. When the PREDICT() macros are enabled, some opcode pairs follow in - direct succession without updating f->f_lasti. A successful + direct succession without updating f->f_lasti. A successful prediction effectively links the two codes together as if they were a single new opcode; accordingly,f->f_lasti will point to the first code in the pair (for instance, GET_ITER followed by @@ -1678,7 +1678,7 @@ { int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); v = POP(); - + if (unpack_iterable(v, oparg & 0xFF, oparg >> 8, stack_pointer + totalargs)) { stack_pointer += totalargs; @@ -2071,7 +2071,7 @@ because it prevents detection of a control-break in tight loops like "while 1: pass". Compile with this option turned-on when you need the speed-up and do not need break checking inside tight loops (ones - that contain only instructions ending with goto fast_next_opcode). + that contain only instructions ending with goto fast_next_opcode). */ goto fast_next_opcode; #else @@ -2257,7 +2257,7 @@ break; } - case MAKE_CLOSURE: + case MAKE_CLOSURE: case MAKE_FUNCTION: { int posdefaults = oparg & 0xff; @@ -2267,7 +2267,7 @@ v = POP(); /* code object */ x = PyFunction_New(v, f->f_globals); Py_DECREF(v); - + if (x != NULL && opcode == MAKE_CLOSURE) { v = POP(); err = PyFunction_SetClosure(x, v); @@ -2650,6 +2650,7 @@ } } for (i = 0; i < kwcount; i++) { + PyObject **co_varnames; PyObject *keyword = kws[2*i]; PyObject *value = kws[2*i + 1]; int j; @@ -2659,16 +2660,25 @@ co->co_name); goto fail; } - /* XXX slow -- speed up using dictionary? */ + /* Speed hack: do raw pointer compares. As names are + normally interned this should almost always hit. */ + co_varnames = PySequence_Fast_ITEMS(co->co_varnames); + for (j = 0; + j < co->co_argcount + co->co_kwonlyargcount; + j++) { + PyObject *nm = co_varnames[j]; + if (nm == keyword) + goto kw_found; + } + /* Slow fallback, just in case */ for (j = 0; j < co->co_argcount + co->co_kwonlyargcount; j++) { - PyObject *nm = PyTuple_GET_ITEM( - co->co_varnames, j); + PyObject *nm = co_varnames[j]; int cmp = PyObject_RichCompareBool( keyword, nm, Py_EQ); if (cmp > 0) - break; + goto kw_found; else if (cmp < 0) goto fail; } @@ -2685,20 +2695,20 @@ goto fail; } PyDict_SetItem(kwdict, keyword, value); + continue; } - else { - if (GETLOCAL(j) != NULL) { - PyErr_Format(PyExc_TypeError, - "%U() got multiple " - "values for keyword " - "argument '%S'", - co->co_name, - keyword); - goto fail; - } - Py_INCREF(value); - SETLOCAL(j, value); +kw_found: + if (GETLOCAL(j) != NULL) { + PyErr_Format(PyExc_TypeError, + "%U() got multiple " + "values for keyword " + "argument '%S'", + co->co_name, + keyword); + goto fail; } + Py_INCREF(value); + SETLOCAL(j, value); } if (co->co_kwonlyargcount > 0) { for (i = co->co_argcount; @@ -2930,7 +2940,7 @@ /* Iterate v argcnt times and store the results on the stack (via decreasing sp). Return 1 for success, 0 if error. - + If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack with a variable target. */ Modified: python/branches/py3k/Tools/pybench/Calls.py ============================================================================== --- python/branches/py3k/Tools/pybench/Calls.py (original) +++ python/branches/py3k/Tools/pybench/Calls.py Sat Jul 26 00:39:39 2008 @@ -109,6 +109,64 @@ ### +class ComplexPythonFunctionCalls(Test): + + version = 2.0 + operations = 4*5 + rounds = 100000 + + def test(self): + + # define functions + def f(a,b,c,d=1,e=2,f=3): + return f + + args = 1,2 + kwargs = dict(c=3,d=4,e=5) + + # do calls + for i in range(self.rounds): + f(a=i,b=i,c=i) + f(f=i,e=i,d=i,c=2,b=i,a=3) + f(1,b=i,**kwargs) + f(*args,**kwargs) + + f(a=i,b=i,c=i) + f(f=i,e=i,d=i,c=2,b=i,a=3) + f(1,b=i,**kwargs) + f(*args,**kwargs) + + f(a=i,b=i,c=i) + f(f=i,e=i,d=i,c=2,b=i,a=3) + f(1,b=i,**kwargs) + f(*args,**kwargs) + + f(a=i,b=i,c=i) + f(f=i,e=i,d=i,c=2,b=i,a=3) + f(1,b=i,**kwargs) + f(*args,**kwargs) + + f(a=i,b=i,c=i) + f(f=i,e=i,d=i,c=2,b=i,a=3) + f(1,b=i,**kwargs) + f(*args,**kwargs) + + + def calibrate(self): + + # define functions + def f(a,b,c,d=1,e=2,f=3): + return f + + args = 1,2 + kwargs = dict(c=3,d=4,e=5) + + # do calls + for i in range(self.rounds): + pass + +### + class BuiltinFunctionCalls(Test): version = 2.0 From python-3000-checkins at python.org Sat Jul 26 22:09:46 2008 From: python-3000-checkins at python.org (amaury.forgeotdarc) Date: Sat, 26 Jul 2008 22:09:46 +0200 (CEST) Subject: [Python-3000-checkins] r65250 - in python/branches/py3k/Lib/distutils: cmd.py command/build_ext.py dist.py filelist.py mwerkscompiler.py text_file.py Message-ID: <20080726200946.1B8391E4002@bag.python.org> Author: amaury.forgeotdarc Date: Sat Jul 26 22:09:45 2008 New Revision: 65250 Log: Remove incorrect usages of map() in distutils. Reported by Lisandro Dalcin. Modified: python/branches/py3k/Lib/distutils/cmd.py python/branches/py3k/Lib/distutils/command/build_ext.py python/branches/py3k/Lib/distutils/dist.py python/branches/py3k/Lib/distutils/filelist.py python/branches/py3k/Lib/distutils/mwerkscompiler.py python/branches/py3k/Lib/distutils/text_file.py Modified: python/branches/py3k/Lib/distutils/cmd.py ============================================================================== --- python/branches/py3k/Lib/distutils/cmd.py (original) +++ python/branches/py3k/Lib/distutils/cmd.py Sat Jul 26 22:09:45 2008 @@ -158,7 +158,7 @@ print(indent + header) indent = indent + " " for (option, _, _) in self.user_options: - option = option.translate(longopt_xlate) + option = longopt_xlate(option) if option[-1] == "=": option = option[:-1] value = getattr(self, option) Modified: python/branches/py3k/Lib/distutils/command/build_ext.py ============================================================================== --- python/branches/py3k/Lib/distutils/command/build_ext.py (original) +++ python/branches/py3k/Lib/distutils/command/build_ext.py Sat Jul 26 22:09:45 2008 @@ -244,7 +244,7 @@ if self.define: defines = self.define.split(',') - self.define = map(lambda symbol: (symbol, '1'), defines) + self.define = [(symbol, '1') for symbol in defines] # The option for macros to undefine is also a string from the # option parsing, but has to be a list. Multiple symbols can also Modified: python/branches/py3k/Lib/distutils/dist.py ============================================================================== --- python/branches/py3k/Lib/distutils/dist.py (original) +++ python/branches/py3k/Lib/distutils/dist.py Sat Jul 26 22:09:45 2008 @@ -864,7 +864,8 @@ for (option, (source, value)) in option_dict.items(): if DEBUG: print(" %s = %s (from %s)" % (option, value, source)) try: - bool_opts = map(translate_longopt, command_obj.boolean_options) + bool_opts = [translate_longopt(o) + for o in command_obj.boolean_options] except AttributeError: bool_opts = [] try: Modified: python/branches/py3k/Lib/distutils/filelist.py ============================================================================== --- python/branches/py3k/Lib/distutils/filelist.py (original) +++ python/branches/py3k/Lib/distutils/filelist.py Sat Jul 26 22:09:45 2008 @@ -85,13 +85,13 @@ if len(words) < 2: raise DistutilsTemplateError( "'%s' expects ..." % action) - patterns = map(convert_path, words[1:]) + patterns = [convert_path(w) for w in words[1:]] elif action in ('recursive-include', 'recursive-exclude'): if len(words) < 3: raise DistutilsTemplateError( "'%s' expects ..." % action) dir = convert_path(words[1]) - patterns = map(convert_path, words[2:]) + patterns = [convert_path(w) for w in words[2:]] elif action in ('graft', 'prune'): if len(words) != 2: raise DistutilsTemplateError( Modified: python/branches/py3k/Lib/distutils/mwerkscompiler.py ============================================================================== --- python/branches/py3k/Lib/distutils/mwerkscompiler.py (original) +++ python/branches/py3k/Lib/distutils/mwerkscompiler.py Sat Jul 26 22:09:45 2008 @@ -104,10 +104,10 @@ # This is because we (usually) create the project in a subdirectory of # where we are now, and keeping the paths relative is too much work right # now. - sources = map(self._filename_to_abs, self.__sources) - include_dirs = map(self._filename_to_abs, self.__include_dirs) + sources = [self._filename_to_abs(s) for s in self.__sources] + include_dirs = [self._filename_to_abs(d) for d in self.__include_dirs] if objects: - objects = map(self._filename_to_abs, objects) + objects = [self._filename_to_abs(o) for o in objects] else: objects = [] if build_temp: Modified: python/branches/py3k/Lib/distutils/text_file.py ============================================================================== --- python/branches/py3k/Lib/distutils/text_file.py (original) +++ python/branches/py3k/Lib/distutils/text_file.py Sat Jul 26 22:09:45 2008 @@ -292,7 +292,7 @@ continues on next line """ # result 1: no fancy options - result1 = map(lambda x: x + "\n", test_data.split("\n")[0:-1]) + result1 = [x + "\n" for x in test_data.split("\n")[:-1]] # result 2: just strip comments result2 = ["\n", @@ -357,4 +357,5 @@ join_lines=1, rstrip_ws=1, collapse_join=1) test_input(6, "join lines with collapsing", in_file, result6) + del in_file os.remove(filename) From python-3000-checkins at python.org Sat Jul 26 23:02:53 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Sat, 26 Jul 2008 23:02:53 +0200 (CEST) Subject: [Python-3000-checkins] r65251 - in python/branches/py3k: Lib/test/test_locale.py Message-ID: <20080726210253.58EC51E4002@bag.python.org> Author: antoine.pitrou Date: Sat Jul 26 23:02:53 2008 New Revision: 65251 Log: Merged revisions 65244-65245,65248 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65244 | antoine.pitrou | 2008-07-26 12:29:43 +0200 (sam., 26 juil. 2008) | 3 lines try to fix most buildbot failures on test_locale + add a debug output for the solaris buildbot ........ r65245 | antoine.pitrou | 2008-07-26 13:56:37 +0200 (sam., 26 juil. 2008) | 3 lines Fix more buildbot failures on test_locale. ........ r65248 | antoine.pitrou | 2008-07-26 15:49:13 +0200 (sam., 26 juil. 2008) | 4 lines disable some failing tests in test_locale due to a bug in locale.py. this should fix the failures on the solaris buildbot. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_locale.py Modified: python/branches/py3k/Lib/test/test_locale.py ============================================================================== --- python/branches/py3k/Lib/test/test_locale.py (original) +++ python/branches/py3k/Lib/test/test_locale.py Sat Jul 26 23:02:53 2008 @@ -4,32 +4,40 @@ import sys import codecs -class BaseLocalizedTest(unittest.TestCase): - # - # Base class for tests using a real locale - # +enUS_locale = None +def get_enUS_locale(): + global enUS_locale + if sys.platform == 'darwin': + raise TestSkipped("Locale support on MacOSX is minimal") if sys.platform.startswith("win"): tlocs = ("En", "English") else: tlocs = ("en_US.UTF-8", "en_US.US-ASCII", "en_US") + oldlocale = locale.setlocale(locale.LC_NUMERIC) + for tloc in tlocs: + try: + locale.setlocale(locale.LC_NUMERIC, tloc) + except locale.Error: + continue + break + else: + raise TestSkipped( + "Test locale not supported (tried %s)" % (', '.join(tlocs))) + enUS_locale = tloc + locale.setlocale(locale.LC_NUMERIC, oldlocale) + + +class BaseLocalizedTest(unittest.TestCase): + # + # Base class for tests using a real locale + # def setUp(self): - if sys.platform == 'darwin': - raise TestSkipped( - "Locale support on MacOSX is minimal and cannot be tested") self.oldlocale = locale.setlocale(self.locale_type) - for tloc in self.tlocs: - try: - locale.setlocale(self.locale_type, tloc) - except locale.Error: - continue - break - else: - raise TestSkipped( - "Test locale not supported (tried %s)" % (', '.join(self.tlocs))) + locale.setlocale(self.locale_type, enUS_locale) if verbose: - print("testing with \"%s\"..." % tloc, end=' ') + print("testing with \"%s\"..." % enUS_locale, end=' ') def tearDown(self): locale.setlocale(self.locale_type, self.oldlocale) @@ -117,9 +125,10 @@ class EnUSNumberFormatting(BaseFormattingTest): + # XXX there is a grouping + padding bug when the thousands separator + # is empty but the grouping array contains values (e.g. Solaris 10) def setUp(self): - # NOTE: On Solaris 10, the thousands_sep is the empty string self.sep = locale.localeconv()['thousands_sep'] def test_grouping(self): @@ -130,10 +139,11 @@ def test_grouping_and_padding(self): self._test_format("%20.f", -42, grouping=1, out='-42'.rjust(20)) - self._test_format("%+10.f", -4200, grouping=1, - out=('-4%s200' % self.sep).rjust(10)) - self._test_format("%-10.f", -4200, grouping=1, - out=('-4%s200' % self.sep).ljust(10)) + if self.sep: + self._test_format("%+10.f", -4200, grouping=1, + out=('-4%s200' % self.sep).rjust(10)) + self._test_format("%-10.f", -4200, grouping=1, + out=('-4%s200' % self.sep).ljust(10)) def test_integer_grouping(self): self._test_format("%d", 4200, grouping=True, out='4%s200' % self.sep) @@ -160,17 +170,21 @@ # Dots in formatting string self._test_format_string(".%f.", 1000.0, out='.1000.000000.') # Padding - self._test_format_string("--> %10.2f", 4200, grouping=1, - out='--> ' + ('4%s200.00' % self.sep).rjust(10)) + if self.sep: + self._test_format_string("--> %10.2f", 4200, grouping=1, + out='--> ' + ('4%s200.00' % self.sep).rjust(10)) # Asterisk formats self._test_format_string("%10.*f", (2, 1000), grouping=0, out='1000.00'.rjust(10)) - self._test_format_string("%*.*f", (10, 2, 1000), grouping=1, - out=('1%s000.00' % self.sep).rjust(10)) + if self.sep: + self._test_format_string("%*.*f", (10, 2, 1000), grouping=1, + out=('1%s000.00' % self.sep).rjust(10)) # Test more-in-one - self._test_format_string("int %i float %.2f str %s", - (1000, 1000.0, 'str'), grouping=1, - out='int 1%s000 float 1%s000.00 str str' % (self.sep, self.sep)) + if self.sep: + self._test_format_string("int %i float %.2f str %s", + (1000, 1000.0, 'str'), grouping=1, + out='int 1%s000 float 1%s000.00 str str' % + (self.sep, self.sep)) class TestNumberFormatting(BaseLocalizedTest, EnUSNumberFormatting): @@ -223,7 +237,20 @@ def test_main(): - run_unittest(__name__) + tests = [ + TestMiscellaneous, + TestEnUSNumberFormatting, + TestCNumberFormatting + ] + # TestSkipped can't be raised inside unittests, handle it manually instead + try: + get_enUS_locale() + except TestSkipped as e: + if verbose: + print("Some tests will be disabled: %s" % e) + else: + tests += [TestNumberFormatting] + run_unittest(*tests) if __name__ == '__main__': test_main() From python-3000-checkins at python.org Sat Jul 26 23:59:03 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sat, 26 Jul 2008 23:59:03 +0200 (CEST) Subject: [Python-3000-checkins] r65252 - python/branches/py3k/Doc/tutorial/inputoutput.rst Message-ID: <20080726215903.533061E4002@bag.python.org> Author: benjamin.peterson Date: Sat Jul 26 23:59:03 2008 New Revision: 65252 Log: fix print syntax in tutorial Modified: python/branches/py3k/Doc/tutorial/inputoutput.rst Modified: python/branches/py3k/Doc/tutorial/inputoutput.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/inputoutput.rst (original) +++ python/branches/py3k/Doc/tutorial/inputoutput.rst Sat Jul 26 23:59:03 2008 @@ -131,27 +131,27 @@ Basic usage of the :meth:`str.format` method looks like this:: - >>> print 'We are the {0} who say "{1}!"'.format('knights', 'Ni') + >>> print('We are the {0} who say "{1}!"'.format('knights', 'Ni')) We are the knights who say "Ni!" The brackets and characters within them (called format fields) are replaced with the objects passed into the format method. The number in the brackets refers to the position of the object passed into the format method. :: - >>> print '{0} and {1}'.format('spam', 'eggs') + >>> print('{0} and {1}'.format('spam', 'eggs')) spam and eggs - >>> print '{1} and {0}'.format('spam', 'eggs') + >>> print('{1} and {0}'.format('spam', 'eggs')) eggs and spam If keyword arguments are used in the format method, their values are referred to by using the name of the argument. :: - >>> print 'This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible') + >>> print('This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible')) This spam is absolutely horrible. Positional and keyword arguments can be arbitrarily combined:: - >>> print 'The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg') + >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) The story of Bill, Manfred, and Georg. An optional ``':``` and format specifier can follow the field name. This also From python-3000-checkins at python.org Sun Jul 27 00:27:05 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Sun, 27 Jul 2008 00:27:05 +0200 (CEST) Subject: [Python-3000-checkins] r65254 - in python/branches/py3k: Doc/tutorial/inputoutput.rst Message-ID: <20080726222705.3AF111E4012@bag.python.org> Author: benjamin.peterson Date: Sun Jul 27 00:27:04 2008 New Revision: 65254 Log: Merged revisions 65253 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65253 | georg.brandl | 2008-07-26 17:13:29 -0500 (Sat, 26 Jul 2008) | 2 lines Shorten some overlong lines. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/tutorial/inputoutput.rst Modified: python/branches/py3k/Doc/tutorial/inputoutput.rst ============================================================================== --- python/branches/py3k/Doc/tutorial/inputoutput.rst (original) +++ python/branches/py3k/Doc/tutorial/inputoutput.rst Sun Jul 27 00:27:04 2008 @@ -146,12 +146,14 @@ If keyword arguments are used in the format method, their values are referred to by using the name of the argument. :: - >>> print('This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible')) + >>> print('This {food} is {adjective}.'.format( + ... food='spam', adjective='absolutely horrible')) This spam is absolutely horrible. Positional and keyword arguments can be arbitrarily combined:: - >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) + >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', + other='Georg')) The story of Bill, Manfred, and Georg. An optional ``':``` and format specifier can follow the field name. This also @@ -179,7 +181,8 @@ square brackets ``'[]'`` to access the keys :: >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} - >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; Dcab: {0[Dcab]:d}'.format(table)) + >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' + 'Dcab: {0[Dcab]:d}'.format(table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678 This could also be done by passing the table as keyword arguments with the '**' From python-3000-checkins at python.org Mon Jul 28 21:46:11 2008 From: python-3000-checkins at python.org (antoine.pitrou) Date: Mon, 28 Jul 2008 21:46:11 +0200 (CEST) Subject: [Python-3000-checkins] r65264 - in python/branches/py3k: Lib/io.py Misc/NEWS Message-ID: <20080728194611.6B1D01E4004@bag.python.org> Author: antoine.pitrou Date: Mon Jul 28 21:46:11 2008 New Revision: 65264 Log: #2523: binary buffered reading is quadratic Modified: python/branches/py3k/Lib/io.py python/branches/py3k/Misc/NEWS Modified: python/branches/py3k/Lib/io.py ============================================================================== --- python/branches/py3k/Lib/io.py (original) +++ python/branches/py3k/Lib/io.py Mon Jul 28 21:46:11 2008 @@ -893,8 +893,12 @@ """ raw._checkReadable() _BufferedIOMixin.__init__(self, raw) - self._read_buf = b"" self.buffer_size = buffer_size + self._reset_read_buf() + + def _reset_read_buf(self): + self._read_buf = b"" + self._read_pos = 0 def read(self, n=None): """Read n bytes. @@ -904,25 +908,50 @@ mode. If n is negative, read until EOF or until read() would block. """ - if n is None: - n = -1 nodata_val = b"" - while n < 0 or len(self._read_buf) < n: - to_read = max(self.buffer_size, - n if n is not None else 2*len(self._read_buf)) - current = self.raw.read(to_read) - if current in (b"", None): - nodata_val = current + empty_values = (b"", None) + buf = self._read_buf + pos = self._read_pos + + # Special case for when the number of bytes to read is unspecified. + if n is None or n == -1: + self._reset_read_buf() + chunks = [buf[pos:]] # Strip the consumed bytes. + current_size = 0 + while True: + # Read until EOF or until read() would block. + chunk = self.raw.read() + if chunk in empty_values: + nodata_val = chunk + break + current_size += len(chunk) + chunks.append(chunk) + return b"".join(chunks) or nodata_val + + # The number of bytes to read is specified, return at most n bytes. + avail = len(buf) - pos # Length of the available buffered data. + if n <= avail: + # Fast path: the data to read is fully buffered. + self._read_pos += n + return buf[pos:pos+n] + # Slow path: read from the stream until enough bytes are read, + # or until an EOF occurs or until read() would block. + chunks = [buf[pos:]] + wanted = max(self.buffer_size, n) + while avail < n: + chunk = self.raw.read(wanted) + if chunk in empty_values: + nodata_val = chunk break - self._read_buf += current - if self._read_buf: - if n < 0: - n = len(self._read_buf) - out = self._read_buf[:n] - self._read_buf = self._read_buf[n:] - else: - out = nodata_val - return out + avail += len(chunk) + chunks.append(chunk) + # n is more then avail only when an EOF occurred or when + # read() would have blocked. + n = min(n, avail) + out = b"".join(chunks) + self._read_buf = out[n:] # Save the extra data in the buffer. + self._read_pos = 0 + return out[:n] if out else nodata_val def peek(self, n=0): """Returns buffered bytes without advancing the position. @@ -932,13 +961,14 @@ than self.buffer_size. """ want = min(n, self.buffer_size) - have = len(self._read_buf) + have = len(self._read_buf) - self._read_pos if have < want: to_read = self.buffer_size - have current = self.raw.read(to_read) if current: - self._read_buf += current - return self._read_buf + self._read_buf = self._read_buf[self._read_pos:] + current + self._read_pos = 0 + return self._read_buf[self._read_pos:] def read1(self, n): """Reads up to n bytes, with at most one read() system call.""" @@ -947,16 +977,16 @@ if n <= 0: return b"" self.peek(1) - return self.read(min(n, len(self._read_buf))) + return self.read(min(n, len(self._read_buf) - self._read_pos)) def tell(self): - return self.raw.tell() - len(self._read_buf) + return self.raw.tell() - len(self._read_buf) + self._read_pos def seek(self, pos, whence=0): if whence == 1: - pos -= len(self._read_buf) + pos -= len(self._read_buf) - self._read_pos pos = self.raw.seek(pos, whence) - self._read_buf = b"" + self._reset_read_buf() return pos @@ -1125,14 +1155,14 @@ # First do the raw seek, then empty the read buffer, so that # if the raw seek fails, we don't lose buffered data forever. pos = self.raw.seek(pos, whence) - self._read_buf = b"" + self._reset_read_buf() return pos def tell(self): - if (self._write_buf): + if self._write_buf: return self.raw.tell() + len(self._write_buf) else: - return self.raw.tell() - len(self._read_buf) + return BufferedReader.tell(self) def truncate(self, pos=None): if pos is None: @@ -1161,8 +1191,9 @@ def write(self, b): if self._read_buf: - self.raw.seek(-len(self._read_buf), 1) # Undo readahead - self._read_buf = b"" + # Undo readahead + self.raw.seek(self._read_pos - len(self._read_buf), 1) + self._reset_read_buf() return BufferedWriter.write(self, b) Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Mon Jul 28 21:46:11 2008 @@ -22,6 +22,9 @@ file name rather than a ZipInfo instance, so files are extracted with mode 0600 rather than 000 under Unix. +- Issue #2523: Fix quadratic behaviour when read()ing a binary file without + asking for a specific length. + What's new in Python 3.0b2? =========================== From python-3000-checkins at python.org Tue Jul 29 01:36:42 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 29 Jul 2008 01:36:42 +0200 (CEST) Subject: [Python-3000-checkins] r65267 - python/branches/py3k Message-ID: <20080728233642.66E461E4004@bag.python.org> Author: benjamin.peterson Date: Tue Jul 29 01:36:42 2008 New Revision: 65267 Log: Blocked revisions 65266 via svnmerge ........ r65266 | benjamin.peterson | 2008-07-28 18:35:27 -0500 (Mon, 28 Jul 2008) | 1 line backport r65264 ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Tue Jul 29 17:35:09 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 29 Jul 2008 17:35:09 +0200 (CEST) Subject: [Python-3000-checkins] r65285 - python/branches/py3k/Lib/doctest.py Message-ID: <20080729153509.45CF01E4025@bag.python.org> Author: benjamin.peterson Date: Tue Jul 29 17:35:08 2008 New Revision: 65285 Log: make sure doctest doesn't pollute __builtins__ This was causing test_builtin to fail after the decimal doctests were run see #3462 Modified: python/branches/py3k/Lib/doctest.py Modified: python/branches/py3k/Lib/doctest.py ============================================================================== --- python/branches/py3k/Lib/doctest.py (original) +++ python/branches/py3k/Lib/doctest.py Tue Jul 29 17:35:08 2008 @@ -1360,6 +1360,7 @@ linecache.getlines = self.save_linecache_getlines if clear_globs: test.globs.clear() + __builtins__['_'] = None #///////////////////////////////////////////////////////////////// # Summarization From python-3000-checkins at python.org Tue Jul 29 17:53:12 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 29 Jul 2008 17:53:12 +0200 (CEST) Subject: [Python-3000-checkins] r65286 - python/branches/py3k/Lib/doctest.py Message-ID: <20080729155312.E84B71E400C@bag.python.org> Author: benjamin.peterson Date: Tue Jul 29 17:53:12 2008 New Revision: 65286 Log: uhh. __builtins__ is a module in __main__ and a dict elsewhere Modified: python/branches/py3k/Lib/doctest.py Modified: python/branches/py3k/Lib/doctest.py ============================================================================== --- python/branches/py3k/Lib/doctest.py (original) +++ python/branches/py3k/Lib/doctest.py Tue Jul 29 17:53:12 2008 @@ -1360,7 +1360,10 @@ linecache.getlines = self.save_linecache_getlines if clear_globs: test.globs.clear() - __builtins__['_'] = None + if __name__ == "__main__": + __builtins__._ = None + else: + __builtins__['_'] = None #///////////////////////////////////////////////////////////////// # Summarization From python-3000-checkins at python.org Tue Jul 29 17:55:50 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Tue, 29 Jul 2008 17:55:50 +0200 (CEST) Subject: [Python-3000-checkins] r65287 - python/branches/py3k/Lib/doctest.py Message-ID: <20080729155550.EE6671E400C@bag.python.org> Author: benjamin.peterson Date: Tue Jul 29 17:55:50 2008 New Revision: 65287 Log: a much cleaner fix from Antoine Modified: python/branches/py3k/Lib/doctest.py Modified: python/branches/py3k/Lib/doctest.py ============================================================================== --- python/branches/py3k/Lib/doctest.py (original) +++ python/branches/py3k/Lib/doctest.py Tue Jul 29 17:55:50 2008 @@ -1360,10 +1360,8 @@ linecache.getlines = self.save_linecache_getlines if clear_globs: test.globs.clear() - if __name__ == "__main__": - __builtins__._ = None - else: - __builtins__['_'] = None + import builtins + builtins._ = None #///////////////////////////////////////////////////////////////// # Summarization From python-3000-checkins at python.org Wed Jul 30 09:37:38 2008 From: python-3000-checkins at python.org (raymond.hettinger) Date: Wed, 30 Jul 2008 09:37:38 +0200 (CEST) Subject: [Python-3000-checkins] r65297 - in python/branches/py3k: Doc/library/itertools.rst Lib/test/test_itertools.py Message-ID: <20080730073738.544FE1E400C@bag.python.org> Author: raymond.hettinger Date: Wed Jul 30 09:37:37 2008 New Revision: 65297 Log: Neaten-up the itertools recipes. Modified: python/branches/py3k/Doc/library/itertools.rst python/branches/py3k/Lib/test/test_itertools.py Modified: python/branches/py3k/Doc/library/itertools.rst ============================================================================== --- python/branches/py3k/Doc/library/itertools.rst (original) +++ python/branches/py3k/Doc/library/itertools.rst Wed Jul 30 09:37:37 2008 @@ -563,12 +563,12 @@ return zip(a, b) def grouper(n, iterable, fillvalue=None): - "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" + "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return zip_longest(*args, fillvalue=fillvalue) def roundrobin(*iterables): - "roundrobin('abc', 'd', 'ef') --> 'a', 'd', 'e', 'b', 'f', 'c'" + "roundrobin('ABC', 'D', 'EF') --> A D E B F C" # Recipe credited to George Sakkis pending = len(iterables) nexts = cycle(iter(it).__next__ for it in iterables) @@ -588,10 +588,8 @@ yield set(x for m, x in pairs if m&n) def compress(data, selectors): - "compress('abcdef', [1,0,1,0,1,1]) --> a c e f" - decorated = zip(data, selectors) - filtered = filter(operator.itemgetter(1), decorated) - return map(operator.itemgetter(0), filtered) + "compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F" + return (d for d, s in izip(data, selectors) if s) def combinations_with_replacement(iterable, r): "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" Modified: python/branches/py3k/Lib/test/test_itertools.py ============================================================================== --- python/branches/py3k/Lib/test/test_itertools.py (original) +++ python/branches/py3k/Lib/test/test_itertools.py Wed Jul 30 09:37:37 2008 @@ -1255,13 +1255,13 @@ ... return zip(a, b) >>> def grouper(n, iterable, fillvalue=None): -... "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')" +... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" ... args = [iter(iterable)] * n ... kwds = dict(fillvalue=fillvalue) ... return zip_longest(*args, **kwds) >>> def roundrobin(*iterables): -... "roundrobin('abc', 'd', 'ef') --> 'a', 'd', 'e', 'b', 'f', 'c'" +... "roundrobin('ABC', 'D', 'EF') --> A D E B F C" ... # Recipe credited to George Sakkis ... pending = len(iterables) ... nexts = cycle(iter(it).__next__ for it in iterables) @@ -1281,10 +1281,8 @@ ... yield set(x for m, x in pairs if m&n) >>> def compress(data, selectors): -... "compress('abcdef', [1,0,1,0,1,1]) --> a c e f" -... decorated = zip(data, selectors) -... filtered = filter(operator.itemgetter(1), decorated) -... return map(operator.itemgetter(0), filtered) +... "compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F" +... return (d for d, s in zip(data, selectors) if s) >>> def combinations_with_replacement(iterable, r): ... "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC" From python-3000-checkins at python.org Wed Jul 30 09:45:01 2008 From: python-3000-checkins at python.org (raymond.hettinger) Date: Wed, 30 Jul 2008 09:45:01 +0200 (CEST) Subject: [Python-3000-checkins] r65298 - python/branches/py3k/Doc/library/itertools.rst Message-ID: <20080730074501.A5B331E4005@bag.python.org> Author: raymond.hettinger Date: Wed Jul 30 09:45:01 2008 New Revision: 65298 Log: Fix-up recipe with a syntax error (as discussed on python-dev). Modified: python/branches/py3k/Doc/library/itertools.rst Modified: python/branches/py3k/Doc/library/itertools.rst ============================================================================== --- python/branches/py3k/Doc/library/itertools.rst (original) +++ python/branches/py3k/Doc/library/itertools.rst Wed Jul 30 09:45:01 2008 @@ -565,7 +565,8 @@ def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n - return zip_longest(*args, fillvalue=fillvalue) + kwds = dict(fillvalue=fillvalue) + return zip_longest(*args, **kwds) def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" From python-3000-checkins at python.org Wed Jul 30 19:46:47 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 30 Jul 2008 19:46:47 +0200 (CEST) Subject: [Python-3000-checkins] r65311 - python/branches/py3k Message-ID: <20080730174647.87D191E400D@bag.python.org> Author: benjamin.peterson Date: Wed Jul 30 19:46:47 2008 New Revision: 65311 Log: Blocked revisions 65310 via svnmerge ........ r65310 | benjamin.peterson | 2008-07-30 12:45:10 -0500 (Wed, 30 Jul 2008) | 1 line backport r64751 ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Wed Jul 30 21:49:34 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Wed, 30 Jul 2008 21:49:34 +0200 (CEST) Subject: [Python-3000-checkins] r65313 - python/branches/py3k Message-ID: <20080730194934.111601E4017@bag.python.org> Author: benjamin.peterson Date: Wed Jul 30 21:49:33 2008 New Revision: 65313 Log: Blocked revisions 65312 via svnmerge ........ r65312 | benjamin.peterson | 2008-07-30 14:35:27 -0500 (Wed, 30 Jul 2008) | 1 line add BufferError to the exception hieracrchy ........ Modified: python/branches/py3k/ (props changed) From guido at python.org Wed Jul 30 22:41:57 2008 From: guido at python.org (Guido van Rossum) Date: Wed, 30 Jul 2008 13:41:57 -0700 Subject: [Python-3000-checkins] r65298 - python/branches/py3k/Doc/library/itertools.rst In-Reply-To: <20080730074501.A5B331E4005@bag.python.org> References: <20080730074501.A5B331E4005@bag.python.org> Message-ID: Are you going to fix this one again? On Wed, Jul 30, 2008 at 12:45 AM, raymond.hettinger wrote: > Author: raymond.hettinger > Date: Wed Jul 30 09:45:01 2008 > New Revision: 65298 > > Log: > Fix-up recipe with a syntax error (as discussed on python-dev). > > Modified: > python/branches/py3k/Doc/library/itertools.rst > > Modified: python/branches/py3k/Doc/library/itertools.rst > ============================================================================== > --- python/branches/py3k/Doc/library/itertools.rst (original) > +++ python/branches/py3k/Doc/library/itertools.rst Wed Jul 30 09:45:01 2008 > @@ -565,7 +565,8 @@ > def grouper(n, iterable, fillvalue=None): > "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" > args = [iter(iterable)] * n > - return zip_longest(*args, fillvalue=fillvalue) > + kwds = dict(fillvalue=fillvalue) > + return zip_longest(*args, **kwds) > > def roundrobin(*iterables): > "roundrobin('ABC', 'D', 'EF') --> A D E B F C" > _______________________________________________ > Python-3000-checkins mailing list > Python-3000-checkins at python.org > http://mail.python.org/mailman/listinfo/python-3000-checkins > -- --Guido van Rossum (home page: http://www.python.org/~guido/) From python-3000-checkins at python.org Thu Jul 31 01:51:06 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 01:51:06 +0200 (CEST) Subject: [Python-3000-checkins] r65319 - python/branches/py3k Message-ID: <20080730235106.209FB1E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 01:51:05 2008 New Revision: 65319 Log: Blocked revisions 65318 via svnmerge ........ r65318 | benjamin.peterson | 2008-07-30 18:49:28 -0500 (Wed, 30 Jul 2008) | 1 line I mess up again; BufferError inherits StandardError ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 31 03:47:09 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 03:47:09 +0200 (CEST) Subject: [Python-3000-checkins] r65322 - in python/branches/py3k: Lib/test/test_exceptions.py Python/errors.c Message-ID: <20080731014709.52C601E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 03:47:08 2008 New Revision: 65322 Log: Merged revisions 65320 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65320 | amaury.forgeotdarc | 2008-07-30 19:42:16 -0500 (Wed, 30 Jul 2008) | 3 lines #2542: now that issubclass() may call arbitrary code, make sure that PyErr_ExceptionMatches returns 0 when an exception occurs there. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/test_exceptions.py python/branches/py3k/Python/errors.c Modified: python/branches/py3k/Lib/test/test_exceptions.py ============================================================================== --- python/branches/py3k/Lib/test/test_exceptions.py (original) +++ python/branches/py3k/Lib/test/test_exceptions.py Thu Jul 31 03:47:08 2008 @@ -6,12 +6,20 @@ import pickle import weakref -from test.support import TESTFN, unlink, run_unittest +from test.support import TESTFN, unlink, run_unittest, captured_output # XXX This is not really enough, each *operation* should be tested! class ExceptionTests(unittest.TestCase): + def test00(self): + try: + sys.exit(ValueError('aaa')) + except SystemExit: + pass + finally: + pass + def raise_catch(self, exc, excname): try: raise exc("spam") @@ -404,7 +412,6 @@ def testExceptionCleanupNames(self): # Make sure the local variable bound to the exception instance by # an "except" statement is only visible inside the except block. - try: raise Exception() except Exception as e: @@ -565,6 +572,30 @@ pass self.assertEquals(e, (None, None, None)) + def test_badisinstance(self): + # Bug #2542: if issubclass(e, MyException) raises an exception, + # it should be ignored + class Meta(type): + def __subclasscheck__(cls, subclass): + raise ValueError() + class MyException(Exception, metaclass=Meta): + pass + + with captured_output("stderr") as stderr: + try: + raise KeyError() + except MyException as e: + self.fail("exception should not be a MyException") + except KeyError: + pass + except: + self.fail("Should have raised TypeError") + else: + self.fail("Should have raised TypeError") + self.assertEqual(stderr.getvalue(), + "Exception ValueError: ValueError() " + "in ignored\n") + def test_main(): run_unittest(ExceptionTests) Modified: python/branches/py3k/Python/errors.c ============================================================================== --- python/branches/py3k/Python/errors.c (original) +++ python/branches/py3k/Python/errors.c Thu Jul 31 03:47:08 2008 @@ -157,9 +157,18 @@ err = PyExceptionInstance_Class(err); if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { - /* problems here!? not sure PyObject_IsSubclass expects to - be called with an exception pending... */ - return PyObject_IsSubclass(err, exc); + int res = 0; + PyObject *exception, *value, *tb; + PyErr_Fetch(&exception, &value, &tb); + res = PyObject_IsSubclass(err, exc); + /* This function must not fail, so print the error here */ + if (res == -1) { + PyErr_WriteUnraisable(err); + /* issubclass did not succeed */ + res = 0; + } + PyErr_Restore(exception, value, tb); + return res; } return err == exc; From python-3000-checkins at python.org Thu Jul 31 05:01:41 2008 From: python-3000-checkins at python.org (brett.cannon) Date: Thu, 31 Jul 2008 05:01:41 +0200 (CEST) Subject: [Python-3000-checkins] r65324 - python/branches/py3k Message-ID: <20080731030141.E19111E4005@bag.python.org> Author: brett.cannon Date: Thu Jul 31 05:01:40 2008 New Revision: 65324 Log: Blocked revisions 65323 via svnmerge ........ r65323 | brett.cannon | 2008-07-30 20:00:53 -0700 (Wed, 30 Jul 2008) | 1 line Backport test.support.fcmp() from 3.0 to silence -3 warnings. ........ Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 31 17:03:41 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 17:03:41 +0200 (CEST) Subject: [Python-3000-checkins] r65327 - in python/branches/py3k: Doc/ACKS.txt Doc/library/struct.rst Modules/_struct.c Message-ID: <20080731150341.1B15A1E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 17:03:40 2008 New Revision: 65327 Log: update the struct documentation to refer to bytes patch from Matt Giuca #3478 Modified: python/branches/py3k/Doc/ACKS.txt python/branches/py3k/Doc/library/struct.rst python/branches/py3k/Modules/_struct.c Modified: python/branches/py3k/Doc/ACKS.txt ============================================================================== --- python/branches/py3k/Doc/ACKS.txt (original) +++ python/branches/py3k/Doc/ACKS.txt Thu Jul 31 17:03:40 2008 @@ -62,6 +62,7 @@ * Ben Gertzfield * Nadim Ghaznavi * Jonathan Giddy + * Matt Giuca * Shelley Gooch * Nathaniel Gray * Grant Griffin Modified: python/branches/py3k/Doc/library/struct.rst ============================================================================== --- python/branches/py3k/Doc/library/struct.rst (original) +++ python/branches/py3k/Doc/library/struct.rst Thu Jul 31 17:03:40 2008 @@ -1,19 +1,19 @@ -:mod:`struct` --- Interpret strings as packed binary data +:mod:`struct` --- Interpret bytes as packed binary data ========================================================= .. module:: struct - :synopsis: Interpret strings as packed binary data. + :synopsis: Interpret bytes as packed binary data. .. index:: pair: C; structures triple: packing; binary; data This module performs conversions between Python values and C structs represented -as Python strings. It uses :dfn:`format strings` (explained below) as compact -descriptions of the lay-out of the C structs and the intended conversion to/from -Python values. This can be used in handling binary data stored in files or from -network connections, among other sources. +as Python :class:`bytes` objects. It uses :dfn:`format strings` (explained +below) as compact descriptions of the lay-out of the C structs and the +intended conversion to/from Python values. This can be used in handling +binary data stored in files or from network connections, among other sources. The module defines the following exception and functions: @@ -26,7 +26,7 @@ .. function:: pack(fmt, v1, v2, ...) - Return a string containing the values ``v1, v2, ...`` packed according to the + Return a bytes containing the values ``v1, v2, ...`` packed according to the given format. The arguments must match the values required by the format exactly. @@ -38,12 +38,12 @@ a required argument. -.. function:: unpack(fmt, string) +.. function:: unpack(fmt, bytes) - Unpack the string (presumably packed by ``pack(fmt, ...)``) according to the + Unpack the bytes (presumably packed by ``pack(fmt, ...)``) according to the given format. The result is a tuple even if it contains exactly one item. The - string must contain exactly the amount of data required by the format - (``len(string)`` must equal ``calcsize(fmt)``). + bytes must contain exactly the amount of data required by the format + (``len(bytes)`` must equal ``calcsize(fmt)``). .. function:: unpack_from(fmt, buffer[,offset=0]) @@ -56,7 +56,7 @@ .. function:: calcsize(fmt) - Return the size of the struct (and hence of the string) corresponding to the + Return the size of the struct (and hence of the bytes) corresponding to the given format. Format characters have the following meaning; the conversion between C and @@ -67,13 +67,13 @@ +========+=========================+====================+=======+ | ``x`` | pad byte | no value | | +--------+-------------------------+--------------------+-------+ -| ``c`` | :ctype:`char` | string of length 1 | | +| ``c`` | :ctype:`char` | bytes of length 1 | | +--------+-------------------------+--------------------+-------+ -| ``b`` | :ctype:`signed char` | integer | | +| ``b`` | :ctype:`signed char` | integer | \(1) | +--------+-------------------------+--------------------+-------+ | ``B`` | :ctype:`unsigned char` | integer | | +--------+-------------------------+--------------------+-------+ -| ``?`` | :ctype:`_Bool` | bool | \(1) | +| ``?`` | :ctype:`_Bool` | bool | \(2) | +--------+-------------------------+--------------------+-------+ | ``h`` | :ctype:`short` | integer | | +--------+-------------------------+--------------------+-------+ @@ -87,18 +87,18 @@ +--------+-------------------------+--------------------+-------+ | ``L`` | :ctype:`unsigned long` | integer | | +--------+-------------------------+--------------------+-------+ -| ``q`` | :ctype:`long long` | integer | \(2) | +| ``q`` | :ctype:`long long` | integer | \(3) | +--------+-------------------------+--------------------+-------+ -| ``Q`` | :ctype:`unsigned long | integer | \(2) | +| ``Q`` | :ctype:`unsigned long | integer | \(3) | | | long` | | | +--------+-------------------------+--------------------+-------+ | ``f`` | :ctype:`float` | float | | +--------+-------------------------+--------------------+-------+ | ``d`` | :ctype:`double` | float | | +--------+-------------------------+--------------------+-------+ -| ``s`` | :ctype:`char[]` | string | | +| ``s`` | :ctype:`char[]` | bytes | \(1) | +--------+-------------------------+--------------------+-------+ -| ``p`` | :ctype:`char[]` | string | | +| ``p`` | :ctype:`char[]` | bytes | \(1) | +--------+-------------------------+--------------------+-------+ | ``P`` | :ctype:`void \*` | integer | | +--------+-------------------------+--------------------+-------+ @@ -106,11 +106,16 @@ Notes: (1) + The ``c``, ``s`` and ``p`` conversion codes operate on :class:`bytes` + objects, but packing with such codes also supports :class:`str` objects, + which are encoded using UTF-8. + +(2) The ``'?'`` conversion code corresponds to the :ctype:`_Bool` type defined by C99. If this type is not available, it is simulated using a :ctype:`char`. In standard mode, it is always represented by one byte. -(2) +(3) The ``'q'`` and ``'Q'`` conversion codes are available in native mode only if the platform C compiler supports C :ctype:`long long`, or, on Windows, :ctype:`__int64`. They are always available in standard modes. @@ -121,11 +126,11 @@ Whitespace characters between formats are ignored; a count and its format must not contain whitespace though. -For the ``'s'`` format character, the count is interpreted as the size of the -string, not a repeat count like for the other format characters; for example, +For the ``'s'`` format character, the count is interpreted as the length of the +bytes, not a repeat count like for the other format characters; for example, ``'10s'`` means a single 10-byte string, while ``'10c'`` means 10 characters. For packing, the string is truncated or padded with null bytes as appropriate to -make it fit. For unpacking, the resulting string always has exactly the +make it fit. For unpacking, the resulting bytes object always has exactly the specified number of bytes. As a special case, ``'0s'`` means a single, empty string (while ``'0c'`` means 0 characters). @@ -137,7 +142,7 @@ leading count-1 bytes of the string are stored. If the string is shorter than count-1, it is padded with null bytes so that exactly count bytes in all are used. Note that for :func:`unpack`, the ``'p'`` format character consumes count -bytes, but that the string returned can never contain more than 255 characters. +bytes, but that the string returned can never contain more than 255 bytes. @@ -203,8 +208,8 @@ >>> from struct import * >>> pack('hhl', 1, 2, 3) - '\x00\x01\x00\x02\x00\x00\x00\x03' - >>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03') + b'\x00\x01\x00\x02\x00\x00\x00\x03' + >>> unpack('hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03') (1, 2, 3) >>> calcsize('hhl') 8 @@ -219,13 +224,13 @@ Unpacked fields can be named by assigning them to variables or by wrapping the result in a named tuple:: - >>> record = 'raymond \x32\x12\x08\x01\x08' + >>> record = b'raymond \x32\x12\x08\x01\x08' >>> name, serialnum, school, gradelevel = unpack('<10sHHb', record) >>> from collections import namedtuple >>> Student = namedtuple('Student', 'name serialnum school gradelevel') - >>> Student._make(unpack('<10sHHb', s)) - Student(name='raymond ', serialnum=4658, school=264, gradelevel=8) + >>> Student._make(unpack('<10sHHb', record)) + Student(name=b'raymond ', serialnum=4658, school=264, gradelevel=8) .. seealso:: @@ -265,10 +270,10 @@ Identical to the :func:`pack_into` function, using the compiled format. - .. method:: unpack(string) + .. method:: unpack(bytes) Identical to the :func:`unpack` function, using the compiled format. - (``len(string)`` must equal :attr:`self.size`). + (``len(bytes)`` must equal :attr:`self.size`). .. method:: unpack_from(buffer[, offset=0]) @@ -283,6 +288,6 @@ .. attribute:: size - The calculated size of the struct (and hence of the string) corresponding + The calculated size of the struct (and hence of the bytes) corresponding to :attr:`format`. Modified: python/branches/py3k/Modules/_struct.c ============================================================================== --- python/branches/py3k/Modules/_struct.c (original) +++ python/branches/py3k/Modules/_struct.c Thu Jul 31 17:03:40 2008 @@ -1,4 +1,4 @@ -/* struct module -- pack values into and (out of) strings */ +/* struct module -- pack values into and (out of) bytes objects */ /* New version supporting byte order, alignment and size options, character strings, and unsigned numbers */ @@ -610,7 +610,7 @@ } if (!PyBytes_Check(v) || PyBytes_Size(v) != 1) { PyErr_SetString(StructError, - "char format requires string of length 1"); + "char format requires bytes or string of length 1"); return -1; } *p = *PyBytes_AsString(v); @@ -1654,7 +1654,7 @@ isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { PyErr_SetString(StructError, - "argument for 's' must be a string"); + "argument for 's' must be a bytes or string"); return -1; } if (isstring) { @@ -1680,7 +1680,7 @@ isstring = PyBytes_Check(v); if (!isstring && !PyByteArray_Check(v)) { PyErr_SetString(StructError, - "argument for 'p' must be a string"); + "argument for 'p' must be a bytes or string"); return -1; } if (isstring) { @@ -1714,9 +1714,9 @@ PyDoc_STRVAR(s_pack__doc__, -"S.pack(v1, v2, ...) -> string\n\ +"S.pack(v1, v2, ...) -> bytes\n\ \n\ -Return a string containing values v1, v2, ... packed according to this\n\ +Return a bytes containing values v1, v2, ... packed according to this\n\ Struct's format. See struct.__doc__ for more on format strings."); static PyObject * @@ -1944,7 +1944,7 @@ } PyDoc_STRVAR(pack_doc, -"Return string containing values v1, v2, ... packed according to fmt."); +"Return bytes containing values v1, v2, ... packed according to fmt."); static PyObject * pack(PyObject *self, PyObject *args) @@ -2003,8 +2003,8 @@ } PyDoc_STRVAR(unpack_doc, -"Unpack the string containing packed C structure data, according to fmt.\n\ -Requires len(string) == calcsize(fmt)."); +"Unpack the bytes containing packed C structure data, according to fmt.\n\ +Requires len(bytes) == calcsize(fmt)."); static PyObject * unpack(PyObject *self, PyObject *args) @@ -2068,7 +2068,7 @@ PyDoc_STRVAR(module_doc, "Functions to convert between Python values and C structs.\n\ -Python strings are used to hold the data representing the C struct\n\ +Python bytes objects are used to hold the data representing the C struct\n\ and also as format strings to describe the layout of data in the C struct.\n\ \n\ The optional first format char indicates byte order, size and alignment:\n\ From python-3000-checkins at python.org Thu Jul 31 17:20:45 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 17:20:45 +0200 (CEST) Subject: [Python-3000-checkins] r65329 - in python/branches/py3k: Lib/tkinter/__init__.py Message-ID: <20080731152045.94F971E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 17:20:45 2008 New Revision: 65329 Log: Merged revisions 65328 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65328 | benjamin.peterson | 2008-07-31 10:15:45 -0500 (Thu, 31 Jul 2008) | 1 line remove usage of MacOS from Tkinter ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/tkinter/__init__.py Modified: python/branches/py3k/Lib/tkinter/__init__.py ============================================================================== --- python/branches/py3k/Lib/tkinter/__init__.py (original) +++ python/branches/py3k/Lib/tkinter/__init__.py Thu Jul 31 17:20:45 2008 @@ -39,10 +39,6 @@ import _tkinter # If this fails your Python may not be configured for Tk TclError = _tkinter.TclError from tkinter.constants import * -try: - import MacOS; _MacOS = MacOS; del MacOS -except ImportError: - _MacOS = None wantobjects = 1 @@ -1650,12 +1646,6 @@ def _loadtk(self): self._tkloaded = 1 global _default_root - if _MacOS and hasattr(_MacOS, 'SchedParams'): - # Disable event scanning except for Command-Period - _MacOS.SchedParams(1, 0) - # Work around nasty MacTk bug - # XXX Is this one still needed? - self.update() # Version sanity checks tk_version = self.tk.getvar('tk_version') if tk_version != _tkinter.TK_VERSION: From python-3000-checkins at python.org Thu Jul 31 17:55:59 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 17:55:59 +0200 (CEST) Subject: [Python-3000-checkins] r65330 - python/branches/py3k Message-ID: <20080731155559.0B2E11E400D@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 17:55:58 2008 New Revision: 65330 Log: block all the bsddb revisions. Jesus has said he is maintaining bsddb for 3.0 separately Modified: python/branches/py3k/ (props changed) From python-3000-checkins at python.org Thu Jul 31 18:23:05 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 18:23:05 +0200 (CEST) Subject: [Python-3000-checkins] r65331 - in python/branches/py3k: .bzrignore Doc/glossary.rst Doc/library/2to3.rst Doc/library/development.rst Doc/library/email.message.rst Doc/library/itertools.rst Doc/whatsnew/2.6.rst Lib/shelve.py Lib/test/test_robotparser.py Lib/test/test_shelve.py Lib/urllib/robotparser.py Modules/_bisectmodule.c Modules/_collectionsmodule.c Objects/enumobject.c Message-ID: <20080731162305.B0B9B1E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 18:23:04 2008 New Revision: 65331 Log: Merged revisions 65209-65216,65225-65226,65233,65239,65246-65247,65255-65256 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65209 | raymond.hettinger | 2008-07-23 19:08:18 -0500 (Wed, 23 Jul 2008) | 1 line Finish-up the partial conversion from int to Py_ssize_t for deque indices and length. ........ r65210 | raymond.hettinger | 2008-07-23 19:53:49 -0500 (Wed, 23 Jul 2008) | 1 line Parse to the correct datatype. ........ r65211 | benjamin.peterson | 2008-07-23 21:27:46 -0500 (Wed, 23 Jul 2008) | 1 line fix spacing ........ r65212 | benjamin.peterson | 2008-07-23 21:31:28 -0500 (Wed, 23 Jul 2008) | 1 line fix markup ........ r65213 | benjamin.peterson | 2008-07-23 21:45:37 -0500 (Wed, 23 Jul 2008) | 1 line add some documentation for 2to3 ........ r65214 | raymond.hettinger | 2008-07-24 00:38:48 -0500 (Thu, 24 Jul 2008) | 1 line Finish conversion from int to Py_ssize_t. ........ r65215 | raymond.hettinger | 2008-07-24 02:04:55 -0500 (Thu, 24 Jul 2008) | 1 line Convert from long to Py_ssize_t. ........ r65216 | georg.brandl | 2008-07-24 02:09:21 -0500 (Thu, 24 Jul 2008) | 2 lines Fix indentation. ........ r65225 | benjamin.peterson | 2008-07-25 11:55:37 -0500 (Fri, 25 Jul 2008) | 1 line teach .bzrignore about doc tools ........ r65226 | benjamin.peterson | 2008-07-25 12:02:11 -0500 (Fri, 25 Jul 2008) | 1 line document default value for fillvalue ........ r65233 | raymond.hettinger | 2008-07-25 13:43:33 -0500 (Fri, 25 Jul 2008) | 1 line Issue 1592: Better error reporting for operations on closed shelves. ........ r65239 | benjamin.peterson | 2008-07-25 16:59:53 -0500 (Fri, 25 Jul 2008) | 1 line fix indentation ........ r65246 | andrew.kuchling | 2008-07-26 08:08:19 -0500 (Sat, 26 Jul 2008) | 1 line This sentence continues to bug me; rewrite it for the second time ........ r65247 | andrew.kuchling | 2008-07-26 08:09:06 -0500 (Sat, 26 Jul 2008) | 1 line Remove extra words ........ r65255 | skip.montanaro | 2008-07-26 19:49:02 -0500 (Sat, 26 Jul 2008) | 3 lines Close issue 3437 - missing state change when Allow lines are processed. Adds test cases which use Allow: as well. ........ r65256 | skip.montanaro | 2008-07-26 19:50:41 -0500 (Sat, 26 Jul 2008) | 2 lines note robotparser bug fix. ........ Added: python/branches/py3k/Doc/library/2to3.rst - copied, changed from r65216, /python/trunk/Doc/library/2to3.rst Modified: python/branches/py3k/ (props changed) python/branches/py3k/.bzrignore python/branches/py3k/Doc/glossary.rst python/branches/py3k/Doc/library/development.rst python/branches/py3k/Doc/library/email.message.rst python/branches/py3k/Doc/library/itertools.rst python/branches/py3k/Doc/whatsnew/2.6.rst python/branches/py3k/Lib/shelve.py python/branches/py3k/Lib/test/test_robotparser.py python/branches/py3k/Lib/test/test_shelve.py python/branches/py3k/Lib/urllib/robotparser.py python/branches/py3k/Modules/_bisectmodule.c python/branches/py3k/Modules/_collectionsmodule.c python/branches/py3k/Objects/enumobject.c Modified: python/branches/py3k/.bzrignore ============================================================================== --- python/branches/py3k/.bzrignore (original) +++ python/branches/py3k/.bzrignore Thu Jul 31 18:23:04 2008 @@ -35,11 +35,14 @@ tags TAGS .gdb_history +Doc/tools/sphinx +Doc/tools/jinja +Doc/tools/pygments +Doc/tools/docutils Modules/Setup Modules/Setup.config Modules/Setup.local Modules/config.c Parser/pgen -Lib/plat-mac/errors.rsrc.df.rsrc Lib/lib2to3/Grammar*.pickle Lib/lib2to3/PatternGrammar*.pickle Modified: python/branches/py3k/Doc/glossary.rst ============================================================================== --- python/branches/py3k/Doc/glossary.rst (original) +++ python/branches/py3k/Doc/glossary.rst Thu Jul 31 18:23:04 2008 @@ -16,6 +16,15 @@ The typical Python prompt of the interactive shell when entering code for an indented code block. + 2to3 + A tool that tries to convert Python 2.x code to Python 3.x code by + handling most of the incompatibilites that can be detected by parsing the + source and traversing the parse tree. + + 2to3 is available in the standard library as :mod:`lib2to3`; a standalone + entry point is provided as :file:`Tools/scripts/2to3`. See + :ref:`2to3-reference`. + abstract base class Abstract Base Classes (abbreviated ABCs) complement :term:`duck-typing` by providing a way to define interfaces when other techniques like :func:`hasattr` Copied: python/branches/py3k/Doc/library/2to3.rst (from r65216, /python/trunk/Doc/library/2to3.rst) ============================================================================== --- /python/trunk/Doc/library/2to3.rst (original) +++ python/branches/py3k/Doc/library/2to3.rst Thu Jul 31 18:23:04 2008 @@ -36,7 +36,7 @@ :file:`example.py` will now look like this:: def greet(name): - print("Hello, {0}!".format(name)) + print("Hello, {0}!".format(name)) print("What's your name?") name = input() greet(name) Modified: python/branches/py3k/Doc/library/development.rst ============================================================================== --- python/branches/py3k/Doc/library/development.rst (original) +++ python/branches/py3k/Doc/library/development.rst Thu Jul 31 18:23:04 2008 @@ -9,7 +9,8 @@ :mod:`pydoc` module takes a module and generates documentation based on the module's contents. The :mod:`doctest` and :mod:`unittest` modules contains frameworks for writing unit tests that automatically exercise code and verify -that the expected output is produced. +that the expected output is produced. :program:`2to3` can translate Python 2.x +source code into valid Python 3.x code. The list of modules described in this chapter is: @@ -19,4 +20,5 @@ pydoc.rst doctest.rst unittest.rst + 2to3.rst test.rst Modified: python/branches/py3k/Doc/library/email.message.rst ============================================================================== --- python/branches/py3k/Doc/library/email.message.rst (original) +++ python/branches/py3k/Doc/library/email.message.rst Thu Jul 31 18:23:04 2008 @@ -90,7 +90,7 @@ .. method:: get_payload([i[, decode]]) - Return a reference the current payload, which will be a list of + Return the current payload, which will be a list of :class:`Message` objects when :meth:`is_multipart` is ``True``, or a string when :meth:`is_multipart` is ``False``. If the payload is a list and you mutate the list object, you modify the message's payload in place. Modified: python/branches/py3k/Doc/library/itertools.rst ============================================================================== --- python/branches/py3k/Doc/library/itertools.rst (original) +++ python/branches/py3k/Doc/library/itertools.rst Thu Jul 31 18:23:04 2008 @@ -295,9 +295,10 @@ except IndexError: pass - If one of the iterables is potentially infinite, then the :func:`zip_longest` - function should be wrapped with something that limits the number of calls (for - example :func:`islice` or :func:`takewhile`). + If one of the iterables is potentially infinite, then the + :func:`izip_longest` function should be wrapped with something that limits + the number of calls (for example :func:`islice` or :func:`takewhile`). If + not specified, *fillvalue* defaults to ``None``. .. function:: permutations(iterable[, r]) Modified: python/branches/py3k/Doc/whatsnew/2.6.rst ============================================================================== --- python/branches/py3k/Doc/whatsnew/2.6.rst (original) +++ python/branches/py3k/Doc/whatsnew/2.6.rst Thu Jul 31 18:23:04 2008 @@ -1144,7 +1144,7 @@ ABC that can describe an existing type or class, or if you want to declare that some third-party class implements an ABC. For example, if you defined a :class:`PrintableType` ABC, -it's legal to do: +it's legal to do:: # Register Python's types PrintableType.register(int) Modified: python/branches/py3k/Lib/shelve.py ============================================================================== --- python/branches/py3k/Lib/shelve.py (original) +++ python/branches/py3k/Lib/shelve.py Thu Jul 31 18:23:04 2008 @@ -64,6 +64,16 @@ __all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"] +class _ClosedDict(collections.MutableMapping): + 'Marker for a closed dict. Access attempts raise a ValueError.' + + def closed(self, *args): + raise ValueError('invalid operation on closed shelf') + __iter__ = __len__ = __getitem__ = __setitem__ = __delitem__ = keys = closed + + def __repr__(self): + return '' + class Shelf(collections.MutableMapping): """Base class for shelf implementations. @@ -127,7 +137,7 @@ self.dict.close() except AttributeError: pass - self.dict = 0 + self.dict = _ClosedDict() def __del__(self): if not hasattr(self, 'writeback'): Modified: python/branches/py3k/Lib/test/test_robotparser.py ============================================================================== --- python/branches/py3k/Lib/test/test_robotparser.py (original) +++ python/branches/py3k/Lib/test/test_robotparser.py Thu Jul 31 18:23:04 2008 @@ -136,6 +136,75 @@ RobotTest(7, doc, good, bad) +# From Google: http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=40364 + +# 8. +doc = """ +User-agent: Googlebot +Allow: /folder1/myfile.html +Disallow: /folder1/ +""" + +good = ['/folder1/myfile.html'] +bad = ['/folder1/anotherfile.html'] + +RobotTest(8, doc, good, bad, agent="Googlebot") + +# 9. This file is incorrect because "Googlebot" is a substring of +# "Googlebot-Mobile", so test 10 works just like test 9. +doc = """ +User-agent: Googlebot +Disallow: / + +User-agent: Googlebot-Mobile +Allow: / +""" + +good = [] +bad = ['/something.jpg'] + +RobotTest(9, doc, good, bad, agent="Googlebot") + +good = [] +bad = ['/something.jpg'] + +RobotTest(10, doc, good, bad, agent="Googlebot-Mobile") + +# 11. Get the order correct. +doc = """ +User-agent: Googlebot-Mobile +Allow: / + +User-agent: Googlebot +Disallow: / +""" + +good = [] +bad = ['/something.jpg'] + +RobotTest(11, doc, good, bad, agent="Googlebot") + +good = ['/something.jpg'] +bad = [] + +RobotTest(12, doc, good, bad, agent="Googlebot-Mobile") + + +# 13. Google also got the order wrong in #8. You need to specify the +# URLs from more specific to more general. +doc = """ +User-agent: Googlebot +Allow: /folder1/myfile.html +Disallow: /folder1/ +""" + +good = ['/folder1/myfile.html'] +bad = ['/folder1/anotherfile.html'] + +RobotTest(13, doc, good, bad, agent="googlebot") + + + class NetworkTestCase(unittest.TestCase): def testPasswordProtectedSite(self): Modified: python/branches/py3k/Lib/test/test_shelve.py ============================================================================== --- python/branches/py3k/Lib/test/test_shelve.py (original) +++ python/branches/py3k/Lib/test/test_shelve.py Thu Jul 31 18:23:04 2008 @@ -47,6 +47,21 @@ for f in glob.glob(self.fn+"*"): support.unlink(f) + def test_close(self): + d1 = {} + s = shelve.Shelf(d1, protocol=2, writeback=False) + s['key1'] = [1,2,3,4] + self.assertEqual(s['key1'], [1,2,3,4]) + self.assertEqual(len(s), 1) + s.close() + self.assertRaises(ValueError, len, s) + try: + s['key1'] + except ValueError: + pass + else: + self.fail('Closed shelf should not find a key') + def test_ascii_file_shelf(self): s = shelve.open(self.fn, protocol=0) try: Modified: python/branches/py3k/Lib/urllib/robotparser.py ============================================================================== --- python/branches/py3k/Lib/urllib/robotparser.py (original) +++ python/branches/py3k/Lib/urllib/robotparser.py Thu Jul 31 18:23:04 2008 @@ -76,6 +76,10 @@ We allow that a user-agent: line is not preceded by one or more blank lines. """ + # states: + # 0: start state + # 1: saw user-agent line + # 2: saw an allow or disallow line state = 0 entry = Entry() @@ -112,6 +116,7 @@ elif line[0] == "allow": if state != 0: entry.rulelines.append(RuleLine(line[1], True)) + state = 2 if state == 2: self.entries.append(entry) Modified: python/branches/py3k/Modules/_bisectmodule.c ============================================================================== --- python/branches/py3k/Modules/_bisectmodule.c (original) +++ python/branches/py3k/Modules/_bisectmodule.c Thu Jul 31 18:23:04 2008 @@ -5,7 +5,7 @@ #include "Python.h" -static int +static Py_ssize_t internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) { PyObject *litem; @@ -41,18 +41,18 @@ bisect_right(PyObject *self, PyObject *args, PyObject *kw) { PyObject *list, *item; - int lo = 0; - int hi = -1; - int index; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t index; static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:bisect_right", + if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_right", keywords, &list, &item, &lo, &hi)) return NULL; index = internal_bisect_right(list, item, lo, hi); if (index < 0) return NULL; - return PyLong_FromLong(index); + return PyLong_FromSsize_t(index); } PyDoc_STRVAR(bisect_right_doc, @@ -71,12 +71,12 @@ insort_right(PyObject *self, PyObject *args, PyObject *kw) { PyObject *list, *item, *result; - int lo = 0; - int hi = -1; - int index; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t index; static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:insort_right", + if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_right", keywords, &list, &item, &lo, &hi)) return NULL; index = internal_bisect_right(list, item, lo, hi); @@ -86,7 +86,7 @@ if (PyList_Insert(list, index, item) < 0) return NULL; } else { - result = PyObject_CallMethod(list, "insert", "iO", + result = PyObject_CallMethod(list, "insert", "nO", index, item); if (result == NULL) return NULL; @@ -106,11 +106,11 @@ Optional args lo (default 0) and hi (default len(a)) bound the\n\ slice of a to be searched.\n"); -static int -internal_bisect_left(PyObject *list, PyObject *item, int lo, int hi) +static Py_ssize_t +internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi) { PyObject *litem; - int mid, res; + Py_ssize_t mid, res; if (lo < 0) { PyErr_SetString(PyExc_ValueError, "lo must be non-negative"); @@ -142,18 +142,18 @@ bisect_left(PyObject *self, PyObject *args, PyObject *kw) { PyObject *list, *item; - int lo = 0; - int hi = -1; - int index; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t index; static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:bisect_left", + if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_left", keywords, &list, &item, &lo, &hi)) return NULL; index = internal_bisect_left(list, item, lo, hi); if (index < 0) return NULL; - return PyLong_FromLong(index); + return PyLong_FromSsize_t(index); } PyDoc_STRVAR(bisect_left_doc, @@ -172,12 +172,12 @@ insort_left(PyObject *self, PyObject *args, PyObject *kw) { PyObject *list, *item, *result; - int lo = 0; - int hi = -1; - int index; + Py_ssize_t lo = 0; + Py_ssize_t hi = -1; + Py_ssize_t index; static char *keywords[] = {"a", "x", "lo", "hi", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|ii:insort_left", + if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_left", keywords, &list, &item, &lo, &hi)) return NULL; index = internal_bisect_left(list, item, lo, hi); Modified: python/branches/py3k/Modules/_collectionsmodule.c ============================================================================== --- python/branches/py3k/Modules/_collectionsmodule.c (original) +++ python/branches/py3k/Modules/_collectionsmodule.c Thu Jul 31 18:23:04 2008 @@ -52,20 +52,20 @@ } block; #define MAXFREEBLOCKS 10 -static int numfreeblocks = 0; +static Py_ssize_t numfreeblocks = 0; static block *freeblocks[MAXFREEBLOCKS]; static block * -newblock(block *leftlink, block *rightlink, int len) { +newblock(block *leftlink, block *rightlink, Py_ssize_t len) { block *b; - /* To prevent len from overflowing INT_MAX on 64-bit machines, we + /* To prevent len from overflowing PY_SSIZE_T_MAX on 64-bit machines, we * refuse to allocate new blocks if the current len is dangerously * close. There is some extra margin to prevent spurious arithmetic * overflows at various places. The following check ensures that * the blocks allocated to the deque, in the worst case, can only - * have INT_MAX-2 entries in total. + * have PY_SSIZE_T_MAX-2 entries in total. */ - if (len >= INT_MAX - 2*BLOCKLEN) { + if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) { PyErr_SetString(PyExc_OverflowError, "cannot add more blocks to the deque"); return NULL; @@ -100,10 +100,10 @@ PyObject_HEAD block *leftblock; block *rightblock; - int leftindex; /* in range(BLOCKLEN) */ - int rightindex; /* in range(BLOCKLEN) */ - int len; - int maxlen; + Py_ssize_t leftindex; /* in range(BLOCKLEN) */ + Py_ssize_t rightindex; /* in range(BLOCKLEN) */ + Py_ssize_t len; + Py_ssize_t maxlen; long state; /* incremented whenever the indices move */ PyObject *weakreflist; /* List of weak references */ } dequeobject; @@ -355,7 +355,7 @@ static int _deque_rotate(dequeobject *deque, Py_ssize_t n) { - int i, len=deque->len, halflen=(len+1)>>1; + Py_ssize_t i, len=deque->len, halflen=(len+1)>>1; PyObject *item, *rv; if (len == 0) @@ -392,9 +392,9 @@ static PyObject * deque_rotate(dequeobject *deque, PyObject *args) { - int n=1; + Py_ssize_t n=1; - if (!PyArg_ParseTuple(args, "|i:rotate", &n)) + if (!PyArg_ParseTuple(args, "|n:rotate", &n)) return NULL; if (_deque_rotate(deque, n) == 0) Py_RETURN_NONE; @@ -462,11 +462,11 @@ } static PyObject * -deque_item(dequeobject *deque, int i) +deque_item(dequeobject *deque, Py_ssize_t i) { block *b; PyObject *item; - int n, index=i; + Py_ssize_t n, index=i; if (i < 0 || i >= deque->len) { PyErr_SetString(PyExc_IndexError, @@ -591,11 +591,11 @@ { block *b; PyObject *item; - int index; - int indexlo = deque->leftindex; + Py_ssize_t index; + Py_ssize_t indexlo = deque->leftindex; for (b = deque->leftblock; b != NULL; b = b->rightlink) { - const int indexhi = b == deque->rightblock ? + const Py_ssize_t indexhi = b == deque->rightblock ? deque->rightindex : BLOCKLEN - 1; @@ -637,12 +637,12 @@ if (deque->maxlen == -1) result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist); else - result = Py_BuildValue("O(Oi)", Py_TYPE(deque), aslist, deque->maxlen); + result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen); } else { if (deque->maxlen == -1) result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict); else - result = Py_BuildValue("O(Oi)O", Py_TYPE(deque), aslist, deque->maxlen, dict); + result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict); } Py_XDECREF(dict); Py_DECREF(aslist); @@ -683,7 +683,8 @@ deque_richcompare(PyObject *v, PyObject *w, int op) { PyObject *it1=NULL, *it2=NULL, *x, *y; - int b, vs, ws, cmp=-1; + Py_ssize_t vs, ws; + int b, cmp=-1; if (!PyObject_TypeCheck(v, &deque_type) || !PyObject_TypeCheck(w, &deque_type)) { @@ -762,13 +763,13 @@ { PyObject *iterable = NULL; PyObject *maxlenobj = NULL; - int maxlen = -1; + Py_ssize_t maxlen = -1; char *kwlist[] = {"iterable", "maxlen", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj)) return -1; if (maxlenobj != NULL && maxlenobj != Py_None) { - maxlen = PyLong_AsLong(maxlenobj); + maxlen = PyLong_AsSsize_t(maxlenobj); if (maxlen == -1 && PyErr_Occurred()) return -1; if (maxlen < 0) { @@ -884,11 +885,11 @@ typedef struct { PyObject_HEAD - int index; + Py_ssize_t index; block *b; dequeobject *deque; long state; /* state when the iterator is created */ - int counter; /* number of items remaining for iteration */ + Py_ssize_t counter; /* number of items remaining for iteration */ } dequeiterobject; static PyTypeObject dequeiter_type; Modified: python/branches/py3k/Objects/enumobject.c ============================================================================== --- python/branches/py3k/Objects/enumobject.c (original) +++ python/branches/py3k/Objects/enumobject.c Thu Jul 31 18:23:04 2008 @@ -31,6 +31,7 @@ Py_DECREF(en); return NULL; } + assert(PyLong_Check(start)); en->en_index = PyLong_AsSsize_t(start); if (en->en_index == -1 && PyErr_Occurred()) { PyErr_Clear(); From python-3000-checkins at python.org Thu Jul 31 18:32:17 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 18:32:17 +0200 (CEST) Subject: [Python-3000-checkins] r65332 - in python/branches/py3k: Lib/test/decimaltestdata/abs.decTest Lib/test/decimaltestdata/add.decTest Lib/test/decimaltestdata/and.decTest Lib/test/decimaltestdata/base.decTest Lib/test/decimaltestdata/clamp.decTest Lib/test/decimaltestdata/class.decTest Lib/test/decimaltestdata/compare.decTest Lib/test/decimaltestdata/comparetotal.decTest Lib/test/decimaltestdata/comparetotmag.decTest Lib/test/decimaltestdata/copy.decTest Lib/test/decimaltestdata/copyabs.decTest Lib/test/decimaltestdata/copynegate.decTest Lib/test/decimaltestdata/copysign.decTest Lib/test/decimaltestdata/ddAbs.decTest Lib/test/decimaltestdata/ddAdd.decTest Lib/test/decimaltestdata/ddAnd.decTest Lib/test/decimaltestdata/ddBase.decTest Lib/test/decimaltestdata/ddCanonical.decTest Lib/test/decimaltestdata/ddClass.decTest Lib/test/decimaltestdata/ddCompare.decTest Lib/test/decimaltestdata/ddCompareSig.decTest Lib/test/decimaltestdata/ddCompareTotal.decTest Lib/test/decimaltestdata/ddCompareTotalMag.decTest Lib/test/decimaltestdata/ddCopy.decTest Lib/test/decimaltestdata/ddCopyAbs.decTest Lib/test/decimaltestdata/ddCopyNegate.decTest Lib/test/decimaltestdata/ddCopySign.decTest Lib/test/decimaltestdata/ddDivide.decTest Lib/test/decimaltestdata/ddDivideInt.decTest Lib/test/decimaltestdata/ddEncode.decTest Lib/test/decimaltestdata/ddFMA.decTest Lib/test/decimaltestdata/ddInvert.decTest Lib/test/decimaltestdata/ddLogB.decTest Lib/test/decimaltestdata/ddMax.decTest Lib/test/decimaltestdata/ddMaxMag.decTest Lib/test/decimaltestdata/ddMin.decTest Lib/test/decimaltestdata/ddMinMag.decTest Lib/test/decimaltestdata/ddMinus.decTest Lib/test/decimaltestdata/ddMultiply.decTest Lib/test/decimaltestdata/ddNextMinus.decTest Lib/test/decimaltestdata/ddNextPlus.decTest Lib/test/decimaltestdata/ddNextToward.decTest Lib/test/decimaltestdata/ddOr.decTest Lib/test/decimaltestdata/ddPlus.decTest Lib/test/decimaltestdata/ddQuantize.decTest Lib/test/decimaltestdata/ddReduce.decTest Lib/test/decimaltestdata/ddRemainder.decTest Lib/test/decimaltestdata/ddRemainderNear.decTest Lib/test/decimaltestdata/ddRotate.decTest Lib/test/decimaltestdata/ddSameQuantum.decTest Lib/test/decimaltestdata/ddScaleB.decTest Lib/test/decimaltestdata/ddShift.decTest Lib/test/decimaltestdata/ddSubtract.decTest Lib/test/decimaltestdata/ddToIntegral.decTest Lib/test/decimaltestdata/ddXor.decTest Lib/test/decimaltestdata/decDouble.decTest Lib/test/decimaltestdata/decQuad.decTest Lib/test/decimaltestdata/decSingle.decTest Lib/test/decimaltestdata/divide.decTest Lib/test/decimaltestdata/divideint.decTest Lib/test/decimaltestdata/dqAbs.decTest Lib/test/decimaltestdata/dqAdd.decTest Lib/test/decimaltestdata/dqAnd.decTest Lib/test/decimaltestdata/dqBase.decTest Lib/test/decimaltestdata/dqCanonical.decTest Lib/test/decimaltestdata/dqClass.decTest Lib/test/decimaltestdata/dqCompare.decTest Lib/test/decimaltestdata/dqCompareSig.decTest Lib/test/decimaltestdata/dqCompareTotal.decTest Lib/test/decimaltestdata/dqCompareTotalMag.decTest Lib/test/decimaltestdata/dqCopy.decTest Lib/test/decimaltestdata/dqCopyAbs.decTest Lib/test/decimaltestdata/dqCopyNegate.decTest Lib/test/decimaltestdata/dqCopySign.decTest Lib/test/decimaltestdata/dqDivide.decTest Lib/test/decimaltestdata/dqDivideInt.decTest Lib/test/decimaltestdata/dqEncode.decTest Lib/test/decimaltestdata/dqFMA.decTest Lib/test/decimaltestdata/dqInvert.decTest Lib/test/decimaltestdata/dqLogB.decTest Lib/test/decimaltestdata/dqMax.decTest Lib/test/decimaltestdata/dqMaxMag.decTest Lib/test/decimaltestdata/dqMin.decTest Lib/test/decimaltestdata/dqMinMag.decTest Lib/test/decimaltestdata/dqMinus.decTest Lib/test/decimaltestdata/dqMultiply.decTest Lib/test/decimaltestdata/dqNextMinus.decTest Lib/test/decimaltestdata/dqNextPlus.decTest Lib/test/decimaltestdata/dqNextToward.decTest Lib/test/decimaltestdata/dqOr.decTest Lib/test/decimaltestdata/dqPlus.decTest Lib/test/decimaltestdata/dqQuantize.decTest Lib/test/decimaltestdata/dqReduce.decTest Lib/test/decimaltestdata/dqRemainder.decTest Lib/test/decimaltestdata/dqRemainderNear.decTest Lib/test/decimaltestdata/dqRotate.decTest Lib/test/decimaltestdata/dqSameQuantum.decTest Lib/test/decimaltestdata/dqScaleB.decTest Lib/test/decimaltestdata/dqShift.decTest Lib/test/decimaltestdata/dqSubtract.decTest Lib/test/decimaltestdata/dqToIntegral.decTest Lib/test/decimaltestdata/dqXor.decTest Lib/test/decimaltestdata/dsBase.decTest Lib/test/decimaltestdata/dsEncode.decTest Lib/test/decimaltestdata/exp.decTest Lib/test/decimaltestdata/fma.decTest Lib/test/decimaltestdata/inexact.decTest Lib/test/decimaltestdata/invert.decTest Lib/test/decimaltestdata/ln.decTest Lib/test/decimaltestdata/log10.decTest Lib/test/decimaltestdata/logb.decTest Lib/test/decimaltestdata/max.decTest Lib/test/decimaltestdata/maxmag.decTest Lib/test/decimaltestdata/min.decTest Lib/test/decimaltestdata/minmag.decTest Lib/test/decimaltestdata/minus.decTest Lib/test/decimaltestdata/multiply.decTest Lib/test/decimaltestdata/nextminus.decTest Lib/test/decimaltestdata/nextplus.decTest Lib/test/decimaltestdata/nexttoward.decTest Lib/test/decimaltestdata/or.decTest Lib/test/decimaltestdata/plus.decTest Lib/test/decimaltestdata/power.decTest Lib/test/decimaltestdata/powersqrt.decTest Lib/test/decimaltestdata/quantize.decTest Lib/test/decimaltestdata/randomBound32.decTest Lib/test/decimaltestdata/randoms.decTest Lib/test/decimaltestdata/reduce.decTest Lib/test/decimaltestdata/remainder.decTest Lib/test/decimaltestdata/remainderNear.decTest Lib/test/decimaltestdata/rescale.decTest Lib/test/decimaltestdata/rotate.decTest Lib/test/decimaltestdata/rounding.decTest Lib/test/decimaltestdata/samequantum.decTest Lib/test/decimaltestdata/scaleb.decTest Lib/test/decimaltestdata/shift.decTest Lib/test/decimaltestdata/squareroot.decTest Lib/test/decimaltestdata/subtract.decTest Lib/test/decimaltestdata/testall.decTest Lib/test/decimaltestdata/tointegral.decTest Lib/test/decimaltestdata/tointegralx.decTest Lib/test/decimaltestdata/xor.decTest Message-ID: <20080731163217.719431E4007@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 18:32:12 2008 New Revision: 65332 Log: Merged revisions 65257 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65257 | mark.dickinson | 2008-07-27 01:39:07 -0500 (Sun, 27 Jul 2008) | 3 lines Issue #3449: Update decimal module to use most recent specification (v. 1.68) and tests (v. 2.58) from IBM. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Lib/test/decimaltestdata/abs.decTest python/branches/py3k/Lib/test/decimaltestdata/add.decTest python/branches/py3k/Lib/test/decimaltestdata/and.decTest python/branches/py3k/Lib/test/decimaltestdata/base.decTest python/branches/py3k/Lib/test/decimaltestdata/clamp.decTest python/branches/py3k/Lib/test/decimaltestdata/class.decTest python/branches/py3k/Lib/test/decimaltestdata/compare.decTest python/branches/py3k/Lib/test/decimaltestdata/comparetotal.decTest python/branches/py3k/Lib/test/decimaltestdata/comparetotmag.decTest python/branches/py3k/Lib/test/decimaltestdata/copy.decTest python/branches/py3k/Lib/test/decimaltestdata/copyabs.decTest python/branches/py3k/Lib/test/decimaltestdata/copynegate.decTest python/branches/py3k/Lib/test/decimaltestdata/copysign.decTest python/branches/py3k/Lib/test/decimaltestdata/ddAbs.decTest python/branches/py3k/Lib/test/decimaltestdata/ddAdd.decTest python/branches/py3k/Lib/test/decimaltestdata/ddAnd.decTest python/branches/py3k/Lib/test/decimaltestdata/ddBase.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCanonical.decTest python/branches/py3k/Lib/test/decimaltestdata/ddClass.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCompare.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCompareSig.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotal.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotalMag.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCopy.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCopyAbs.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCopyNegate.decTest python/branches/py3k/Lib/test/decimaltestdata/ddCopySign.decTest python/branches/py3k/Lib/test/decimaltestdata/ddDivide.decTest python/branches/py3k/Lib/test/decimaltestdata/ddDivideInt.decTest python/branches/py3k/Lib/test/decimaltestdata/ddEncode.decTest python/branches/py3k/Lib/test/decimaltestdata/ddFMA.decTest python/branches/py3k/Lib/test/decimaltestdata/ddInvert.decTest python/branches/py3k/Lib/test/decimaltestdata/ddLogB.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMax.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMaxMag.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMin.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMinMag.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMinus.decTest python/branches/py3k/Lib/test/decimaltestdata/ddMultiply.decTest python/branches/py3k/Lib/test/decimaltestdata/ddNextMinus.decTest python/branches/py3k/Lib/test/decimaltestdata/ddNextPlus.decTest python/branches/py3k/Lib/test/decimaltestdata/ddNextToward.decTest python/branches/py3k/Lib/test/decimaltestdata/ddOr.decTest python/branches/py3k/Lib/test/decimaltestdata/ddPlus.decTest python/branches/py3k/Lib/test/decimaltestdata/ddQuantize.decTest python/branches/py3k/Lib/test/decimaltestdata/ddReduce.decTest python/branches/py3k/Lib/test/decimaltestdata/ddRemainder.decTest python/branches/py3k/Lib/test/decimaltestdata/ddRemainderNear.decTest python/branches/py3k/Lib/test/decimaltestdata/ddRotate.decTest python/branches/py3k/Lib/test/decimaltestdata/ddSameQuantum.decTest python/branches/py3k/Lib/test/decimaltestdata/ddScaleB.decTest python/branches/py3k/Lib/test/decimaltestdata/ddShift.decTest python/branches/py3k/Lib/test/decimaltestdata/ddSubtract.decTest python/branches/py3k/Lib/test/decimaltestdata/ddToIntegral.decTest python/branches/py3k/Lib/test/decimaltestdata/ddXor.decTest python/branches/py3k/Lib/test/decimaltestdata/decDouble.decTest python/branches/py3k/Lib/test/decimaltestdata/decQuad.decTest python/branches/py3k/Lib/test/decimaltestdata/decSingle.decTest python/branches/py3k/Lib/test/decimaltestdata/divide.decTest python/branches/py3k/Lib/test/decimaltestdata/divideint.decTest python/branches/py3k/Lib/test/decimaltestdata/dqAbs.decTest python/branches/py3k/Lib/test/decimaltestdata/dqAdd.decTest python/branches/py3k/Lib/test/decimaltestdata/dqAnd.decTest python/branches/py3k/Lib/test/decimaltestdata/dqBase.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCanonical.decTest python/branches/py3k/Lib/test/decimaltestdata/dqClass.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCompare.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCompareSig.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotal.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotalMag.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCopy.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCopyAbs.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCopyNegate.decTest python/branches/py3k/Lib/test/decimaltestdata/dqCopySign.decTest python/branches/py3k/Lib/test/decimaltestdata/dqDivide.decTest python/branches/py3k/Lib/test/decimaltestdata/dqDivideInt.decTest python/branches/py3k/Lib/test/decimaltestdata/dqEncode.decTest python/branches/py3k/Lib/test/decimaltestdata/dqFMA.decTest python/branches/py3k/Lib/test/decimaltestdata/dqInvert.decTest python/branches/py3k/Lib/test/decimaltestdata/dqLogB.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMax.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMaxMag.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMin.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMinMag.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMinus.decTest python/branches/py3k/Lib/test/decimaltestdata/dqMultiply.decTest python/branches/py3k/Lib/test/decimaltestdata/dqNextMinus.decTest python/branches/py3k/Lib/test/decimaltestdata/dqNextPlus.decTest python/branches/py3k/Lib/test/decimaltestdata/dqNextToward.decTest python/branches/py3k/Lib/test/decimaltestdata/dqOr.decTest python/branches/py3k/Lib/test/decimaltestdata/dqPlus.decTest python/branches/py3k/Lib/test/decimaltestdata/dqQuantize.decTest python/branches/py3k/Lib/test/decimaltestdata/dqReduce.decTest python/branches/py3k/Lib/test/decimaltestdata/dqRemainder.decTest python/branches/py3k/Lib/test/decimaltestdata/dqRemainderNear.decTest python/branches/py3k/Lib/test/decimaltestdata/dqRotate.decTest python/branches/py3k/Lib/test/decimaltestdata/dqSameQuantum.decTest python/branches/py3k/Lib/test/decimaltestdata/dqScaleB.decTest python/branches/py3k/Lib/test/decimaltestdata/dqShift.decTest python/branches/py3k/Lib/test/decimaltestdata/dqSubtract.decTest python/branches/py3k/Lib/test/decimaltestdata/dqToIntegral.decTest python/branches/py3k/Lib/test/decimaltestdata/dqXor.decTest python/branches/py3k/Lib/test/decimaltestdata/dsBase.decTest python/branches/py3k/Lib/test/decimaltestdata/dsEncode.decTest python/branches/py3k/Lib/test/decimaltestdata/exp.decTest python/branches/py3k/Lib/test/decimaltestdata/fma.decTest python/branches/py3k/Lib/test/decimaltestdata/inexact.decTest python/branches/py3k/Lib/test/decimaltestdata/invert.decTest python/branches/py3k/Lib/test/decimaltestdata/ln.decTest python/branches/py3k/Lib/test/decimaltestdata/log10.decTest python/branches/py3k/Lib/test/decimaltestdata/logb.decTest python/branches/py3k/Lib/test/decimaltestdata/max.decTest python/branches/py3k/Lib/test/decimaltestdata/maxmag.decTest python/branches/py3k/Lib/test/decimaltestdata/min.decTest python/branches/py3k/Lib/test/decimaltestdata/minmag.decTest python/branches/py3k/Lib/test/decimaltestdata/minus.decTest python/branches/py3k/Lib/test/decimaltestdata/multiply.decTest python/branches/py3k/Lib/test/decimaltestdata/nextminus.decTest python/branches/py3k/Lib/test/decimaltestdata/nextplus.decTest python/branches/py3k/Lib/test/decimaltestdata/nexttoward.decTest python/branches/py3k/Lib/test/decimaltestdata/or.decTest python/branches/py3k/Lib/test/decimaltestdata/plus.decTest python/branches/py3k/Lib/test/decimaltestdata/power.decTest python/branches/py3k/Lib/test/decimaltestdata/powersqrt.decTest python/branches/py3k/Lib/test/decimaltestdata/quantize.decTest python/branches/py3k/Lib/test/decimaltestdata/randomBound32.decTest python/branches/py3k/Lib/test/decimaltestdata/randoms.decTest python/branches/py3k/Lib/test/decimaltestdata/reduce.decTest python/branches/py3k/Lib/test/decimaltestdata/remainder.decTest python/branches/py3k/Lib/test/decimaltestdata/remainderNear.decTest python/branches/py3k/Lib/test/decimaltestdata/rescale.decTest python/branches/py3k/Lib/test/decimaltestdata/rotate.decTest python/branches/py3k/Lib/test/decimaltestdata/rounding.decTest python/branches/py3k/Lib/test/decimaltestdata/samequantum.decTest python/branches/py3k/Lib/test/decimaltestdata/scaleb.decTest python/branches/py3k/Lib/test/decimaltestdata/shift.decTest python/branches/py3k/Lib/test/decimaltestdata/squareroot.decTest python/branches/py3k/Lib/test/decimaltestdata/subtract.decTest python/branches/py3k/Lib/test/decimaltestdata/testall.decTest python/branches/py3k/Lib/test/decimaltestdata/tointegral.decTest python/branches/py3k/Lib/test/decimaltestdata/tointegralx.decTest python/branches/py3k/Lib/test/decimaltestdata/xor.decTest Modified: python/branches/py3k/Lib/test/decimaltestdata/abs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/abs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/abs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- abs.decTest -- decimal absolute value -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests primarily tests the existence of the operator. -- Additon, subtraction, rounding, and more overflows are tested Modified: python/branches/py3k/Lib/test/decimaltestdata/add.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/add.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/add.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------/cancell---------------------------------------------------------- -- add.decTest -- decimal addition -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 9 rounding: half_up Modified: python/branches/py3k/Lib/test/decimaltestdata/and.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/and.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/and.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- and.decTest -- digitwise logical AND -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/base.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/base.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/base.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- base.decTest -- base decimal <--> string conversions -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 -- This file tests base conversions from string to a decimal number Modified: python/branches/py3k/Lib/test/decimaltestdata/clamp.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/clamp.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/clamp.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- clamp.decTest -- clamped exponent tests (format-independent) -- --- Copyright (c) IBM Corporation, 2000, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2000, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests uses the same limits as the 8-byte concrete -- representation, but applies clamping without using format-specific Modified: python/branches/py3k/Lib/test/decimaltestdata/class.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/class.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/class.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- class.decTest -- Class operations -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- [New 2006.11.27] Modified: python/branches/py3k/Lib/test/decimaltestdata/compare.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/compare.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/compare.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- compare.decTest -- decimal comparison that allows quiet NaNs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/comparetotal.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/comparetotal.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/comparetotal.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- comparetotal.decTest -- decimal comparison using total ordering -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/comparetotmag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/comparetotmag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/comparetotmag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- comparetotmag.decTest -- decimal comparison, abs. total ordering -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that it cannot be assumed that add/subtract tests cover paths -- for this operation adequately, here, because the code might be Modified: python/branches/py3k/Lib/test/decimaltestdata/copy.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/copy.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/copy.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- copy.decTest -- quiet copy -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/copyabs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/copyabs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/copyabs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- copyAbs.decTest -- quiet copy and set sign to zero -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/copynegate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/copynegate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/copynegate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- copyNegate.decTest -- quiet copy and negate -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/copysign.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/copysign.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/copysign.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- copysign.decTest -- quiet copy with sign from rhs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddAbs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddAbs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddAbs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddAbs.decTest -- decDouble absolute value, heeding sNaN -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddAdd.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddAdd.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddAdd.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddAdd.decTest -- decDouble addition -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decDoubles only; all arguments are -- representable in a decDouble @@ -415,6 +415,31 @@ ddadd435 add 77e-19 10 -> 10.00000000000000 Inexact Rounded ddadd436 add 77e-299 10 -> 10.00000000000000 Inexact Rounded +-- fastpath boundary (more in dqadd) +-- 1234567890123456 +ddadd539 add '4444444444444444' '3333333333333333' -> '7777777777777777' +ddadd540 add '4444444444444444' '4444444444444444' -> '8888888888888888' +ddadd541 add '4444444444444444' '5555555555555555' -> '9999999999999999' +ddadd542 add '3333333333333333' '4444444444444444' -> '7777777777777777' +ddadd543 add '4444444444444444' '4444444444444444' -> '8888888888888888' +ddadd544 add '5555555555555555' '4444444444444444' -> '9999999999999999' +ddadd545 add '3000004000000000' '3000000000000040' -> '6000004000000040' +ddadd546 add '3000000400000000' '4000000000000400' -> '7000000400000400' +ddadd547 add '3000000040000000' '5000000000004000' -> '8000000040004000' +ddadd548 add '4000000004000000' '3000000000040000' -> '7000000004040000' +ddadd549 add '4000000000400000' '4000000000400000' -> '8000000000800000' +ddadd550 add '4000000000040000' '5000000004000000' -> '9000000004040000' +ddadd551 add '5000000000004000' '3000000040000000' -> '8000000040004000' +ddadd552 add '5000000000000400' '4000000400000000' -> '9000000400000400' +ddadd553 add '5000000000000040' '5000004000000000' -> 1.000000400000004E+16 Rounded +-- check propagation +ddadd554 add '8999999999999999' '0000000000000001' -> 9000000000000000 +ddadd555 add '0000000000000001' '8999999999999999' -> 9000000000000000 +ddadd556 add '0999999999999999' '0000000000000001' -> 1000000000000000 +ddadd557 add '0000000000000001' '0999999999999999' -> 1000000000000000 +ddadd558 add '4444444444444444' '4555555555555556' -> 9000000000000000 +ddadd559 add '4555555555555556' '4444444444444444' -> 9000000000000000 + -- negative ulps ddadd6440 add 1 -77e-14 -> 0.99999999999923 ddadd6441 add 1 -77e-15 -> 0.999999999999923 @@ -740,6 +765,9 @@ ddadd7575 add 1E-383 -1E-398 -> 9.99999999999999E-384 Subnormal ddadd7576 add -1E-383 +1E-398 -> -9.99999999999999E-384 Subnormal +-- and another curious case +ddadd7577 add 7.000000000000E-385 -1.00000E-391 -> 6.999999000000E-385 Subnormal + -- check overflow edge case -- 1234567890123456 ddadd7972 apply 9.999999999999999E+384 -> 9.999999999999999E+384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddAnd.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddAnd.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddAnd.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddAnd.decTest -- digitwise logical AND for decDoubles -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddBase.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddBase.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddBase.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddBase.decTest -- base decDouble <--> string conversions -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This file tests base conversions from string to a decimal number -- and back to a string (in Scientific form) @@ -1078,6 +1078,14 @@ ddbas1042 toSci 1.1111111111152445E-384 -> 1.11111111111524E-384 Inexact Rounded Subnormal Underflow ddbas1043 toSci 1.1111111111152446E-384 -> 1.11111111111524E-384 Inexact Rounded Subnormal Underflow +-- clamped large normals +ddbas1070 toSci 1E+369 -> 1E+369 +ddbas1071 toSci 1E+370 -> 1.0E+370 Clamped +ddbas1072 toSci 1E+378 -> 1.000000000E+378 Clamped +ddbas1073 toSci 1E+384 -> 1.000000000000000E+384 Clamped +ddbas1074 toSci 1E+385 -> Infinity Overflow Inexact Rounded + + -- clamped zeros [see also clamp.decTest] ddbas1075 toSci 0e+10000 -> 0E+369 Clamped ddbas1076 toSci 0e-10000 -> 0E-398 Clamped Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCanonical.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCanonical.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCanonical.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCanonical.decTest -- test decDouble canonical results -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This file tests that copy operations leave uncanonical operands -- unchanged, and vice versa Modified: python/branches/py3k/Lib/test/decimaltestdata/ddClass.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddClass.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddClass.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddClass.decTest -- decDouble Class operations -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- [New 2006.11.27] precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCompare.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCompare.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCompare.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCompare.decTest -- decDouble comparison that allows quiet NaNs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCompareSig.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCompareSig.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCompareSig.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCompareSig.decTest -- decDouble comparison; all NaNs signal -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotal.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotal.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotal.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCompareTotal.decTest -- decDouble comparison using total ordering-- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotalMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotalMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCompareTotalMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCompareTotalMag.decTest -- decDouble comparison; abs. total order-- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCopy.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCopy.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCopy.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCopy.decTest -- quiet decDouble copy -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCopyAbs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCopyAbs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCopyAbs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCopyAbs.decTest -- quiet decDouble copy and set sign to zero -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCopyNegate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCopyNegate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCopyNegate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCopyNegate.decTest -- quiet decDouble copy and negate -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddCopySign.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddCopySign.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddCopySign.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddCopySign.decTest -- quiet decDouble copy with sign from rhs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddDivide.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddDivide.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddDivide.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddDivide.decTest -- decDouble division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddDivideInt.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddDivideInt.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddDivideInt.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddDivideInt.decTest -- decDouble integer division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddEncode.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddEncode.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddEncode.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddEncode.decTest -- decimal eight-byte format testcases -- --- Copyright (c) IBM Corporation, 2000, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2000, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -18,7 +18,7 @@ -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -- [Previously called decimal64.decTest] -version: 2.57 +version: 2.58 -- This set of tests is for the eight-byte concrete representation. -- Its characteristics are: @@ -488,3 +488,8 @@ -- for narrowing decd840 apply #2870000000000000 -> 2.000000000000000E-99 + +-- some miscellaneous +decd850 apply #0004070000000000 -> 7.000000000000E-385 Subnormal +decd851 apply #0008000000020000 -> 1.00000E-391 Subnormal + Modified: python/branches/py3k/Lib/test/decimaltestdata/ddFMA.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddFMA.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddFMA.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddFMA.decTest -- decDouble Fused Multiply Add -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddInvert.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddInvert.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddInvert.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddInvert.decTest -- digitwise logical INVERT for decDoubles -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddLogB.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddLogB.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddLogB.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddLogB.decTest -- integral 754r adjusted exponent, for decDoubles -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMax.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMax.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMax.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMax.decTest -- decDouble maxnum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMaxMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMaxMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMaxMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMaxMag.decTest -- decDouble maxnummag -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMin.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMin.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMin.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMin.decTest -- decDouble minnum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMinMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMinMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMinMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMinMag.decTest -- decDouble minnummag -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMinus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMinus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMinus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMinus.decTest -- decDouble 0-x -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddMultiply.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddMultiply.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddMultiply.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddMultiply.decTest -- decDouble multiplication -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decDoubles only; all arguments are -- representable in a decDouble @@ -167,6 +167,8 @@ -- tryzeros cases ddmul504 multiply 0E-260 1000E-260 -> 0E-398 Clamped ddmul505 multiply 100E+260 0E+260 -> 0E+369 Clamped +-- 65K-1 case +ddmul506 multiply 77.1 850 -> 65535.0 -- mixed with zeros ddmul541 multiply 0 -1 -> -0 @@ -441,18 +443,28 @@ -- 1 234567890123456 ddmul900 multiply 0.3000000000E-191 0.3000000000E-191 -> 9.00000000000000E-384 Subnormal Rounded ddmul901 multiply 0.3000000001E-191 0.3000000001E-191 -> 9.00000000600000E-384 Underflow Inexact Subnormal Rounded -ddmul902 multiply 9.999999999999999E-383 0.0999999999999 -> 9.99999999999000E-384 Underflow Inexact Subnormal Rounded -ddmul903 multiply 9.999999999999999E-383 0.09999999999999 -> 9.99999999999900E-384 Underflow Inexact Subnormal Rounded -ddmul904 multiply 9.999999999999999E-383 0.099999999999999 -> 9.99999999999990E-384 Underflow Inexact Subnormal Rounded -ddmul905 multiply 9.999999999999999E-383 0.0999999999999999 -> 9.99999999999999E-384 Underflow Inexact Subnormal Rounded --- prove operands are exact -ddmul906 multiply 9.999999999999999E-383 1 -> 9.999999999999999E-383 -ddmul907 multiply 1 0.09999999999999999 -> 0.09999999999999999 --- the next rounds to Nmin -ddmul908 multiply 9.999999999999999E-383 0.09999999999999999 -> 1.000000000000000E-383 Underflow Inexact Subnormal Rounded +ddmul902 multiply 9.999999999999999E-383 0.0999999999999 -> 9.99999999999000E-384 Underflow Inexact Subnormal Rounded +ddmul903 multiply 9.999999999999999E-383 0.09999999999999 -> 9.99999999999900E-384 Underflow Inexact Subnormal Rounded +ddmul904 multiply 9.999999999999999E-383 0.099999999999999 -> 9.99999999999990E-384 Underflow Inexact Subnormal Rounded +ddmul905 multiply 9.999999999999999E-383 0.0999999999999999 -> 9.99999999999999E-384 Underflow Inexact Subnormal Rounded +-- The next rounds to Nmin (b**emin); this is the distinguishing case +-- for detecting tininess (before or after rounding) -- if after +-- rounding then the result would be the same, but the Underflow flag +-- would not be set +ddmul906 multiply 9.999999999999999E-383 0.09999999999999999 -> 1.000000000000000E-383 Underflow Inexact Subnormal Rounded +-- prove those operands were exact +ddmul907 multiply 9.999999999999999E-383 1 -> 9.999999999999999E-383 +ddmul908 multiply 1 0.09999999999999999 -> 0.09999999999999999 + +-- reducing tiniest +ddmul910 multiply 1e-398 0.99 -> 1E-398 Subnormal Inexact Rounded Underflow +ddmul911 multiply 1e-398 0.75 -> 1E-398 Subnormal Inexact Rounded Underflow +ddmul912 multiply 1e-398 0.5 -> 0E-398 Subnormal Inexact Rounded Underflow Clamped +ddmul913 multiply 1e-398 0.25 -> 0E-398 Subnormal Inexact Rounded Underflow Clamped +ddmul914 multiply 1e-398 0.01 -> 0E-398 Subnormal Inexact Rounded Underflow Clamped -- hugest -ddmul909 multiply 9999999999999999 9999999999999999 -> 9.999999999999998E+31 Inexact Rounded +ddmul920 multiply 9999999999999999 9999999999999999 -> 9.999999999999998E+31 Inexact Rounded -- power-of-ten edge cases ddmul1001 multiply 1 10 -> 10 @@ -535,12 +547,7 @@ ddmul1098 multiply 10000 99999999999 -> 999999999990000 - - -- Null tests ddmul9990 multiply 10 # -> NaN Invalid_operation ddmul9991 multiply # 10 -> NaN Invalid_operation - - - Modified: python/branches/py3k/Lib/test/decimaltestdata/ddNextMinus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddNextMinus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddNextMinus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddNextMinus.decTest -- decDouble next that is less [754r nextdown] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddNextPlus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddNextPlus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddNextPlus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddNextPlus.decTest -- decDouble next that is greater [754r nextup] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddNextToward.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddNextToward.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddNextToward.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddNextToward.decTest -- decDouble next toward rhs [754r nextafter] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddOr.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddOr.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddOr.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddOr.decTest -- digitwise logical OR for decDoubles -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddPlus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddPlus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddPlus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddPlus.decTest -- decDouble 0+x -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddQuantize.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddQuantize.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddQuantize.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddQuantize.decTest -- decDouble quantize operation -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Most of the tests here assume a "regular pattern", where the -- sign and coefficient are +1. @@ -653,7 +653,15 @@ ddqua1021 quantize 8.666666666666000E+384 1.000000000000000E+384 -> 8.666666666666000E+384 ddqua1022 quantize -8.666666666666000E+384 1.000000000000000E+384 -> -8.666666666666000E+384 ddqua1027 quantize 8.666666666666000E+323 1E+31 -> NaN Invalid_operation -ddqua1030 quantize 8.66666666E+3 1E+3 -> 9E+3 Inexact Rounded +ddqua1029 quantize 8.66666666E+3 1E+3 -> 9E+3 Inexact Rounded + + +--ddqua1030 quantize 8.666666666666000E+384 1E+384 -> 9.000000000000000E+384 Rounded Inexact +--ddqua1031 quantize 8.666666666666000E+384 1E+384 -> 8.666666666666000E+384 Rounded +--ddqua1032 quantize 8.666666666666000E+384 1E+383 -> 8.666666666666000E+384 Rounded +--ddqua1033 quantize 8.666666666666000E+384 1E+382 -> 8.666666666666000E+384 Rounded +--ddqua1034 quantize 8.666666666666000E+384 1E+381 -> 8.666666666666000E+384 Rounded +--ddqua1035 quantize 8.666666666666000E+384 1E+380 -> 8.666666666666000E+384 Rounded -- Int and uInt32 edge values for testing conversions ddqua1040 quantize -2147483646 0 -> -2147483646 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddReduce.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddReduce.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddReduce.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddReduce.decTest -- remove trailing zeros from a decDouble -- --- Copyright (c) IBM Corporation, 2003, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2003, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddRemainder.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddRemainder.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddRemainder.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddRemainder.decTest -- decDouble remainder -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddRemainderNear.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddRemainderNear.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddRemainderNear.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddRemainderNear.decTest -- decDouble remainder-near -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddRotate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddRotate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddRotate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddRotate.decTest -- rotate a decDouble coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddSameQuantum.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddSameQuantum.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddSameQuantum.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddSameQuantum.decTest -- check decDouble quantums match -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decDoubles. precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddScaleB.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddScaleB.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddScaleB.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddScalebB.decTest -- scale a decDouble by powers of 10 -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddShift.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddShift.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddShift.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddShift.decTest -- shift decDouble coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/ddSubtract.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddSubtract.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddSubtract.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddSubtract.decTest -- decDouble subtraction -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decDoubles only; all arguments are -- representable in a decDouble Modified: python/branches/py3k/Lib/test/decimaltestdata/ddToIntegral.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddToIntegral.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddToIntegral.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddToIntegral.decTest -- round Double to integral value -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests tests the extended specification 'round-to-integral -- value-exact' operations (from IEEE 854, later modified in 754r). Modified: python/branches/py3k/Lib/test/decimaltestdata/ddXor.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ddXor.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ddXor.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ddXor.decTest -- digitwise logical XOR for decDoubles -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 precision: 16 maxExponent: 384 Modified: python/branches/py3k/Lib/test/decimaltestdata/decDouble.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/decDouble.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/decDouble.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- decDouble.decTest -- run all decDouble decimal arithmetic tests -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- decDouble tests dectest: ddAbs Modified: python/branches/py3k/Lib/test/decimaltestdata/decQuad.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/decQuad.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/decQuad.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- decQuad.decTest -- run all decQuad decimal arithmetic tests -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- decQuad tests dectest: dqAbs Modified: python/branches/py3k/Lib/test/decimaltestdata/decSingle.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/decSingle.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/decSingle.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- decSingle.decTest -- run all decSingle decimal arithmetic tests -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- decSingle tests dectest: dsBase Modified: python/branches/py3k/Lib/test/decimaltestdata/divide.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/divide.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/divide.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- divide.decTest -- decimal division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/divideint.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/divideint.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/divideint.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- divideint.decTest -- decimal integer division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqAbs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqAbs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqAbs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqAbs.decTest -- decQuad absolute value, heeding sNaN -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqAdd.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqAdd.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqAdd.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqAdd.decTest -- decQuad addition -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decQuads only; all arguments are -- representable in a decQuad @@ -406,6 +406,64 @@ dqadd435 add 77e-37 10 -> 10.00000000000000000000000000000000 Inexact Rounded dqadd436 add 77e-299 10 -> 10.00000000000000000000000000000000 Inexact Rounded +-- fastpath boundaries +-- 1234567890123456789012345678901234 +dqadd501 add '4444444444444444444444444444444444' '5555555555555555555555555555555555' -> '9999999999999999999999999999999999' +dqadd502 add '4444444444444444444444444444444444' '4555555555555555555555555555555555' -> '8999999999999999999999999999999999' +dqadd503 add '4444444444444444444444444444444444' '3555555555555555555055555555555555' -> '7999999999999999999499999999999999' +dqadd504 add '4444444444444444444444444444444444' '3955555555555555555555555555555555' -> '8399999999999999999999999999999999' +dqadd505 add '4444444444444444444444444444444444' '4955555555555555555555555555555555' -> '9399999999999999999999999999999999' +dqadd506 add '4444444444444444444444444444444444' '5955555555555555555555555555555555' -> 1.040000000000000000000000000000000E+34 Inexact Rounded +dqadd511 add '344444444444444444444444444444444' '555555555555555555555555555555555' -> '899999999999999999999999999999999' +dqadd512 add '34444444444444444444444444444444' '55555555555555555555555555555555' -> '89999999999999999999999999999999' +dqadd513 add '3444444444444444444444444444444' '5555555555555555555555555555555' -> '8999999999999999999999999999999' +dqadd514 add '344444444444444444444444444444' '555555555555555555555555555555' -> '899999999999999999999999999999' +dqadd515 add '34444444444444444444444444444' '55555555555555555555555555555' -> '89999999999999999999999999999' +dqadd516 add '3444444444444444444444444444' '5555555555555555555555555555' -> '8999999999999999999999999999' +dqadd517 add '344444444444444444444444444' '555555555555555555555555555' -> '899999999999999999999999999' +dqadd518 add '34444444444444444444444444' '55555555555555555555555555' -> '89999999999999999999999999' +dqadd519 add '3444444444444444444444444' '5555555555555555555555555' -> '8999999999999999999999999' +dqadd520 add '344444444444444444444444' '555555555555555555555555' -> '899999999999999999999999' +dqadd521 add '34444444444444444444444' '55555555555555555555555' -> '89999999999999999999999' +dqadd522 add '3444444444444444444444' '5555555555555555555555' -> '8999999999999999999999' +dqadd523 add '4444444444444444444444' '3333333333333333333333' -> '7777777777777777777777' +dqadd524 add '344444444444444444444' '555555555555555555555' -> '899999999999999999999' +dqadd525 add '34444444444444444444' '55555555555555555555' -> '89999999999999999999' +dqadd526 add '3444444444444444444' '5555555555555555555' -> '8999999999999999999' +dqadd527 add '344444444444444444' '555555555555555555' -> '899999999999999999' +dqadd528 add '34444444444444444' '55555555555555555' -> '89999999999999999' +dqadd529 add '3444444444444444' '5555555555555555' -> '8999999999999999' +dqadd530 add '344444444444444' '555555555555555' -> '899999999999999' +dqadd531 add '34444444444444' '55555555555555' -> '89999999999999' +dqadd532 add '3444444444444' '5555555555555' -> '8999999999999' +dqadd533 add '344444444444' '555555555555' -> '899999999999' +dqadd534 add '34444444444' '55555555555' -> '89999999999' +dqadd535 add '3444444444' '5555555555' -> '8999999999' +dqadd536 add '344444444' '555555555' -> '899999999' +dqadd537 add '34444444' '55555555' -> '89999999' +dqadd538 add '3444444' '5555555' -> '8999999' +dqadd539 add '344444' '555555' -> '899999' +dqadd540 add '34444' '55555' -> '89999' +dqadd541 add '3444' '5555' -> '8999' +dqadd542 add '344' '555' -> '899' +dqadd543 add '34' '55' -> '89' +dqadd544 add '3' '5' -> '8' + +dqadd545 add '3000004000000000000000000000000000' '3000000000000040000000000000000000' -> '6000004000000040000000000000000000' +dqadd546 add '3000000400000000000000000000000000' '4000000000000400000000000000000000' -> '7000000400000400000000000000000000' +dqadd547 add '3000000040000000000000000000000000' '5000000000004000000000000000000000' -> '8000000040004000000000000000000000' +dqadd548 add '4000000004000000000000000000000000' '3000000000040000000000000000000000' -> '7000000004040000000000000000000000' +dqadd549 add '4000000000400000000000000000000000' '4000000000400000000000000000000000' -> '8000000000800000000000000000000000' +dqadd550 add '4000000000040000000000000000000000' '5000000004000000000000000000000000' -> '9000000004040000000000000000000000' +dqadd551 add '5000000000004000000000000000000000' '3000000040000000000000000000000000' -> '8000000040004000000000000000000000' +dqadd552 add '5000000000000400000000000000000000' '4000000400000000000000000000000000' -> '9000000400000400000000000000000000' +dqadd553 add '5000000000000040000000000000000000' '5000004000000000000000000000000000' -> 1.000000400000004000000000000000000E+34 Rounded +-- check propagation +dqadd554 add '8999999999999999999999999999999999' '0000000000000000000000000000000001' -> 9000000000000000000000000000000000 +dqadd555 add '0000000000000000000000000000000001' '8999999999999999999999999999999999' -> 9000000000000000000000000000000000 +dqadd556 add '4444444444444444444444444444444444' '4555555555555555555555555555555556' -> 9000000000000000000000000000000000 +dqadd557 add '4555555555555555555555555555555556' '4444444444444444444444444444444444' -> 9000000000000000000000000000000000 + -- negative ulps dqadd6440 add 1 -77e-32 -> 0.99999999999999999999999999999923 dqadd6441 add 1 -77e-33 -> 0.999999999999999999999999999999923 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqAnd.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqAnd.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqAnd.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqAnd.decTest -- digitwise logical AND for decQuads -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqBase.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqBase.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqBase.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqBase.decTest -- base decQuad <--> string conversions -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This file tests base conversions from string to a decimal number -- and back to a string (in Scientific form) Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCanonical.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCanonical.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCanonical.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCanonical.decTest -- test decQuad canonical results -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This file tests that copy operations leave uncanonical operands -- unchanged, and vice versa Modified: python/branches/py3k/Lib/test/decimaltestdata/dqClass.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqClass.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqClass.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqClass.decTest -- decQuad Class operations -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- [New 2006.11.27] Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCompare.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCompare.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCompare.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCompare.decTest -- decQuad comparison that allows quiet NaNs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCompareSig.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCompareSig.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCompareSig.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCompareSig.decTest -- decQuad comparison; all NaNs signal -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotal.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotal.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotal.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCompareTotal.decTest -- decQuad comparison using total ordering -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotalMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotalMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCompareTotalMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCompareTotalMag.decTest -- decQuad comparison; abs. total order -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Note that we cannot assume add/subtract tests cover paths adequately, -- here, because the code might be quite different (comparison cannot Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCopy.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCopy.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCopy.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCopy.decTest -- quiet decQuad copy -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCopyAbs.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCopyAbs.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCopyAbs.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCopyAbs.decTest -- quiet decQuad copy and set sign to zero -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCopyNegate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCopyNegate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCopyNegate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCopyNegate.decTest -- quiet decQuad copy and negate -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqCopySign.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqCopySign.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqCopySign.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqCopySign.decTest -- quiet decQuad copy with sign from rhs -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqDivide.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqDivide.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqDivide.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqDivide.decTest -- decQuad division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqDivideInt.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqDivideInt.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqDivideInt.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqDivideInt.decTest -- decQuad integer division -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqEncode.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqEncode.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqEncode.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqEncode.decTest -- decimal sixteen-byte format testcases -- --- Copyright (c) IBM Corporation, 2000, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2000, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -18,7 +18,7 @@ -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -- [Previously called decimal128.decTest] -version: 2.57 +version: 2.58 -- This set of tests is for the sixteen-byte concrete representation. -- Its characteristics are: Modified: python/branches/py3k/Lib/test/decimaltestdata/dqFMA.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqFMA.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqFMA.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqFMA.decTest -- decQuad Fused Multiply Add -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqInvert.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqInvert.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqInvert.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqInvert.decTest -- digitwise logical INVERT for decQuads -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqLogB.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqLogB.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqLogB.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqLogB.decTest -- integral 754r adjusted exponent, for decQuads -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMax.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMax.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMax.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMax.decTest -- decQuad maxnum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMaxMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMaxMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMaxMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMaxMag.decTest -- decQuad maxnummag -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMin.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMin.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMin.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMin.decTest -- decQuad minnum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMinMag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMinMag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMinMag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMinMag.decTest -- decQuad minnummag -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMinus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMinus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMinus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMinus.decTest -- decQuad 0-x -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqMultiply.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqMultiply.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqMultiply.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqMultiply.decTest -- decQuad multiplication -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decQuads only; all arguments are -- representable in a decQuad Modified: python/branches/py3k/Lib/test/decimaltestdata/dqNextMinus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqNextMinus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqNextMinus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqNextMinus.decTest -- decQuad next that is less [754r nextdown] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqNextPlus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqNextPlus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqNextPlus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqNextPlus.decTest -- decQuad next that is greater [754r nextup] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqNextToward.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqNextToward.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqNextToward.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqNextToward.decTest -- decQuad next toward rhs [754r nextafter] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqOr.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqOr.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqOr.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqOr.decTest -- digitwise logical OR for decQuads -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqPlus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqPlus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqPlus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqPlus.decTest -- decQuad 0+x -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqQuantize.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqQuantize.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqQuantize.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqQuantize.decTest -- decQuad quantize operation -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Most of the tests here assume a "regular pattern", where the -- sign and coefficient are +1. @@ -455,25 +455,38 @@ dqqua515 quantize -0E+1 1e-1 -> -0.0 dqqua516 quantize -0E+1 1e0 -> -0 dqqua517 quantize -0E+1 1e+1 -> -0E+1 +-- #519 here once a problem +dqqua518 quantize 0 0E-3 -> 0.000 +dqqua519 quantize 0 0E-33 -> 0E-33 +dqqua520 quantize 0.00000000000000000000000000000000 0E-33 -> 0E-33 +dqqua521 quantize 0.000000000000000000000000000000000 0E-33 -> 0E-33 + +-- Some non-zeros with lots of padding on the right +dqqua523 quantize 1 0E-33 -> 1.000000000000000000000000000000000 +dqqua524 quantize 12 0E-32 -> 12.00000000000000000000000000000000 +dqqua525 quantize 123 0E-31 -> 123.0000000000000000000000000000000 +dqqua526 quantize 123 0E-32 -> NaN Invalid_operation +dqqua527 quantize 123.4 0E-31 -> 123.4000000000000000000000000000000 +dqqua528 quantize 123.4 0E-32 -> NaN Invalid_operation -- Suspicious RHS values -dqqua520 quantize 1.234 1e359 -> 0E+359 Inexact Rounded -dqqua521 quantize 123.456 1e359 -> 0E+359 Inexact Rounded -dqqua522 quantize 1.234 1e359 -> 0E+359 Inexact Rounded -dqqua523 quantize 123.456 1e359 -> 0E+359 Inexact Rounded --- next four are "won't fit" overfl -dqqua526 quantize 1.234 1e-299 -> NaN Invalid_operation -dqqua527 quantize 123.456 1e-299 -> NaN Invalid_operation -dqqua528 quantize 1.234 1e-299 -> NaN Invalid_operation -dqqua529 quantize 123.456 1e-299 -> NaN Invalid_operation - -dqqua532 quantize 1.234E+299 1e299 -> 1E+299 Inexact Rounded -dqqua533 quantize 1.234E+298 1e299 -> 0E+299 Inexact Rounded -dqqua534 quantize 1.234 1e299 -> 0E+299 Inexact Rounded -dqqua537 quantize 0 1e-299 -> 0E-299 +dqqua530 quantize 1.234 1e359 -> 0E+359 Inexact Rounded +dqqua531 quantize 123.456 1e359 -> 0E+359 Inexact Rounded +dqqua532 quantize 1.234 1e359 -> 0E+359 Inexact Rounded +dqqua533 quantize 123.456 1e359 -> 0E+359 Inexact Rounded +-- next four are "won't fit" overflows +dqqua536 quantize 1.234 1e-299 -> NaN Invalid_operation +dqqua537 quantize 123.456 1e-299 -> NaN Invalid_operation +dqqua538 quantize 1.234 1e-299 -> NaN Invalid_operation +dqqua539 quantize 123.456 1e-299 -> NaN Invalid_operation + +dqqua542 quantize 1.234E+299 1e299 -> 1E+299 Inexact Rounded +dqqua543 quantize 1.234E+298 1e299 -> 0E+299 Inexact Rounded +dqqua544 quantize 1.234 1e299 -> 0E+299 Inexact Rounded +dqqua547 quantize 0 1e-299 -> 0E-299 -- next two are "won't fit" overflows -dqqua538 quantize 1.234 1e-299 -> NaN Invalid_operation -dqqua539 quantize 1.234 1e-300 -> NaN Invalid_operation +dqqua548 quantize 1.234 1e-299 -> NaN Invalid_operation +dqqua549 quantize 1.234 1e-300 -> NaN Invalid_operation -- [more below] -- Specials @@ -587,13 +600,13 @@ dqqua699 quantize NaN -sNaN88 -> -NaN88 Invalid_operation -- subnormals and underflow -dqqua710 quantize 1.00E-6143 1e-6143 -> 1E-6143 Rounded +dqqua710 quantize 1.00E-6143 1e-6143 -> 1E-6143 Rounded dqqua711 quantize 0.1E-6143 2e-6144 -> 1E-6144 Subnormal dqqua712 quantize 0.10E-6143 3e-6144 -> 1E-6144 Subnormal Rounded dqqua713 quantize 0.100E-6143 4e-6144 -> 1E-6144 Subnormal Rounded dqqua714 quantize 0.01E-6143 5e-6145 -> 1E-6145 Subnormal -- next is rounded to Emin -dqqua715 quantize 0.999E-6143 1e-6143 -> 1E-6143 Inexact Rounded +dqqua715 quantize 0.999E-6143 1e-6143 -> 1E-6143 Inexact Rounded dqqua716 quantize 0.099E-6143 10e-6144 -> 1E-6144 Inexact Rounded Subnormal dqqua717 quantize 0.009E-6143 1e-6145 -> 1E-6145 Inexact Rounded Subnormal @@ -649,10 +662,12 @@ dqqua769 quantize -0.0001E-6143 1e-6146 -> -0E-6146 Inexact Rounded -- More from Fung Lee -dqqua1021 quantize 8.666666666666000E+6144 1.000000000000000E+6144 -> 8.666666666666000000000000000000000E+6144 Clamped -dqqua1022 quantize -8.666666666666000E+6144 1.000000000000000E+6144 -> -8.666666666666000000000000000000000E+6144 Clamped -dqqua1027 quantize 8.666666666666000E+323 1E+31 -> NaN Invalid_operation -dqqua1030 quantize 8.66666666E+3 1E+3 -> 9E+3 Inexact Rounded +-- the next four would appear to be in error, but they are misleading (the +-- operands will be clamped to a lower exponent) and so are omitted +-- dqqua1021 quantize 8.666666666666000E+6144 1.000000000000000E+6144 -> 8.666666666666000000000000000000000E+6144 Clamped +-- dqqua1022 quantize -8.666666666666000E+6144 1.000000000000000E+6144 -> -8.666666666666000000000000000000000E+6144 Clamped +-- dqqua1027 quantize 8.666666666666000E+323 1E+31 -> NaN Invalid_operation +-- dqqua1030 quantize 8.66666666E+3 1E+3 -> 9E+3 Inexact Rounded -- Int and uInt32 edge values for testing conversions dqqua1040 quantize -2147483646 0 -> -2147483646 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqReduce.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqReduce.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqReduce.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqReduce.decTest -- remove trailing zeros from a decQuad -- --- Copyright (c) IBM Corporation, 2003, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2003, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -18,7 +18,7 @@ -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqRemainder.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqRemainder.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqRemainder.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqRemainder.decTest -- decQuad remainder -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqRemainderNear.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqRemainderNear.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqRemainderNear.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqRemainderNear.decTest -- decQuad remainder-near -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqRotate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqRotate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqRotate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqRotate.decTest -- rotate decQuad coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqSameQuantum.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqSameQuantum.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqSameQuantum.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqSameQuantum.decTest -- check decQuad quantums match -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- All operands and results are decQuads. extended: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqScaleB.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqScaleB.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqScaleB.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqScalebB.decTest -- scale a decQuad by powers of 10 -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqShift.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqShift.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqShift.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqShift.decTest -- shift decQuad coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dqSubtract.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqSubtract.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqSubtract.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqSubtract.decTest -- decQuad subtraction -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests are for decQuads only; all arguments are -- representable in a decQuad Modified: python/branches/py3k/Lib/test/decimaltestdata/dqToIntegral.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqToIntegral.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqToIntegral.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqToIntegral.decTest -- round Quad to integral value -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests tests the extended specification 'round-to-integral -- value-exact' operations (from IEEE 854, later modified in 754r). Modified: python/branches/py3k/Lib/test/decimaltestdata/dqXor.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dqXor.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dqXor.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dqXor.decTest -- digitwise logical XOR for decQuads -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 clamp: 1 Modified: python/branches/py3k/Lib/test/decimaltestdata/dsBase.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dsBase.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dsBase.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dsBase.decTest -- base decSingle <--> string conversions -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This file tests base conversions from string to a decimal number -- and back to a string (in Scientific form) Modified: python/branches/py3k/Lib/test/decimaltestdata/dsEncode.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/dsEncode.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/dsEncode.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- dsEncode.decTest -- decimal four-byte format testcases -- --- Copyright (c) IBM Corporation, 2000, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2000, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -18,7 +18,7 @@ -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -- [Previously called decimal32.decTest] -version: 2.57 +version: 2.58 -- This set of tests is for the four-byte concrete representation. -- Its characteristics are: Modified: python/branches/py3k/Lib/test/decimaltestdata/exp.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/exp.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/exp.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- exp.decTest -- decimal natural exponentiation -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Tests of the exponential funtion. Currently all testcases here -- show results which are correctly rounded (within <= 0.5 ulp). Modified: python/branches/py3k/Lib/test/decimaltestdata/fma.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/fma.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/fma.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- fma.decTest -- decimal fused multiply add -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/inexact.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/inexact.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/inexact.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- inexact.decTest -- decimal inexact and rounded edge cases -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/invert.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/invert.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/invert.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- invert.decTest -- digitwise logical INVERT -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/ln.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/ln.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/ln.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- ln.decTest -- decimal natural logarithm -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 16 Modified: python/branches/py3k/Lib/test/decimaltestdata/log10.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/log10.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/log10.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- log10.decTest -- decimal logarithm in base 10 -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This emphasises the testing of notable cases, as they will often -- have unusual paths (especially the 10**n results). Modified: python/branches/py3k/Lib/test/decimaltestdata/logb.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/logb.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/logb.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- logb.decTest -- return integral adjusted exponent as per 754r -- --- Copyright (c) IBM Corporation, 2005, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2005, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This emphasises the testing of notable cases, as they will often -- have unusual paths (especially the 10**n results). Modified: python/branches/py3k/Lib/test/decimaltestdata/max.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/max.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/max.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- max.decTest -- decimal maximum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/maxmag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/maxmag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/maxmag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- maxmag.decTest -- decimal maximum by magnitude -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/min.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/min.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/min.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- min.decTest -- decimal minimum -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/minmag.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/minmag.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/minmag.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- minmag.decTest -- decimal minimum by magnitude -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- we assume that base comparison is tested in compare.decTest, so -- these mainly cover special cases and rounding Modified: python/branches/py3k/Lib/test/decimaltestdata/minus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/minus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/minus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- minus.decTest -- decimal negation -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests primarily tests the existence of the operator. -- Subtraction, rounding, and more overflows are tested elsewhere. Modified: python/branches/py3k/Lib/test/decimaltestdata/multiply.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/multiply.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/multiply.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- multiply.decTest -- decimal multiplication -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/nextminus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/nextminus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/nextminus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- nextminus.decTest -- decimal next that is less [754r nextdown] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/nextplus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/nextplus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/nextplus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- nextplus.decTest -- decimal next that is greater [754r nextup] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/nexttoward.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/nexttoward.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/nexttoward.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- nexttoward.decTest -- decimal next toward rhs [754r nextafter] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/or.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/or.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/or.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- or.decTest -- digitwise logical OR -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/plus.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/plus.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/plus.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- plus.decTest -- decimal monadic addition -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests primarily tests the existence of the operator. -- Addition and rounding, and most overflows, are tested elsewhere. Modified: python/branches/py3k/Lib/test/decimaltestdata/power.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/power.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/power.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- power.decTest -- decimal exponentiation [power(x, y)] -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- In addition to the power operator testcases here, see also the file -- powersqrt.decTest which includes all the tests from Modified: python/branches/py3k/Lib/test/decimaltestdata/powersqrt.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/powersqrt.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/powersqrt.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- powersqrt.decTest -- decimal square root, using power -- --- Copyright (c) IBM Corporation, 2004, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2004, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- These testcases are taken from squareroot.decTest but are -- evaluated using the power operator. The differences in results Modified: python/branches/py3k/Lib/test/decimaltestdata/quantize.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/quantize.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/quantize.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- quantize.decTest -- decimal quantize operation -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- Most of the tests here assume a "regular pattern", where the -- sign and coefficient are +1. Modified: python/branches/py3k/Lib/test/decimaltestdata/randomBound32.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/randomBound32.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/randomBound32.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- randomBound32.decTest -- decimal testcases -- boundaries near 32 -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- These testcases test calculations at precisions 31, 32, and 33, to -- exercise the boundaries around 2**5 Modified: python/branches/py3k/Lib/test/decimaltestdata/randoms.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/randoms.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/randoms.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- randoms.decTest -- decimal random testcases -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 maxexponent: 999999999 Modified: python/branches/py3k/Lib/test/decimaltestdata/reduce.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/reduce.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/reduce.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- reduce.decTest -- remove trailing zeros -- --- Copyright (c) IBM Corporation, 2003, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2003, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -19,7 +19,7 @@ ------------------------------------------------------------------------ -- [This used to be called normalize.] -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/remainder.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/remainder.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/remainder.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- remainder.decTest -- decimal remainder -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/remainderNear.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/remainderNear.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/remainderNear.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- remainderNear.decTest -- decimal remainder-near (IEEE remainder) -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/rescale.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/rescale.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/rescale.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- rescale.decTest -- decimal rescale operation -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- [obsolete] Quantize.decTest has the improved version Modified: python/branches/py3k/Lib/test/decimaltestdata/rotate.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/rotate.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/rotate.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- rotate.decTest -- rotate coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/rounding.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/rounding.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/rounding.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- rounding.decTest -- decimal rounding modes testcases -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- These tests require that implementations take account of residues in -- order to get correct results for some rounding modes. Rather than Modified: python/branches/py3k/Lib/test/decimaltestdata/samequantum.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/samequantum.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/samequantum.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- samequantum.decTest -- check quantums match -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/scaleb.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/scaleb.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/scaleb.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- scaleb.decTest -- scale a number by powers of 10 -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/shift.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/shift.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/shift.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- shift.decTest -- shift coefficient left or right -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/squareroot.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/squareroot.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/squareroot.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- squareroot.decTest -- decimal square root -- --- Copyright (c) IBM Corporation, 2003, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2003, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 @@ -3671,6 +3671,8 @@ precision: 1 sqtx8626 squareroot 1E+18 -> 1E+9 sqtx8627 squareroot 1E+19 -> 3E+9 Inexact Rounded +-- in this next one, intermediate result is 9486832980.505137996... +-- so rounds down to 9 (not up to 10 which would cause Infinity overflow) sqtx8628 squareroot 9E+19 -> 9E+9 Inexact Rounded sqtx8629 squareroot 9.1E+19 -> Infinity Overflow Inexact Rounded sqtx8630 squareroot 1E+20 -> Infinity Overflow Inexact Rounded @@ -3770,6 +3772,10 @@ precision: 1 sqtx9006 squareroot 11025 -> 1E+2 Inexact Rounded +-- an interesting case +precision: 7 +sqtx9007 squareroot 1600000e1 -> 4000 + -- Out-of-bounds zeros precision: 4 sqtx9010 squareroot 0E-9 -> 0.00000 @@ -3799,6 +3805,20 @@ sqtx9039 squareroot 0E+21 -> 0E+9 Clamped sqtx9040 squareroot 0E+22 -> 0E+9 Clamped +-- if digits > emax maximum real exponent is negative +maxexponent: 9 +minexponent: -9 +precision: 15 +clamp: 1 +sqtx9045 squareroot 1 -> 1.00000 Clamped + +-- High-precision exact and inexact +maxexponent: 999 +minexponent: -999 +precision: 400 +sqtx9050 squareroot 2 -> 1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571470109559971605970274534596862014728517418640889198609552329230484308714321450839762603627995251407989687253396546331808829640620615258352395054745750287759961729835575220337531857011354374603408498847 Inexact Rounded +sqtx9051 squareroot 1089 -> 33 +sqtx9052 squareroot 10.89 -> 3.3 -- Null test sqtx9900 squareroot # -> NaN Invalid_operation Modified: python/branches/py3k/Lib/test/decimaltestdata/subtract.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/subtract.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/subtract.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- subtract.decTest -- decimal subtraction -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 Modified: python/branches/py3k/Lib/test/decimaltestdata/testall.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/testall.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/testall.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- testall.decTest -- run all general decimal arithmetic testcases -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- core tests (using Extended: 1) -------------------------------------- dectest: base Modified: python/branches/py3k/Lib/test/decimaltestdata/tointegral.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/tointegral.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/tointegral.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- tointegral.decTest -- round decimal to integral value -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests tests the extended specification 'round-to-integral -- value' operation (from IEEE 854, later modified in 754r). Modified: python/branches/py3k/Lib/test/decimaltestdata/tointegralx.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/tointegralx.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/tointegralx.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- tointegralx.decTest -- round decimal to integral value, exact -- --- Copyright (c) IBM Corporation, 2001, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 2001, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 -- This set of tests tests the extended specification 'round-to-integral -- value' operation (from IEEE 854, later modified in 754r). Modified: python/branches/py3k/Lib/test/decimaltestdata/xor.decTest ============================================================================== --- python/branches/py3k/Lib/test/decimaltestdata/xor.decTest (original) +++ python/branches/py3k/Lib/test/decimaltestdata/xor.decTest Thu Jul 31 18:32:12 2008 @@ -1,6 +1,6 @@ ------------------------------------------------------------------------ -- xor.decTest -- digitwise logical XOR -- --- Copyright (c) IBM Corporation, 1981, 2007. All rights reserved. -- +-- Copyright (c) IBM Corporation, 1981, 2008. All rights reserved. -- ------------------------------------------------------------------------ -- Please see the document "General Decimal Arithmetic Testcases" -- -- at http://www2.hursley.ibm.com/decimal for the description of -- @@ -17,7 +17,7 @@ -- IBM UK, PO Box 31, Birmingham Road, Warwick CV34 5JL, UK -- -- mfc at uk.ibm.com -- ------------------------------------------------------------------------ -version: 2.57 +version: 2.58 extended: 1 precision: 9 From python-3000-checkins at python.org Thu Jul 31 22:21:46 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 22:21:46 +0200 (CEST) Subject: [Python-3000-checkins] r65337 - in python/branches/py3k: Doc/library/itertools.rst Doc/library/random.rst Doc/library/subprocess.rst Lib/random.py Lib/test/test_itertools.py Message-ID: <20080731202146.8F02B1E4005@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 22:21:46 2008 New Revision: 65337 Log: Merged revisions 65259,65263,65296,65307,65321 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65259 | benjamin.peterson | 2008-07-27 10:22:14 -0500 (Sun, 27 Jul 2008) | 1 line clarify Popen argument ........ r65263 | andrew.kuchling | 2008-07-28 12:04:48 -0500 (Mon, 28 Jul 2008) | 1 line Clarify wording ........ r65296 | raymond.hettinger | 2008-07-30 02:27:30 -0500 (Wed, 30 Jul 2008) | 1 line Neaten-up the itertools recipes. ........ r65307 | benjamin.peterson | 2008-07-30 08:46:53 -0500 (Wed, 30 Jul 2008) | 1 line getrandombits is actually getrandbits ........ r65321 | raymond.hettinger | 2008-07-30 20:19:50 -0500 (Wed, 30 Jul 2008) | 4 lines Alter recipe to show how to call izip_longest() with both a keyword argument and star arguments. ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/itertools.rst python/branches/py3k/Doc/library/random.rst python/branches/py3k/Doc/library/subprocess.rst python/branches/py3k/Lib/random.py python/branches/py3k/Lib/test/test_itertools.py Modified: python/branches/py3k/Doc/library/itertools.rst ============================================================================== --- python/branches/py3k/Doc/library/itertools.rst (original) +++ python/branches/py3k/Doc/library/itertools.rst Thu Jul 31 22:21:46 2008 @@ -566,8 +566,7 @@ def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n - kwds = dict(fillvalue=fillvalue) - return zip_longest(*args, **kwds) + return zip_longest(fillvalue=fillvalue, *args) def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" Modified: python/branches/py3k/Doc/library/random.rst ============================================================================== --- python/branches/py3k/Doc/library/random.rst (original) +++ python/branches/py3k/Doc/library/random.rst Thu Jul 31 22:21:46 2008 @@ -33,7 +33,7 @@ Class :class:`Random` can also be subclassed if you want to use a different basic generator of your own devising: in that case, override the :meth:`random`, :meth:`seed`, :meth:`getstate`, and :meth:`setstate`. -Optionally, a new generator can supply a :meth:`getrandombits` method --- this +Optionally, a new generator can supply a :meth:`getrandbits` method --- this allows :meth:`randrange` to produce selections over an arbitrarily large range. Modified: python/branches/py3k/Doc/library/subprocess.rst ============================================================================== --- python/branches/py3k/Doc/library/subprocess.rst (original) +++ python/branches/py3k/Doc/library/subprocess.rst Thu Jul 31 22:21:46 2008 @@ -33,9 +33,10 @@ Arguments are: - *args* should be a string, or a sequence of program arguments. The program to - execute is normally the first item in the args sequence or string, but can be - explicitly set by using the executable argument. + *args* should be a string, or a sequence of program arguments. The program + to execute is normally the first item in the args sequence or the string if a + string is given, but can be explicitly set by using the *executable* + argument. On Unix, with *shell=False* (default): In this case, the Popen class uses :meth:`os.execvp` to execute the child program. *args* should normally be a Modified: python/branches/py3k/Lib/random.py ============================================================================== --- python/branches/py3k/Lib/random.py (original) +++ python/branches/py3k/Lib/random.py Thu Jul 31 22:21:46 2008 @@ -74,7 +74,7 @@ Class Random can also be subclassed if you want to use a different basic generator of your own devising: in that case, override the following methods: random(), seed(), getstate(), and setstate(). - Optionally, implement a getrandombits() method so that randrange() + Optionally, implement a getrandbits() method so that randrange() can cover arbitrarily large ranges. """ Modified: python/branches/py3k/Lib/test/test_itertools.py ============================================================================== --- python/branches/py3k/Lib/test/test_itertools.py (original) +++ python/branches/py3k/Lib/test/test_itertools.py Thu Jul 31 22:21:46 2008 @@ -1257,8 +1257,7 @@ >>> def grouper(n, iterable, fillvalue=None): ... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" ... args = [iter(iterable)] * n -... kwds = dict(fillvalue=fillvalue) -... return zip_longest(*args, **kwds) +... return zip_longest(fillvalue=fillvalue, *args) >>> def roundrobin(*iterables): ... "roundrobin('ABC', 'D', 'EF') --> A D E B F C" From python-3000-checkins at python.org Thu Jul 31 23:10:28 2008 From: python-3000-checkins at python.org (benjamin.peterson) Date: Thu, 31 Jul 2008 23:10:28 +0200 (CEST) Subject: [Python-3000-checkins] r65338 - in python/branches/py3k: Doc/library/stdtypes.rst Message-ID: <20080731211028.E04D01E4012@bag.python.org> Author: benjamin.peterson Date: Thu Jul 31 23:10:28 2008 New Revision: 65338 Log: Merged revisions 65293 via svnmerge from svn+ssh://pythondev at svn.python.org/python/trunk ........ r65293 | benjamin.peterson | 2008-07-29 14:28:49 -0500 (Tue, 29 Jul 2008) | 1 line the from __future__ import with_statement isn't needed in 2.6 ........ Modified: python/branches/py3k/ (props changed) python/branches/py3k/Doc/library/stdtypes.rst Modified: python/branches/py3k/Doc/library/stdtypes.rst ============================================================================== --- python/branches/py3k/Doc/library/stdtypes.rst (original) +++ python/branches/py3k/Doc/library/stdtypes.rst Thu Jul 31 23:10:28 2008 @@ -2009,7 +2009,7 @@ the :keyword:`with` statement. For example, the following code will automatically close *f* when the :keyword:`with` block is exited:: - from __future__ import with_statement + from __future__ import with_statement # This isn't required in Python 2.6 with open("hello.txt") as f: for line in f: